Spring的get方法
Spring配置非自定义的bean
配置第三方功能类中的bean,要考虑两个问题:
1、被配置的Bean的实例化方式是什么?无参构造,有参构造,静态工厂方式还是实例工厂方式
2、被配置的Bean是否需要注入必要属性
例1:配置Druid数据源交由Spring管理
阅读Druid源码发现,Druid提供了无参构造器,我们可以使用无参构造的方式配置Bean,注入四个必须的简单类型信息,注意property的name属性必须与Druid的源码中的setter方法名对应。
例2:配置Connection交由Spring管理
Class和DriverManager都是工厂,forName和getConnection分别是这两个工厂的静态方法
class属性指定工厂的全限路径名,factory-method指定静态方法名,id为beanId,constructor-arg子标签为执行静态方法注入必须的参数。
例3:配置日期对象交由Spring管理
首先,配置SimpleDateFormat工厂为bean,然后配置Date实例对象由工厂的parse方法得到。
例4:配置MyBatis的SqlSessionFactory交由Spring管理
首先,InputStream的实例不由new InputStream得到,所以它是静态工厂方法得到;第二,SqlSessionFactoryBuilder通过自己的无参构造器得到,所以它是无参构造实例化;第三,SqlSessionFactory的实例通过实例化的SqlSessionFactoryBuilder的build方法得到,所以它是实例工厂方法得到。
Bean实例化的基本流程
Spring容器在进行初始化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合(由BeanFactory维护)中去,Spring框架在对该Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储在一个名为singletonObjects的Map集合中,当调用getBean方法时则最终从该Map集合中取出Bean实例对象返回。
tips:BeanDefinition对象不维护真正的实例,而是在维护<bean>这个标签本身的信息,beanDefinitionMap也就是一个维护<bean>标签信息的Map集合,真正反射创建实例对象还得看Spring去便利beanDefinitionMap。
总结 :