一 依赖注入的3种方式
1.set注入
class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
配置文件
<bean name="userService " class="UserService">
<!依赖注入,配置当前类中相应的属性-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="UserDao"></bean>
2.构造器注入
class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
<bean name="userService " class="UserService">
<constructor-arg ref="userDao"></constructor-arg>
</bean>
<bean id="userDao" class="UserDao"></bean>
3.注解注入
class UserService {
@Autowire
private UserDao userDao;
}
<bean name="userService " class="UserService"></bean>
<bean id="userDao" class="UserDao"></bean>
也可以不用配置<bean></bean>,用以下四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:
- @Component:可以用于注册所有bean
- @Repository:主要用于注册dao层的bean
- @Controller:主要用于注册控制层的bean
- @Service:主要用于注册服务层的bean
- @Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。
@Resource
@Qualifier("userDaoMyBatis")
private UserDao userDao;
- @Autowired:spring注解,默认以byType的方式去匹配与属性名相同的bean的id
@Autowired
private UserDao userDao;
二 循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环。
构造器循环依赖:表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛BeanCurrentlyInCreationException异常表示循环依赖。
setter循环依赖:表示通过setter注入方式构成的循环依赖。对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的Bean来完成的,而且只能解决单例作用域的Bean循环依赖。
为了避免循环依赖最好用什么注入(接口注入)
转载:https://jinnianshilongnian.iteye.com/blog/1415278
三 构造函数注入能不能和设值注入一块用?
不能,有优先级问题。
使用构造函数依赖注入时,Spring保证一个对象所有依赖的对象先实例化后,才实例化这个对象。使用set方法依赖注入时,Spring首先实例化对象,然后才实例化所有依赖的对象。
四 BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
- 提供了支持国际化的文本消息
- 统一的资源文件读取方式
- 已在监听器中注册的bean的事件