spring 依赖注入深究
2016-07-17 11:49
471 查看
1、@Autowired这个注解,可以直接注解在私有成员变量上而不用去写setter方法。
2、Spring
在进行自动注入的时候(在B类中注入A的引用),首先需要用注解@Repository(或@Service)把A类声明成Spring
bean,然后在B类中使用@Autowired注解把A的对象注入到B中。例如:
1)接口:
public interfaceBookmakerDao {
/**
*
*/
}
2)
接口实现类,并将该实现类声明成Spring bean:
@Repository
public classBookmakerDaoHibernate implements BookmakerDao {
/**
*
*/
}
3)依赖注入:
public classBookmakerDaoTest extends SpringTest {
@Autowired
//privateBookmakerDaoHibernate bookmakerDao; // 无法注入
private BookmakerDaobookmakerDao; // 成功注入
@Test
public void test() {
/**
*/
}
}
3、问题:为什么private BookmakerDaoHibernatebookmakerDao;
// 无法注入?
1)
Spring 在将声明的类创建成Spring bean时会进行一层代理,而动态代理的方式有两种:
使用jdk的代理:这时该类必须要实现一个接口;
使用cglib的代理:这时该类不需要实现接口;
2)上个例子中,由于类BookmakerDaoHibernate
实现了接口,所以Spring
看到@Repository后会优先使用jdk的代理来创建Spring
bean,这种代理模式生成的代理对象依赖于目标对象的接口(目标对象必须有上级接口才可以使用jdk动态代理)。Spring在运行时使用自动代理将BookmakerDaoHibernate对象放在了一个代理对象的内部,所以当我们以为可以byClass注入的时候,却发现在Spring容器中无法找到这个BookmakerDaoHibernate类型的bean了。故,需要用接口来接收,才能正确注入。
3)如果上例中BookmakerDaoHibernate
没有实现接口,Spring
看到@Repository后会有限使用cglib的代理来创建Spring
bean(项目中需要引入cglib库),这种代理模式生成的代理对象是目标对象的子类。故,可以被@Autowired根据父类名自动注入。
2、Spring
在进行自动注入的时候(在B类中注入A的引用),首先需要用注解@Repository(或@Service)把A类声明成Spring
bean,然后在B类中使用@Autowired注解把A的对象注入到B中。例如:
1)接口:
public interfaceBookmakerDao {
/**
*
*/
}
2)
接口实现类,并将该实现类声明成Spring bean:
@Repository
public classBookmakerDaoHibernate implements BookmakerDao {
/**
*
*/
}
3)依赖注入:
public classBookmakerDaoTest extends SpringTest {
@Autowired
//privateBookmakerDaoHibernate bookmakerDao; // 无法注入
private BookmakerDaobookmakerDao; // 成功注入
@Test
public void test() {
/**
*/
}
}
3、问题:为什么private BookmakerDaoHibernatebookmakerDao;
// 无法注入?
1)
Spring 在将声明的类创建成Spring bean时会进行一层代理,而动态代理的方式有两种:
使用jdk的代理:这时该类必须要实现一个接口;
使用cglib的代理:这时该类不需要实现接口;
2)上个例子中,由于类BookmakerDaoHibernate
实现了接口,所以Spring
看到@Repository后会优先使用jdk的代理来创建Spring
bean,这种代理模式生成的代理对象依赖于目标对象的接口(目标对象必须有上级接口才可以使用jdk动态代理)。Spring在运行时使用自动代理将BookmakerDaoHibernate对象放在了一个代理对象的内部,所以当我们以为可以byClass注入的时候,却发现在Spring容器中无法找到这个BookmakerDaoHibernate类型的bean了。故,需要用接口来接收,才能正确注入。
3)如果上例中BookmakerDaoHibernate
没有实现接口,Spring
看到@Repository后会有限使用cglib的代理来创建Spring
bean(项目中需要引入cglib库),这种代理模式生成的代理对象是目标对象的子类。故,可以被@Autowired根据父类名自动注入。
相关文章推荐
- Spring IOC学习心得之注册bean的依赖关系
- struts2进阶篇(5)
- 处理org.springframework.beans.factory.BeanCreationException: Error creating bean with name
- struts2中耦合servlet API
- JAVA之NIO按行读写大文件,完美解决中文乱码问题
- Java 多态的详解
- java 逻辑运算符
- java web笔记——JDBC
- eclipse 用maven创建javaWeb项目
- java synchronized详解
- java .net compartion
- eclipse和myeclipse设置默认编码格式
- [2]一切都是对象
- JavaEE中表现层、持久层、业务层的职责分析(转载)
- What are the main disadvantages of Java Server Faces 2.0?
- 结合反射,获取泛型对象的类成员变量的值
- javaweb
- java容器学习总结(一)
- Java的文件导入导出实现
- javaweb