上一篇 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:
扫描二维码关注公众号,回复:
864315 查看本文章
bean属性的依赖注入:
属性注入:
注意看,上面缓存中的单例只有5个,下面会变成6个。
XML方式实现bean的实例化和依赖注入主要是通过BeanWrapperImpl.setPropertyValue方法,调用PropertyDescriptor中提供的getWriteMethod(也就是我们在java类中定义的Setter方法)利用反射机制来注入。
依赖注入主要涉及到的类:
AbstractAutowireCapableBeanFactory:bean属性自动装配工厂。
BeanWrapperImpl:Bean实例的封装对象,对实例做相关操作,比如:设置bean的属性值。
SimpleInstantiationStrategy:实例化bean的策略,通过反射来实例化。
CglibSubclassingInstantiationStrategy:实例化bean的策略,通过cglib代理来实例化。
TypeConverterDelegate,AbstractPropertyAccessor:对bean的属性值做处理。