Spring中Xml配置Bean的依赖注入源码分析

     上一篇 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的属性值做处理。

猜你喜欢

转载自blog.csdn.net/bawcwchen/article/details/79775861