首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring的bean流入的一些理解

2012-08-24 
Spring的bean注入的一些理解对于spring,刚刚学习的,所以有很多都不是很理解,大多数都是只知道要这样做,但

Spring的bean注入的一些理解
对于spring,刚刚学习的,所以有很多都不是很理解,大多数都是只知道要这样做,但是不知道为什么要这样做。
在测试dao层操作的时候,写了一个TestStudentServiceImpl类,field有个private 的 StudentServiceImpl类,需要用spring注入,StudentServiceImpl继承了BaseDaoSupport<Student>类和实现了IStudentService接口。
测试类的代码


运行的时候出现了下面的错误,于是查阅了一整的天资料,大概知道些spring在注入bean中好似使用了AOP框架产生代理,产生代理的方式有两种,第一种是实现了接口的类,会使用默认的jdk产生,该方式通过实现目标类的接口,产生一个aop代理类,该aop代理类可能封装了些事务处理,和目标类的方法,所以我们在拿出这个studentServiceImpl 这个bean的时候,其实是这个aop代理,当我们在测试类取出的时候,我们要求注入StudentServiceImpl类,aop代理却不是StudentServiceImpl类,只是和目标类实现了同样的IStudentService接口,所以我们在Test类中,应该使用接口来解决,即将在Test类要求注入的StudentServiceImpl,改为接口IStudentService.
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("/applicationContext.xml")@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })public class TestStudentService {private IStudentService studentServiceImpl;private SessionFactory sessionFactory;@Testpublic void testAddStudent(){Student stu = new Student();stu.setName("ligang");studentServiceImpl.save(stu);}@Transientpublic void testSessionFactory(){Student stu = new Student();stu.setName("yao");stu.setPassword("123456");Session sess =sessionFactory.openSession();sess.save(stu);}@Resource(name="studentServiceImpl")public void setStudentServiceImpl(IStudentService ssi){this.studentServiceImpl = ssi;}}

如果目标类没有实现任何接口,将采用第二种的产生代理的方法是CGLIB的字节码生成,该方式是通过产生目标类的子类,产生一个aop代理类,该类也封装了一些事务和目标类的方法,当我们取出的时候,其实也是aop代理类,只不过是目标类的子类。

热点排行