Spring IOC 常用注解

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

? 方式一:bean

  1. <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。

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

         ? 例如 

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



@Autowired 采用byType的方式 


  1. @Autowired  
  2. private ISoftPMService softPMService;  
  1. @Autowired(required=false)  
  2.     构造器、字段、方法  

       @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属性作用相同。

  1. @Qualifier(value = "限定标识符")     
  2. 字段、方法、参数    

(1)根据基于XML配置中的<qualifier>标签指定的名字进行注入,使用如下方式指定名称 
  1. <qualifier  type="org.springframework.beans.factory.annotation.Qualifier"  value="限定标识符"/>    
其中type属性可选,指定类型,默认就是Qualifier注解类,name就是给Bean候选者指定限定标识符,一个Bean定义中只允许指定类型不同的<qualifier>,如果有多个相同type后面指定的将覆盖前面的。
  1. @Autowired    
  2.    //根据<qualifier>标签指定Bean限定标识符    
  3.    public void initDataSource(@Qualifier("mysqlDataSource") DataSource dataSource) {    
  4.        this.dataSource = dataSource;    
  5.    }    
使用@Qualifier("mysqlDataSource")来指定候选Bean的限定标识符,我们需要在配置文件中使用<qualifier>标签来指定候选Bean的限定标识符“mysqlDataSource”:
  1. <bean id="mysqlDataSourceBean" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  2.      <qualifier value="mysqlDataSource"/>   
  3. </bean>  

(2)缺省的根据Bean名字注入:最基本方式,是在Bean上没有指定<qualifier>标签时一种容错机制,即缺省情况下使用Bean标识符注入,但如果你指定了<qualifier>标签将不会发生容错。
  1.     @Autowired  
  2.     @Qualifier(value = "mysqlDataSource2"//指定Bean限定标识符    
  3.     //@Qualifier(value = "mysqlDataSourceBean")   
  4. 相关文章

    servlet中取到Spring配置

    转自:http://blog.csdn.net/sd_lichangyou/archive/2006/10/25/1350519.aspx ------------------------------...

    IOC容器,其实很简单

      前几天看easyjweb代码,看到容器那块,顺便自己也写了个简单的IOC容器练练手。今天正好有时间就写出来大家看看,我也好冒充一下高手。 这是个很简单的IOC容器,基本功能有:自动加载所...

    Spring OpenSessionInView

    OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。