`

DI依赖注入_手动装配_注解基础

 
阅读更多

以下的注释不管在那种配置组件的方法中都能用,这里只是实际需要才这么放的

用bean定义来配置组件

首先需要在xml 文件中添加如下 spring-context-3.0.xsd 文件

<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-3.0.xsd"> 
</bean> 
<context:annotation-config /> <!--打开注解,注册处理器-->

这个配置隐式注册了多个对注释进行解析处理的处理器 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor, RequireAnnotationBeanPostProcessor

@Autowired 注释

    它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作(将bean的实例装到相应位置)
    @Autowired 根据 类型从spring 配置文件中进行查找,注册类型必须唯一,否则报异常。

    默认情况下它要求依赖对象必须存在,如果允许null,可以设置required属性为false

@Autowired(required = false) 
private ISoftPMService softPMService = new SoftPMServiceImpl(); 

   与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找

   将@Autowired 注释标注在成员变量上

import org.springframework.beans.factory.annotation.Autowired; 
public class Boss { 
	@Autowired 
	private Car car; 
	@Autowired 
	private Office office;
	… 
} 

    spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用

    必须事先在 Spring 容器中声明AutowiredAnnotationBeanPostProcessorBean。

<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 --> 
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

   这样,当Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描spring 容器中所有 Bean,

   当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的Bean,并注入到对应的地方中去。
   按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。

   所以对成员变量使用 @Autowired 后,大可将它们的 setter 方法删除。
   通过 @Autowired 对方法或构造函数进行标注

   将 @Autowired 注释标注在 Setter 方法上

public class Boss { 
	private Car car; 
	private Office office; 
	@Autowired 
	public void setCar(Car car) { 
		this.car = car; 
	} 
	@Autowired 
	public void setOffice(Office office) { 
		this.office = office; 
	} 
	… 
} 

   这时,@Autowired 将查找被标注的方法的入参类型的 Bean,并调用方法自动注入这些 Bean。
   将@Autowired 注释标注在构造函数上

public class Boss { 
	private Car car; 
	private Office office; 
	@Autowired 
	public Boss(Car car ,Office office){ 
		this.car = car; 
		this.office = office ; 
	} 
	… 
} 

   由于 Boss() 构造函数有两个入参,分别是 car 和 office,@Autowired 将分别寻找和它们类型匹配的 Bean,

   将它们作为 Boss(Car car ,Office office) 的入参来创建 Boss Bean

   实例:引用上一篇的实例

   在xml中配置

<bean id="dao" class="com.qh.daoImp.daoImp"></bean>
<bean id="serviceImp" class="com.qh.serviceImp.ServiceImp"></bean>

    ServiceImp.java

package com.qh.serviceImp;
import javax.annotation.Resource;
import com.qh.dao.Dao;
import com.qh.service.Service;

public class ServiceImp implements Service {
	@Autowired  //获取 Dao 字段,查找xml文件中的bean,找到 com.qh.daoImp.daoImp 这个类
	private Dao dao;
	private String name;
	
	public ServiceImp(){}

	public void say(){
		System.out.println(name);
		dao.add();
	}
} 

   注意:最好给ServiceImp类一个默认的构造方法

我们可以通过 @Qualifier 强制将 @Autowired  默认的查找方式改为 按照bean名称 查找

@Qualifier

   @Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、

   构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统一成一个注释类。

@Autowired @Qualifier("dao")

   @Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,

   @Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。

@Resource注释

   @Resource 默认按bean 的name 进行查找,如果没有找到,会按type 进行查找,此时与@Autowired 类似

   @Resource有一个name属性,可以根据name属性值查找对应的bean的id

在classpath自动扫描方式进行注解(解决用bean配置使文件过大问题)

原理:组件自动扫描机制,自动扫描类路径下标注了

      @Controller:标注控制层组件(如struts中的action)
      @Service:标注业务逻辑层组件
      @Component :泛指组件,当组件不好归类的时候,可以用这个标注(不推荐使用)
      @Repository:标注数据访问组件,即dao层

注释的类

首先需要在xml 文件中添加如下 spring-context-3.0.xsd 文件

<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-3.0.xsd"> 
</bean> 
<context:component-scan base-package="com.qh"/> <!--此配置注册了包括<context:annotation-config />在内的处理器-->

    base-package属性为需要扫描的包(包括子包)

然后在相应的层上标注即可

注意:bean 的ID 默认为类名称开头字母小写; 修改bean的名称:@Controller("cat")表示bean的名称为 cat

@Controller
   @Controller的基本目标是担任所注解的类的原型的角色,指明它的职责。
   Dispatcher将会在这样被注解的类中扫描映射的方法,探测注解@RequestMapping。
   所注解的控制器bean可以被显式定义,这个过程是在Dispatcher的上下文中使用标准的Spring bean定义完成的。
   然而,@Controller原型也允许自动探测。

@Service@Component@Repository和@Controller类似
@scope:bean的作用范围(prototype、单例等)
   例如:@Service @scop("prototype")
@PostConstruct(相当于 init-method方法)
   在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执行(注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。
@PreDestroy( 相当于 destroy-method 方法)
   在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。

分享到:
评论

相关推荐

    面试官常问的spring依赖注入和bean的装配问题.pdf

    在Spring框架中,依赖注入(Dependency Injection,DI)是一种设计模式,用于实现控制反转(Inversion of Control,IoC),降低组件之间的耦合度,使得各个组件的职责更加清晰。在Spring的面试中,面试官常会问到...

    “IOC容器与DI依赖注入示例”文章提及

    在Java世界中,Spring框架是应用最广泛的轻量级企业级开发框架,它的一大核心特性就是Inversion of Control(控制反转,简称IOC)和Dependency Injection(依赖注入,简称DI)。这两者是紧密相关的概念,有助于简化...

    SPRING DI注入例子

    Spring框架的Dependency Injection(DI,依赖注入)是其核心特性之一,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是硬编码这些依赖。这样可以提高代码的可测试性和可维护性,降低了组件之间的耦合度...

    spring依赖注入的实现原理

    Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中常用的设计模式,它极大地提高了代码的可测试性和可维护性。在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)...

    Spring_集合(List_Map_Set)_自动装配

    它强调的是依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),这使得开发者能够更加关注业务逻辑,而非基础设施代码。 二、集合自动装配的概念 集合自动装配是指Spring...

    springIOC控制反转 依赖注入实例

    在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些任务由IOC容器来处理,实现了从依赖管理到依赖注入的转变。 控制反转(IOC)意味着应用程序不再直接创建对象,而是将对象的...

    第3章 依赖注入的实现(IOC)1

    依赖注入(Dependency Injection,简称DI)是Spring框架的核心特性,它允许我们解耦应用程序的组件,使得代码更加灵活,易于测试和维护。依赖注入的概念主要分为两个方面:控制反转(Inversion of Control,简称IOC...

    自己的代码模拟spring的依赖注入

    在IT行业中,Spring框架是Java开发中的一个基石,尤其在控制反转(IoC)和依赖注入(DI)方面。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过IoC容器来实现DI,让我们...

    第五章 Spring4 自动装配、方法注入

    自动装配和方法注入是Spring实现依赖注入(Dependency Injection,DI)的两种主要方式。 首先,让我们理解什么是依赖注入。在面向对象编程中,对象通常会依赖于其他对象来完成其功能。传统的做法是通过构造函数或...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    `@Autowired`注解是Spring框架提供的一种依赖注入(Dependency Injection,DI)机制,用于自动装配Bean。它可以根据类型或名称来查找并注入所需的依赖。默认情况下,Spring会根据Bean的类型来匹配,如果存在多个相同...

    Spring demo 自动检测注解

    首先,`@Autowired`是Spring框架提供的一种依赖注入(DI,Dependency Injection)方式,用于自动装配bean的依赖。当我们在类的属性或方法上使用这个注解时,Spring会自动寻找匹配类型的bean并将其注入。这种方式比传统...

    Spring自动装配解析

    Spring框架是Java开发中广泛应用的一个轻量级容器,它的核心特性之一就是依赖注入(Dependency Injection,简称DI),而Spring的自动装配(Auto-Wiring)则是DI的一种实现方式。本篇文章将深入探讨Spring自动装配的...

    spring注解完整版[定义].pdf

    在Spring框架中,注解是实现Inversion of Control(IoC)或依赖注入(DI)的一种强大工具。Spring 2.5引入了@Autowired注解,它极大地简化了配置,允许开发者在不编写XML配置文件的情况下完成bean的自动装配。本文将...

    详解SpringBoot中实现依赖注入功能

    在Spring Boot框架中,依赖注入(Dependency Injection,简称DI)是一种关键的设计模式,它使得对象之间的依赖关系得以解耦,从而提高代码的可测试性和可维护性。Spring Boot通过注解简化了这一过程,让我们无需繁琐...

    spring IOC容器依赖注入XML配置

    Spring框架是Java开发中不可或缺的一部分,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,极大地简化了应用程序的复杂性。在本教程中,我们将深入探讨如何通过XML配置在...

    Spring 注解 方式配制的小demo

    Spring框架是Java开发中的一个核心工具,它通过提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能,极大地简化了企业级应用的开发工作。注解配置是Spring 2.5引入...

    Spring实现自动装配

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名,其中自动装配(Auto-Wiring)是DI的一种实现方式。自动装配允许开发者减少手动配置bean之间的依赖关系...

    pring之DI简介共13页.pdf.zip

    综上所述,"Spring之DI简介"涵盖了关于Spring框架依赖注入的基础理论和实践操作,对于理解和掌握Spring框架的使用具有重要意义。通过学习这个主题,开发者能够更好地理解如何在Spring中管理对象间的依赖关系,从而...

    有关Spring的注解

    #### 一、Spring框架中的依赖注入(DI)与注解 Spring框架作为Java开发领域内最受欢迎的企业级应用框架之一,其核心特性之一就是依赖注入(Dependency Injection, DI),而依赖注入的核心在于解耦合。在Spring中,...

    pring自动装配方式介绍共2页.pdf.zip

    在Spring框架中,自动装配(Auto Wiring)是一种简化依赖注入(Dependency Injection,简称DI)的方式,它可以帮助开发者减少显式配置Bean之间的依赖关系。本文将详细介绍Spring中的自动装配方式,帮助您更好地理解...

Global site tag (gtag.js) - Google Analytics