上一篇IOC容器从BeanFactory获取Bean源码浅析中,实例化bean到IOC容器中,是通过默认无参构造器来实例化的,没有涉及到Bean的依赖注入问题。现补上。
bean依赖注入过程,首先实例化,可以通过构造器实例化,也可以通过cblib代理实例化。然后解析属性值,如果是基本类型,则不需要解析,如果是对象的引用类型,则要实例化该属性的引用对象。最后通过反射机制对对象属性赋值,完成bean的依赖注入。
Demo:
public class BeanExample {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
StudentService studentService = (StudentService) applicationContext.getBean("studentService");
studentService.hello();
}
} <bean id="userService" class="com.hand.user.dal.UserServiceImpl" scope="prototype"/> <!--指定实例化类型为原型-->
<bean id="studentService" class="com.hand.user.dal.StudentServiceImpl">
<property name="userService" ref="userService"></property>
</bean><!--默认是单例-->这里是通过xml配置的bean,调用的是Setter方法来注入的,注解方式注入应该类似。 public class StudentServiceImpl implements StudentService {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public void hello() {
userService.hello("haha");
}
}




实例化bean:




bean属性的依赖注入:




属性注入:






注意看,上面缓存中的单例只有5个,下面会变成6个。


XML方式实现bean的实例化和依赖注入主要是通过BeanWrapperImpl.setPropertyValue方法,调用PropertyDescriptor中提供的getWriteMethod(也就是我们在java类中定义的Setter方法)利用反射机制来注入。

依赖注入主要涉及到的类:
AbstractAutowireCapableBeanFactory:bean属性自动装配工厂。
BeanWrapperImpl:Bean实例的封装对象,对实例做相关操作,比如:设置bean的属性值。
SimpleInstantiationStrategy:实例化bean的策略,通过反射来实例化。
CglibSubclassingInstantiationStrategy:实例化bean的策略,通过cglib代理来实例化。
TypeConverterDelegate,AbstractPropertyAccessor:对bean的属性值做处理。
版权声明:本文为bawcwchen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。