Type1 接口注入
我们常常借助接口来将调用者与实现者分离。如:
public class ClassA {
private InterfaceB clzB;
public init() {
Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
}
……
}
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB.
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
Apache Avalon是一个典型的Type1型IOC容器。
Type2 构造子注入
构造子注入,即通过构造函数完成依赖关系的设定,如:
public class DIByConstructor {
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds, String msg) {
this.dataSource = ds;
this.message = msg;
}
……
}
可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。
PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。
Type3 设值注入
在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的影响)。
在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典型的设置注入,即通过类的setter方法完成依赖关系的设置。
SpringFrameWork Developer’s Guide Version 0.6
September 2, 2004 So many open source projects. Why not Open your Documents?
几种依赖注入模式的对比总结
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Type2和Type3的依赖注入实现模式均具备无侵入性的特点。在笔者看来,这两种实现方式各有特点,也各具优势(一句经典废话?)。
Type2 构造子注入的优势:
1. “在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type2无疑是最好的响应者。
我的理解:就是你要通过一种方式来保证对象的引用完整性,type2选择了构造器的方式来实现。
2. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读。
分享到:
相关推荐
接口注入在Spring中较少使用,主要是通过实现特定的接口,由Spring提供实现该接口的方法来注入依赖。这种方式对类的侵入性较大,但可以避免使用setter方法。在实际应用中,更多地会采用构造器注入和设值注入。 ...
《深入解析Spring JdbcTemplate》 Spring JDBC Template是Spring框架中...这个实例工程为我们提供了一个学习和实践Spring JdbcTemplate的良好平台,通过对其中代码的分析和运行,可以更好地理解和掌握其用法和精髓。
Spring框架的依赖注入(Dependency Injection,简称DI)...通过阅读和分析这些代码,你可以更深入地理解Spring的依赖注入机制。在实际开发中,你可以根据需求调整配置,如添加数据库连接池、使用不同的数据访问技术等。
3. **接口注入**:较少使用,通过实现特定接口来注入依赖,但Spring并不直接支持,通常需要自定义实现。 **Spring的配置方式** Spring提供了多种配置方式: 1. **XML配置**:传统的Spring配置方式,通过`<bean>`...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本篇将详细讲解如何使用构造器注入作为Spring依赖注入的一种方式,...
3. **接口注入**:Spring提供了一个`ApplicationContextAware`接口,实现了这个接口的类可以获取到Spring容器自身,从而获取到其他bean。 三、Spring依赖注入的实现原理 Spring依赖注入的实现主要基于反射和代理...
在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...
本篇学习笔记将深入剖析Spring依赖注入的原理,通过源码分析帮助我们理解这一核心机制。 首先,依赖注入允许我们解耦组件之间的关系,使得各个组件可以独立地进行开发、测试和维护。在Spring中,DI主要通过两种方式...
Spring.NET是中国开源社区基于.NET Framework开发的一个轻量级企业级应用框架,它是对Java...通过分析和运行这些示例,你可以更好地理解Spring.NET如何在实际项目中工作,以及如何利用其特性来构建健壮的.NET应用程序。
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们...这个过程涉及到的源码分析和工具使用,对于理解两者的交互和提升开发技能都非常有帮助。在实际项目中,这样的整合能够显著提高开发效率,降低维护成本。
通过这两个zip文件,开发者可以进一步学习和理解如何在实际项目中搭建Spring+Dubbo的环境,实现服务的发布、订阅和调用。通过实践,掌握如何配置服务元数据、如何编写服务接口和实现、如何设置服务消费者等关键步骤...
实例中,你可以学习如何利用Spring Data JPA实现CRUD操作,以及使用Repository接口进行查询。 7. **Spring Security** Spring Security是强大的安全框架,用于保护Spring应用。实例将展示如何配置Spring Security...
4. **源码分析**:博客文章中可能包含具体的代码示例,展示如何在Spring配置文件中定义XFire服务,以及如何在Java代码中实现服务接口。通过阅读这些源码,读者可以理解Web服务在Spring中的实现方式。 5. **迁移至...
四、实例分析 "spring_example"项目正是一个将Spring2与Hibernate3整合的实际案例,它可能包含了相关的配置文件、实体类、DAO和Service的实现。通过这个实例,我们可以看到如何在实际项目中应用上述理论,从而更好...
**Spring Boot 实例分析** `spring-boot-demo` 示例项目可能包含了以下内容: 1. **主程序**:`src/main/java/com/example/DemoApplication.java`,这是一个简单的 Spring Boot 应用启动类,包含 `@SpringBoot...
在Spring中,当目标类不支持接口(即不能使用Java的动态代理)时,CGLIB就会被用来创建代理对象,实现对目标类的方法拦截。CGLIB通过字节码技术生成子类并在运行时增强目标类的功能,这对于AOP代理和Mock测试非常...
通过深入阅读和分析Spring源码,不仅可以提升我们的技术能力,还能培养我们对软件设计原则和模式的理解,为成为一名更优秀的开发者奠定基础。Tom老师的这份资料无疑是一份宝贵的资源,它将引导我们逐步揭开Spring的...
通过下载并研究这些源码,你可以更深入地理解接口注入的工作原理以及如何在实际项目中应用。博主选择提供源码,旨在帮助读者通过实践来学习和掌握这一技术。 标签中的“源码”意味着这篇博客提供了可执行的代码,...
4. **整合配置**:设置Struts2、Spring和Hibernate的整合,包括Struts2的插件配置,Spring对Hibernate SessionFactory的管理,以及如何在Action中注入Service和DAO。 5. **事务管理**:探讨Spring如何通过AOP进行...
Spring源码分析不仅仅是对具体实现的探究,更是对设计模式和软件工程原则的深入理解。通过对Spring源码的学习,开发者可以提升自己的设计能力,更好地理解和应用这些模式于实际项目中,提高代码质量和可维护性。因此...