本文共 2801 字,大约阅读时间需要 9 分钟。
Dependency Injection依赖注入的几种实现类型
Type1 接口注入Type2 构造子注入Type3 设值注入几种依赖注入模式的对比总结Spring Bean封装机制
Bean WrapperBean FactoryApplicationContext Web Context[@more@]Component组件 IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。依赖注入机制减轻了组件之间的依赖关系,同时也大大提高了组件的可移植性,这意味着,组件得到重用的机会将会更多。依赖注入的几种实现类型Type1 接口注入常借助接口来将调用者与实现者分离。如:public class ClassA{ private InterfaceB clzB; public init() { Ojbect obj = Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; }}Type2 构造子注入通过构造函数完成依赖关系的设定public class DIByConstructor{ private final DataSource dataSource; private final String message;
public DIByConstructor(DataSource ds, String msg)
{ this.dataSource = ds; this.message = msg; }}Type3 设值注入即通过类的setter方法完成依赖关系的设置。几种依赖注入模式的对比总结
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。Type2和Type3的依赖注入实现模式均具备无侵入性的特点。在笔者看来,这两种实现方式各有特点,也各具优势(一句经典废话)。Spring Bean 封装机制----Bean Wrapper Bean Factory
为了实现无侵入性的目标。Spring 大量引入了Java 的Reflection机制,通过动态调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入机制的实现基础。 org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper和BeanFactory类。如果动态设置一个对象属性,可以借助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;如何通过Spring BeanWrapper操作一个JavaBean: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")); Bean Factory,顾名思义,负责创建并维护Bean实例。Bean Factory负责根据配置文件创建Bean实例,可以配置的项目有:1.Bean属性值及依赖关系(对其他Bean的引用)2.Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)3.Bean初始化和销毁方法4.Bean的依赖关系Spring Bean Configuration Sampleid="TheAction" ⑴class="net.xiaxin.spring.qs.UpperAction" ⑵singleton="true" ⑶init-method="init" ⑷destroy-method="cleanup" ⑸depends-on="ActionManager" ⑹>HeLLo ⑺ ⑻class="org.springframework.jndi.JndiObjectFactoryBean">java:comp/env/jdbc/sample InputStream is = new FileInputStream("bean.xml");XmlBeanFactory factory = new XmlBeanFactory(is);Action action = (Action) factory.getBean("TheAction");ApplicationContext
BeanFactory提供了针对Java Bean的管理功能,而ApplicationContext提供了一个更为框架化的实现 ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性。此外,ApplicationContext为与现有应用框架相整合,提供了更为开放式的实现如对于Web应用,我们可以在web.xml中对ApplicationContext进行配置.Web Context
ApplicationContext通过编码加载。对于Web应用,Spring提供了可配置的ApplicationContext加载机制。加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet。这两者在功能上完全等同,只是一个是基于Servlet2.3版本中新引入的Listener接口实现,而另一个基于Servlet接口实现。来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/219138/viewspace-914323/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/219138/viewspace-914323/