【Java企业级开发】(七)Spring框架
一、初识Spring
Spring介绍
(1)对比以往项目,Spring优势有哪些:方便解耦,简化开发;AOP切面编程;声明式事务;整合各种优秀的框架;
(2)发明者:Rod Johnson(罗宾·约翰逊 )—Java世界的传奇大师,神级人物;Spring FrameWork的缔造者;旷世奇书“葵花宝典”《Expert one on one J2EE Design and Development》作者;Servlet2.4和JDO2.0的规范专家;Java Development Community杰出人物。
(3)不重复造轮子;
(4)使用Spring所需jar包
(5)Spring官网:
Spring | HomeLevel up your Java code and explore what Spring can do for you.https://spring.io/1.2 Spring的模块
二、Spring IOC/DI
Spring IOC/DI介绍
IOC(Inversion of Control)中文名称:控制反转,也被称为)DI(dependency injection);依赖注入。注意:属于同一件事情的两个名称。
创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转。
由于控制反转改建比较含糊,所以在2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,想对于IoC而言,“依赖注入”明确描述了“被注入对象依赖IoC容器来配置依赖对象”,DI(中文名为依赖注入)是IoC的别名。
三、创建第一个Spring项目
3.1 创建项目,添加依赖
创建普通Maven项目,在项目的pom.xml中添加Spring项目的最基础依赖。
Spring项目想要运行起来必须包含:
- spring-context.jar - 它依赖了下面的四个jar
- spring-core.jar - 它依赖了spring-jcl.jar
- spring-jcl.jar
- spring-aop.jar
- spring-expression.jar
- spring-bean.jar
- spring-core.jar - 它依赖了spring-jcl.jar
所以在Maven中想要使用Spring框架只需要在项目中导入spring-context就可以了,其他的jar包根据Maven依赖传递性都可以导入进来。
pom.xml
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.9</version></dependency>
</dependencies>
3.2 创建一个类
3.3 创建Spring配置文件
要去Spring官网找到xml配置文件的文档头和约束部分
Container Overview :: Spring Framework
https://docs.spring.io/spring-framework/reference/core/beans/basics.html
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象--><bean id="b" class="com.spring.pojo.Book"></bean>
</beans>
3.4 创建测试类
package com.study.test;import com.spring.pojo.Book;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {// 创建Spring容器:ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取对象Book book = (Book)context.getBean("b");// 打印对象的信息System.out.println(book.getName() + " ---- " + book.getId());}
}
四、属性注入
4.1 属性注入方式
以前不适用Spring的时候有两种属性注入方式
4.2 属性注入-设值注入
直接在applicationContext.xml中设置属性的值
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象--><bean id="b" class="com.spring.pojo.Book"><!--设值注入--><property name="id" value="1"></property><property name="name" value="小张学Java"></property></bean>
</beans>
4.3 属性注入-构造注入
构造注入:这里的name要和有参构造器的参数一致4.4
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象--><bean id="b" class="com.spring.pojo.Book"><!--构造注入:这里的name要和有参构造器的参数一致--><constructor-arg name="id" value="2"></constructor-arg><constructor-arg name="name" value="小张学Java"></constructor-arg></bean>
</beans>
4.4 属性注入-引用数据类型
(1)创建两个对象:Girl和Boy,Girl中有Boy对象以及他的getter和setter方法(模拟复杂数据类型)
(2)创建applicationContext.xml配置文件,并进行传参
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--①先构建boy对象--><bean id="boy" class="com.spring.pojo.Boy"><property name="age" value="22"></property><property name="name" value="小帅"></property></bean><!--②传参--><bean id="girl" class="com.spring.pojo.Girl"><property name="age" value="19"></property><property name="name" value="露露"></property><property name="boyFriend" ref="boy"></property></bean>
</beans>
(3)创建测试类,验证传参
package com.study.test;import com.spring.pojo.Girl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test3 {public static void main(String[] args) {// 创建Spring容器:ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取对象Girl g = (Girl)context.getBean("girl");System.out.println("女孩名字:"+g.getName()+",女孩男朋友的名字是"+g.getBoyFriend().getName());}
}
五、注解
5.1 什么是注解
注解其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充详细。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
5.2 注解的使用
使用注解时要在其前面增加@符号,并把该注解当成一个修饰符使用。用于修饰他支持的程序元素(包、类、构造器、方法、成员变量、参数、局部变量的声明)。
5.3 注解的重要性
在JavaSE中,注解的使用比较简单,例如标记过时的功能,忽略警告等。在JavaEE/AeIdroid中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。未来的开发模式都是基于注解的。一定程度上可以说:框架=注解+反射+设计模式。
5.4 Ioc/DI相关的注解
注解名称 | 解释 | |
---|---|---|
这几个注解的用法跟@Component用法基本一样,只是用的地方不同 | @Component | 实例化Bean,默认名称为类名首字母变小写。无需指定setter方法 |
@Repository | 作用和@Component一样,用在持久层 | |
@Service | 作用和@Component一样,用在业务层 | |
@Controller | 作用和@Component一样,用在控制器层 | |
@Configuration | 作用和@Component一样,用在配置类上 | |
@Autowired | 自动注入。默认byType,如果多个同类型bean,使用byName | |
@Value | 给普通数据类型属性赋值 |
前五个注解作用一样,之所有搞出这么多,就是在语义上进行区分,放入不同层用不同的注解(@Component可以放在任何层级),但是作用都是创建对象。
5.5 @Component的使用
(1)在要创建对象的类中加入@Component注解,对象名称默认为:类名首字母变小写
(2)注解在哪个包下?要想找到这些注解,需要奖注解所在的包进行扫描:设置需要扫描的包。并且在applicationContext.xml中添加context命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.spring.pojo"></context:component-scan>
</beans>
(3)获取对象示例
package com.study.test;import com.spring.pojo.Girl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test3 {public static void main(String[] args) {// 创建Spring容器:ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取对象Girl g = (Girl)context.getBean("girl");System.out.println("女孩名字:"+g.getName()+",女孩男朋友的名字是"+g.getBoyFriend());}
}
// 这里只是获取到了构建的对象,对象中属性的值并没有注入,所以拿到的都是默认值
5.6 通过注解给对象属性赋值
(1)@Value的使用
给普通数据类型赋值的注解,普通数据类型包括:八种基本数据类型+String
- 基本数据类型:6种数字类型(byte/short/int/long/float/double)、1种字符型(char)、1种布尔型(boolean)
(2)@Autowired的使用
添加@Autowired注解后会把容器中的对象自动注入进来,并且不需要依赖set方法。

