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;}}