1. Spring IOC的使用
1.1 使用流程
声明组件
组件扫描和组件注册
组件注入
1.2 按照实现方式分为两类:
注解(如@Autowired)
配置文件(如xml)
1.3 四种依赖注入方式
Setter方法注入
构造器注入
静态工厂的方法注入
实例工厂的方法注入
2. 不同实现方式的使用
XML驱动的IoC容器使用的是ClassPathXmlApplicationContext读取xml内bean信息
注解驱动的IoC容器使用的是AnnotationConfigApplicationContext读取Java类中的bean信息
2.1 声明组件
2.1.1 @Bean与@Configuration配置使用
@Bean作用在方法上
@Configuration
public class DemoConfiguration {
@Bean
public Person person() {
return new Person();
}
}
复制
2.1.2 xml配置bean
<bean id="person" class="com.jyp.bean.Person"></bean>
复制
2.1.3 @Component、@Controller、@service、@Repository
都作用在类上
@Component注解,泛指组件,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。
Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行注解。它们底层也是通过@Component实现的
@Repository 用于对DAO实现类进行注解。
@Service 用于对业务层注解
@Constroller用于对控制层注解
2.2 组件扫描与组件注册
2.2.1 注解@ComponentScan或XML配置的context:omponent-scan标签
主要用来扫描带有@Component注解的类
也可以扫描@Controller、@service、@Repository、@Configuration,原因是这些注解底层也是通过@Component注解实现的
注意:
如果不指定扫描路径, 则默认扫描本类所在包及所有子包下带有@Component的组件
@ComponentScan("com.jyp.bean")
复制
<context:component-scan base-package="com.jyp.bean"/>
复制
2.2.2 @ImportResource并声明配置文件的路径
需在配置类上标注 @ImportResource 并声明配置文件的路径
主要指定扫描xml方式配置的Bean
@Configuration
@ImportResource("classpath:annotation/demo-beans.xml")
public class ImportXmlAnnotationConfiguration {
}
复制
2.3 组件注入
2.3.1 Setter方法注入
setter注入是使用最广泛的注入机制,也是最简单的IOC机制之一
可以在没有依赖项的情况下创建对象,然后可以通过调用setter来提供依赖项。
在各种情况下都很有用
2.3.1.1 注解注入:
@Autowired
@Autowired是由spring提供
可以对成员变量、方法以及构造函数进行注释
默认是按照类型装配注入的,如果想按照名称来注入,则需要结合@Qualifier一起使用,@Qualifier("XXX") 中的 XX是 Bean 的名称
每个类可以有很多个构造器,但是在使用@Autowired的时候,有且只能有一个构造器能够被标记为required=true(注:required的默认值为false)
@Resource
@Resource注解由J2EE提供
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
注意:
id默认是类的名字(首字母小写),如果在添加@Component到类上的时候,指定了@Component的名称,就必须用指定的名称
2.3.1.2 配置文件注入
public class UserService {
private UserDao userDao;
public void login() {
userDao.login();
}
}
复制
<bean name="userService" class="com.jyp.service.UserService">
<property name="userDao" ref="userDao" >
</bean>
<bean name="userDao" class="com.jyp.dao.UserDao"></bean>
复制
2.3.2 构造方法注入
特点:
组件声明一个或一组构造函数,并将其依赖项作为参数。
在组件实例化时由IOC容器将依赖项传递给组件。
使用构造函数注入的一个显而易见的结果是:如果没有依赖项,就不能创建对象;因此必须有依赖项。
注意:
使用组件之前必须拥有一个依赖类的实例
构造函数注入有助于实现不可变对象的使用。
2.3.2.1 注解注入:
@Autowired、@Resource
2.3.2.2 配置文件注入
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void login() {
userDao.login();
}
}
复制
<bean name="userService" class="com.obob.service.UserService">
<constructor-arg index="0" ref="userDao"></constructor-arg>
</bean>
<bean name="userDao" class="com.obob.dao.UserDao"></bean>
复制
2.3.3 总结
除了这两种常用的注入方式,还有其他的注入方式,如:静态工厂的方法注入、 实例工厂的方法注入,可以参考:https://blog.csdn.net/zhaohong_bo/article/details/89916494