spring依赖注入的实现原理
Spring 从核心而言,是一个DI 容器,其设计哲学是提供一种无侵入式的高扩展性框架。即无需代
码中涉及Spring专有类,即可将其纳入Spring容器进行管理。
作为对比,EJB则是一种高度侵入性的框架规范,它制定了众多的接口和编码规范,要求实现者必须
遵从。侵入性的后果就是,一旦系统基于侵入性框架设计开发,那么之后任何脱离这个框架的企图都将付
出极大的代价。
为了避免这种情况,实现无侵入性的目标。Spring 大量引入了Java 的Reflection机制,通过动态
调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入
机制的实现基础。
org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper
和BeanFactory类。这两个类从技术角度而言并不复杂,但对于Spring 框架而言,却是关键所在。
Bean Wrapper
从Quick Start的例子中可以看到,所谓依赖注入,即在运行期由容器将依赖关系注入到组件之中。
讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法进
行设定。
我们知道,如果动态设置一个对象属性,可以借助Java的Reflection机制完成:
Class cls = Class.forName("net.xiaxin.beans.User");Method mtd = cls.getMethod("setName",new Class[]{String.class});Object obj = (Object)cls.newInstance();mtd.invoke(obj,new Object[]{"Erica"});return obj;Object obj = Class.forName("net.xiaxin.beans.User").newInstance();BeanWrapper bw = new BeanWrapperImpl(obj);bw.setPropertyValue("name", "Erica");System.out.println("User name=>"+bw.getPropertyValue("name"));<beans><description>Spring Bean Configuration Sample</description><beanid="TheAction" ⑴⑵singleton="true" ⑶init-method="init" ⑷destroy-method="cleanup" ⑸depends-on="ActionManager" ⑹><property name="message"><value>HeLLo</value> ⑺</property><property name="desc"><null/></property><property name="dataSource"><ref local="dataSource"/> ⑻</property></bean><bean id="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName"><value>java:comp/env/jdbc/sample</value></property></bean></beans>