`

Spring IOC 常用注解

 
阅读更多

注解实现Bean配置主要用来进行如依赖注入、生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数据
注册注解处理器

 方式一:bean

 

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

 • 方式二: 命名空间<context:annotation-config />

 

 

<context:annotationconfig /> 

 将隐式地向Spring 容器注册AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor 、 PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 这4 个BeanPostProcessor 。

 

 

 方式三: 命名空间<context:component-scan />

如果要使注解工作,则必须配置component-scan ,实际上不需要再配置annotation-config。

 

<context:component-scan base-package="com.spring.ioc5">
  <!-- 
             annotation 通过注解来过滤          org.example.SomeAnnotation  
             assignable 通过指定名称过滤        org.example.SomeClass
             regex      通过正则表达式过滤      org\.example\.Default.*
             aspectj    通过aspectj表达式过滤  org.example..*Service+
   -->
    <context:include-filter type="regex" expression="com.spring.ioc5.*"/>
    <context:exclude-filter type="annotation" expression="org.springframework.beans.factory.annotation.Autowired"/>
</context:component-scan>

 • Spring 支持以下4 种类型的过滤方式:

 

     • 注解 org.example.SomeAnnotation 将所有使用SomeAnnotation 注解的类过滤出来

     • 类名指定 org.example.SomeClass 过滤指定的类

     • 正则表达式 com.kedacom.spring.annotation.web..* 通过正则表达式过滤一些类

     • AspectJ 表达式 org.example..*Service+ 通过AspectJ 表达式过滤一些类

 

Spring3的基于注解实现Bean依赖注入支持如下三种注解:

  • Spring自带依赖注入注解: Spring自带的一套依赖注入注解;
  • JSR-250注解:Java平台的公共注解,是Java EE 5规范之一,在JDK6中默认包含这些注解,从Spring2.5开始支持。
  • JSR-330注解:Java 依赖注入标准,Java EE 6规范之一,可能在加入到未来JDK版本,从Spring3开始支持;
  • JPA注解:用于注入持久化上下文和尸体管理器。

@Required

 

@required              
public  setName(String name){}

 @ required 负责检查一个bean在初始化时其声明的 set方法是否被执行, 当某个被标注了 @Required 的 Setter 方法没有被调用,则 Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。 @Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。

 

 

@Autowired 采用byType的方式 

 

@Autowired
private ISoftPMService softPMService;

 @Autowired(required=false)

    构造器、字段、方法

 

 @Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl();
       @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。
       @Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。

 

@Qualifier 和@AutoWired联合使用,自动装配的策略就变成byName

 

 

使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier("beanName"),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。

 

@Qualifier(value = "限定标识符")     

字段、方法、参数    

缺省的根据Bean名字注入:最基本方式,即缺省情况下使用Bean标识符注入

 

 @Autowired  
    @Qualifier(value = "mysqlDataSource2") //指定Bean限定标识符   
    public void initDataSource(DataSource dataSource) {   
        this.dataSource = dataSource;   
    }   

 扩展@Qualifier限定描述符注解:对@Qualifier的扩展来提供细粒度选择候选者;

 

如果我们有两个数据源,分别为Mysql和Oracle,因此注入两者相关资源时就牵扯到数据库相关,如在DAO层注入SessionFactory时,当然可以采用前边介绍的方式,但为了简单和直观我们希望采用自定义注解方式。
1. 扩展@Qualifier限定描述符注解来分别表示Mysql和Oracle数据源

 

/** 表示注入Mysql相关 */  
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
@Retention(RetentionPolicy.RUNTIME)   
@Qualifier  
public @interface Mysql {   
}  

/** 表示注入Oracle相关 */  
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
@Retention(RetentionPolicy.RUNTIME)   
@Qualifier  
public @interface Oracle {   
}  

    @Autowired  
    public void initDataSource(@Mysql DataSource mysqlDataSource, @Oracle DataSource oracleDataSource) {   
        this.mysqlDataSource = mysqlDataSource;   
        this.oracleDataSource = oracleDataSource;   
    }   


 Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean33.getMysqlDataSoruce());  
 Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean33.getOracleDataSoruc

 2.扩展参数的注解

 

 

 

 

package cn.javass.spring.chapter12.qualifier;   
public enum DataBase {   
    ORACLE, MYSQL;   
}  

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
@Retention(RetentionPolicy.RUNTIME)   
@Qualifier  
public @interface DataSourceType {   
    String ip();      //指定ip,用于多数据源情况   
    DataBase database();//指定数据库类型   
}  

    @Autowired  
    public void initDataSource(   
            @DataSourceType(ip="localhost", database=DataBase.MYSQL)   
            DataSource mysqlDataSource,   
            @DataSourceType(ip="localhost", database=DataBase.ORACLE)   
            DataSource oracleDataSource) {   
        this.mysqlDataSource = mysqlDataSource;   
        this.oracleDataSource = oracleDataSource;   
    }   


Assert.assertEquals(ctx.getBean("mysqlDataSourceBean"), testBean34.getMysqlDataSource());   
Assert.assertEquals(ctx.getBean("oracleDataSource"), testBean34.getOracleDataSoruce());  

 

 

3. 自定义注解限定描述符:完全不使用@Qualifier,而是自己定义一个独立的限定注解;

 

 

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
@Retention(RetentionPolicy.RUNTIME)   
public @interface CustomQualifier {   
    String value();   
}  

@Autowired  
    public TestBean35(@CustomQualifier("oracleDataSource") DataSource dataSource) {   
        this.dataSoruce = dataSource;   
    } 

 

 

在Spring配置文件中注册CustomQualifier自定义注解限定描述符,只有注册了Spring才能识别:

 

<bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">   
    <property name="customQualifierTypes">   
        <set>   
            <value>cn.javass.spring.chapter12.qualifier.CustomQualifier</value>   
        </set>   
   </property>   
</bean> 

 @Value

 

 

用于注入SpEL表达式,可以放置在字段方法或参数上

@Value(value = "SpEL表达式")     

字段、方法、参数  

1、可以在类字段上使用该注解:

  1. @Value(value = "#{message}")   
  2. private String message;  

 

2、可以放置在带@Autowired注解的方法的参数上

  1. @Autowired  
  2. public void initMessage(@Value(value = "#{message}#{message}") String message) {   
  3.     this.message = message;   
  4. }  



3、还可以放置在带@Autowired注解的构造器的参数上:

  1. @Autowired  
  2. private TestBean43(@Value(value = "#{message}#{message}") String message) {   
  3.     this.message = message;   
  4. }  

 

 

@Lazy
定义Bean将延迟初始化

  1. @Component("component")   
  2. @Lazy(true)   
  3. public class TestCompoment {   
  4. ……   
  5. } 


@DependsOn
定义Bean初始化及销毁时的顺序

  1. @Component("component")   
  2. @DependsOn({"managedBean"})   
  3. public class TestCompoment {   
  4. ……   
  5. }  


@Scope
定义Bean作用域,默认单例

  1. @Component("component")   
  2. @Scope("singleton")   
  3. public class TestCompoment {   
  4. ……   


@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

  1. @Component("component")   
  2. @Primary  
  3. public class TestCompoment {   
  4. ……   


@Configuration
注解需要作为配置的类,表示该类将定义Bean配置元数据,@Configuration注解的类本身也是一个Bean,因为@Configuration被@Component注解了,因此@Configuration注解可以指定value属性值,如“ctxConfig”就是该Bean的名字,如使用“ctx.getBean("ctxConfig")”将返回该Bean。


  1. @Configuration("ctxConfig")     
  2. public class ApplicationContextConfig {     
  3.     //定义Bean配置元数据     
  4. }  </span>  


@Bean
注解配置类中的相应方法,则该方法名默认就是Bean名,该方法返回值就是Bean对象,并定义了Spring IoC容器如何实例化、自动装配、初始化Bean逻辑


  1.       @Bean(name={},     
  2.       autowire=Autowire.NO,     
  3.       initMethod="",     
  4.       destroyMethod="")   
  • name:指定Bean的名字,可有多个,第一个作为Id,其他作为别名;
  • autowire:自动装配,默认no表示不自动装配该Bean,另外还有Autowire.BY_NAME表示根据名字自动装配,Autowire.BY_TYPE表示根据类型自动装配;
  • initMethod和destroyMethod:指定Bean的初始化和销毁方法。

@Import
类似于基于XML配置中的<import/>,基于Java的配置方式提供了@Import来组合模块化的配置类


  1. @Configuration("ctxConfig2")     
  2. @Import({ApplicationContextConfig.class})     
  3. public class ApplicationContextConfig2 {     
  4.     @Bean(name = {"message2"})     
  5.     public String message() {     
  6.         return "hello";     
  7.     }     
  8. }

 

JSR-250注解@Resource 

自动装配,默认根据类型装配,如果指定name属性将根据名字装配,可以使用如下方式来指定


  1. @Resource(name = "message")     
  2. private String message;    
  • @Resource注解应该只用于setter方法注入,不能提供如@Autowired多参数方法注入;
  • @Resource在没有指定name属性的情况下首先将根据setter方法对于的字段名查找资源,如果找不到再根据类型查找;
  • @Resource首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,因此如果JNDI环境中有和Spring容器同名的资源时需要注意。

@PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义;
类似于通过<bean>标签的init-method和destroy-method属性指定的初始化和销毁方法,但具有更高优先级,即注解方式的初始化和销毁方法将先执行。
• @PostConstruct在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执(注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。
• @PreDestroy             在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。



JSR-330注解

@Inject:等价于默认的@Autowired,只是没有required属性;

@Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况;

@Qualifier:只对应于Spring自带@Qualifier中的扩展@Qualifier限定描述符注解,即只能扩展使用,没有value属性。

 

 

分享到:
评论

相关推荐

    springIoc实现原理

    1. **XML配置**:早期Spring常用的方式,所有bean的定义都在XML文件中,如`beans.xml`。 2. **Java配置**:使用@Configuration和@Bean注解,将配置信息写在Java类中,更符合面向对象的编程习惯。 3. **注解驱动**:...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    Spring通过注解实现IOC

    本文将深入探讨Spring如何利用注解来实现控制反转(Inversion of Control,IOC)。 首先,理解IOC的概念至关重要。IOC意味着应用程序不再直接创建对象,而是由一个外部容器(如Spring框架)来负责对象的创建和管理...

    以注解方式模拟Spring IoC AOP

    在Spring中,通常通过以下三种注解实现IoC: - `@Autowired`:自动装配,Spring会根据类型或名称找到合适的bean进行注入。 - `@Qualifier`:当有多个相同类型的bean时,用于指定注入哪一个。 - `@Resource`:基于...

    手写SpringIOC注解实现版本

    这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强对IoC容器和注解驱动编程的理解。 在Spring中,IOC意味着应用程序不再直接创建对象,而是将对象的创建和...

    Spring IoC简单示例-注解配置-Maven构建

    在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...

    JavaEE Spring IoC注解

    在Spring中,IoC可以通过XML配置或注解实现,而注解方式则更受现代开发者的欢迎,因为它提供了更加简洁、直观的编程模型。 注解在Spring中的应用主要分为以下几类: 1. **Component Scan**:`@Component`、`@...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    实现Spring那样的Ioc注解装配

    本文将深入探讨如何实现一个类似于Spring的IoC注解装配机制。 IoC是Spring的核心概念,它通过反转对象的创建和管理权,将这些任务交给容器来处理,从而使开发者可以更专注于业务逻辑。在Spring中,DI是IoC的一种...

    SpringIoc示例代码

    Spring IOC容器通过XML配置文件或者基于注解的方式,定义了对象的生命周期和依赖关系。开发者不再需要手动创建对象,而是声明对象及其依赖,然后由Spring容器负责实例化、初始化和管理这些对象。这样,对象之间的...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...

    spring ioc

    Spring 提供了两种主要的 IOC 实现方式:基于 XML 的配置和基于注解的配置。在 XML 配置中,我们会在一个或多个 XML 文件中定义 Bean 及它们的依赖关系。例如: ```xml ``` 在上面的例子中,`exampleBean` 的...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    简单手写springIOC注解模式

    以上就是关于“简单手写springIOC注解模式”的主要知识点。通过这些注解,我们可以实现灵活、简洁的Spring应用配置,使得代码更加易于维护和扩展。在实际项目中,这些知识可以帮助我们更高效地构建和管理应用程序的...

    Spring IOC基于注解启动示例详析

    Spring IOC 基于注解启动示例详析 Spring IOC(Inversion of Control,控制反转)是一种软件设计模式,通过将对象的创建和管理交给容器来实现解耦合和灵活性。在 Spring 框架中,IOC 容器是核心组件之一,负责管理...

    SpringIoC和DI注解开发.pdf

    Spring IoC 和 DI 注解开发 Spring IoC 和 DI 注解开发概述 Spring IoC(Inverse of Control,控制反转)是一种软件设计模式,它将传统的控制权从应用程序转移到框架中,使得应用程序更加灵活和可扩展。DI...

    Spring IoC依赖包

    1. `spring-beans.jar`: 这个包包含了Spring框架的基本组件,如Bean工厂,它是IoC容器的基础,负责读取配置元数据(XML或Java注解),并根据这些信息创建和管理Bean。 2. `spring-context.jar`: 这个包扩展了`...

    Spring IOC.pdf

    Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    标题《Spring IoC源码深度剖析开源架构源码2021.pdf》和描述《Spring IoC源码深度剖析开源架构源码2021.pdf》表明该文档主要面向于分析Spring框架中控制反转(IoC)容器的核心源码,解析和理解其内部的工作机制及...

Global site tag (gtag.js) - Google Analytics