`

依赖注入实现方式

阅读更多

    注入依赖对象可以采用 手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

一、依赖注入——手工装配

手工装配依赖对象,在这种方式中又有两种编程方式
1.在xml配置文件中,通过在bean节点下配置,如

<bean id="orderService" class="com.reiyenKart.service.OrderServiceBean"
   <constructor-arg index="0" type="java.lang.String" value="xxx" /> //构造器注入
   <property name="name" value="xxlong" /> //属性setter方法进入
</bean>

  2.在java代码中使用@Autowire或@Resource等注解方式进行装配.注解方式的注入主要针对对象属性的注入。使用注解功能要引用注解包(注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar),另beans.xml的配置模板如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/context         

      http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config /><!-- 开启注解功能,这个配置隐式注册了多个对注释进行解析的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,

PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor

-->

</beans>----其中红色部分必须在命名空间中增加

优点:使用注解方式注入依赖对象可以防止spring的配置文件过于臃肿,同时可以有效的省去一些属性的setter方法,使代码变得更简洁。

在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。@Resource它是j2ee的注解,在jdk1.6中已包含它了;@Autowired,它属于spring特有的注解;所有推荐大家使用@Resource这个注解,如果使用@Autowired注解的话,会和Spring耦合在一起,为了降低程序间的耦合性@Resource更有优势。

2.1 Resource注解实例

public class UserServiceBean {
	@Resource(name = "userDaoImpl")
	private UserDao userDao;
	private UserDao userDao2;
	@Resource
	public void setUserDao2(UserDao userDao2) {
		this.userDao2 = userDao2;
	}
	public void test() {
		userDao.save();
		userDao2.save();
	}
}

 然后在bean.xml中的配置如下:

<bean id="userDaoImpl" class="com.reiyen.dao.impl.UserDaoImpl" />
<bean id="userServiceBean" class="com.reiyen.service.UserServiceBean" />

 简要说明:@Resouce注解可以在字段上标记,也可以在对应的setter方法上标记。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。此注解可以不使用name属性,它会自动去查找匹配的类型(先以字段名称为name的值查找,如找不到会再根据依赖对象的类型查找)。

注意: 如果没有指定name属性,并且按默认的名称仍然找不到依赖对象,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了,就应确保name的值在xml中有相应的bean Id对应。

2.2 Autowired注解实例

@Autowired
Private  UserDao  userDao ;//用于字段上
@Autowired
public void set UserDao( UserDao  userDao ){ //用于属性的setter方法上
        this.userDao =  userDao ;
}

 @Autowired 注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false.如下:

@Autowired(required=false)
private UserDao userDao;

 如果我们想使用按名称装配, 可以结合@Qualifier注解一起使用。如下:

@Autowired  @Qualifier("userDaoImplXXX")
private UserDao userDao;

 说明:@Autowired默认是按照类型来查找对应的bean实例注入,如果想注入指定名称的bean实例,可以使用@Qualifier注解来指定名字。Required属性设为true时,如果不能成功注入则会报告异常,如果设为false而不能成功注入,则会将userDao设为null。同样地,它也实用于setter方法。

 

二、依赖注入——自动装配依赖对象

自动装配(了解,不建议使用):除了要设置字段的setter方法外,还应在beans.xml配置文件中设置如下内容:

<bean id="userServiceBean2"
    class="com.reiyen.service.UserServiceBean2" autowire="byType"/>

 <bean id=”” class=”” autowire=”byType” />
除了byType外,autowire的可选属性如下:
byType: 按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将抛出异常。如果没有找到,即属性值为null.
byName: 按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null.
Constructor与byType的方式类似, 不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
Autodetect: 通过bean类的自省机制(introspction)来决定是使用constructor还是byType方式来进行自动装配。如果发现默认的构造器,那么将使用byType方式。

 

 

分享到:
评论

相关推荐

    spring学习:依赖注入的几种方式讨论

    本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件`sample-autoconfig`进行理解和实践。 一、XML配置的依赖注入 在Spring早期版本中,XML配置是最常见的DI方式。开发者在Spring的配置文件(如`...

    03_mvc和依赖注入部分实现_源码

    综上所述,这个源码项目可能是一个使用Spring MVC框架和依赖注入实现的Java Web应用,其中包含了多个模块,如购物相关的功能,并使用SiteMesh来统一页面布局。同时,通过测试类和反射API的应用,展示了项目在实际...

    .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...

    spring依赖注入的实现原理

    Spring的依赖注入实现了IoC,降低了组件间的耦合度,增强了系统的灵活性。通过XML、注解和编程式配置,开发者可以选择适合项目的方式来管理Bean和它们的依赖。同时,Spring的AOP代理和生命周期管理进一步丰富了框架...

    EFcore Repository 依赖注入方式实现数据库基本操作

    本篇文章将深入探讨如何使用EF Core结合依赖注入来实现数据库的基本操作。 1. **EF Core 简介** EF Core 提供了模型化数据库对象和SQL语句之间的桥梁,使得开发者可以使用面向对象的方式来处理数据库操作。它支持...

    依赖注入实现,及IOC容器Unity的小Demo

    在.NET开发中,Unity是一个常用的IOC(Inversion of Control,控制反转)容器,它可以帮助我们实现依赖注入。 首先,让我们了解依赖注入的三种主要方式: 1. 构造函数注入:这是最常见的注入方式,通过在类的构造...

    一个轻量级的PHP依赖注入框架

    本篇文章将深入探讨这个名为"iiDestiny依赖注入框架"的轻量级PHP实现。 首先,让我们理解依赖注入的基本概念。在面向对象编程中,一个类可能依赖于其他类来完成某些任务。传统的做法是直接在类内部创建或引用这些...

    详解Spring基于Annotation的依赖注入实现

    ### Spring基于注解的依赖注入实现 Spring框架充分利用了Java注解的功能,提供了多种注解来实现依赖注入。下面是一些常用的Spring注解及其用途: 1. **@Component**:这是最基础的组件注解,用于标记一个Java类...

    Spring依赖注入的方式

    总结,Spring的依赖注入提供了构造器注入、设值注入和接口注入三种方式,帮助开发者实现松耦合和高内聚的设计。根据项目需求和场景,选择合适的方式能有效提升代码质量。同时,结合源码阅读和使用工具,如IDEA的代码...

    依赖注入那些事儿

    小李通过这次讨论学习到了依赖注入的概念,意识到自己的实现方式虽然简单直接,但在扩展性和维护性方面有所欠缺。依赖注入可以帮助解决这些问题,使得代码更加灵活和易于管理。 #### 2. 探究依赖注入 ##### 2.1 ...

    c# 依赖注入 控制反转

    ### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...

    Spring 三种依赖注入方式.doc

    Spring 三种依赖注入方式 ...Spring 框架中提供了多种依赖注入方式,我们可以根据实际情况选择合适的依赖注入方式以实现依赖注入。同时,我们也需要了解 Spring 配置文件的基本内容,以便更好地使用 Spring 框架。

    C++ 依赖注入

    2. 构造函数注入:通过对象的构造函数传递依赖对象,这是最直接的依赖注入方式,有利于保持类的不变性,易于测试。 3. Set函数注入:通过对象的setter方法注入依赖对象,提供了一定程度上的灵活性,但可能引入空状态...

    AngularJS之依赖注入模拟实现

    首先需要了解依赖注入的基本概念,然后将通过模拟代码,逐步实现两种依赖注入方式:推断式注入声明和行内注入声明。 **推断式注入声明**是一种在函数参数中声明依赖的方式。在这种方式下,AngularJS会尝试分析函数...

    spring依赖注入底层详解

    在Spring中,依赖注入可以通过构造器注入、设值注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象来完成注入。这种方式在创建对象时就确保了所有依赖都已就绪,适合于对象的依赖关系...

    .Net or .Net Core依赖注入实现

    依赖注入(Dependency Injection,简称DI)是软件设计模式中的一种,它可以帮助我们构建松耦合、可测试且易于维护的应用程序。在.NET和.NET Core框架中,依赖注入被广泛使用,尤其是在.NET 6中,它已经成为核心功能...

    IoC 依赖注入 技术总结

    静态 IoC 的优点是实现简单、效率高,仅需要在客户端 XML 文件变更时,才实现类的生成、编译等工作,以后在运行期间直接调用 Class 文件即可,编译期已经实现依赖注入,具有编译期检查特点,占用较少的空间而赢得...

    用Roboguice实现依赖注入

    依赖注入的核心思想是解耦组件之间的依赖关系,使得组件之间通过接口进行通信,而不是通过硬编码的方式来创建和管理彼此的实例。这使得代码更易于测试,因为我们可以轻松地替换依赖项以进行模拟或伪造。 Roboguice...

Global site tag (gtag.js) - Google Analytics