spring之注解(二)Autowired

从spring 2.0开始,spring依次加入了对注解型元数据配置的支持。自此我们有了另外一种配置bean的方式。上篇文章中,我们对Spring支持的注解进行了大致的分类,并对其有了初步的介绍。本篇文章则对其展开较详细的说明。主要讲述依赖级别,部分属性级别则在过程中穿插使用。

本篇使用的示例代码继承之前的篇章。

依赖级别

Spring可以使用这些注解进行依赖注入,通常是自动的,或者借助一些辅助信息。也就是说,我们对Bean的定义还是采用XML的方式,而对其依赖的注入则使用注解的方式。

@Autowired

首先登场的当然是大明鼎鼎的@Autowired。从名字就可以看出来其可以“自动装配依赖”。它通过类型自动注入(byType)首先在配置文件中加入以下配置是,@Autowired生效:

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

@Autowired可以标注在 字段、set方法和构造函数上,假如说我们例如我们依次有以下配置,并且已经在XML文件中有了bean的定义,以下的三种方式等价,均上自动注入依赖UserDao,可以和前篇使用xml 的注入依赖的方式比较:

//标注在字段上。
   @Autowired
   private UserDao userDao;
//标注在set方法上。
   @Autowired
   public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
   }
//标注在构造函数上
   @Autowired
   public UserServiceIml3(UserDao userDao) {
      super();
      this.userDao = userDao;
   }
  

在XML中bean定义如下:

<bean id="user1" class="com.test.service.UserServiceIml1"/>
 <bean id="user2" class="com.test.service.UserServiceIml2" />
 <bean id="user3" class="com.test.service.UserServiceIml3"/>

以上的注入是我们自己定义的接口,当然也可以注入spring核心的一些接口,如ApplicationContext,如下:

@Autowired
    private ApplicationContext context;

另外@Resource是JSR-250的注解,其含义和@Autowired 相同,但是有限制,要使其生效,需要在bean定义文件中声明相应的beanpostProcessor 见下:

//可以用在字段和只有一个参数的set方法上,含义同等@Autowired
   @Resource
   private UserDao userDao;
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/

另有JSR-330注解  @Inject 和 @Autowired的 作用基本一样,这里略过不提。

@Qualifier

@Autowired使用byType进行依赖的注入,可能会有多个匹配者(如我们有在Spring容器中有两个userDao的bean),那么这个时候就会抛出异常,因此我们需要更加细粒度的进行控制,这就是@Qualifier 登场的地方。@Qualifier 可以用到字段上,方法参数上,来从“名字”上对aotowired的候选bean进行限制。一般情况下,可以直接使用bean的name来作为@Qualifier的值来限制注入指定的bean. 当然也可以在xml中使用<Qualifier> 标签,这么做的好处是Qualifier
的值可以不是唯一的。

假如我们有两个UserDao,分别是userDao 和 userDao1,那么我们需要改以上的配置如下:

//标注在构造函数上
   @Autowired
   public UserServiceIml3( @Qualifier("userDao1")
UserDao userDao) {
      super();
      this.userDao = userDao;
   }
//标注在字段上。
   @Autowired
   @Qualifier("userDao")
   private UserDao userDao;

其他剩下的略。

也可以使用标签定义qualifier :

<bean id="userDao" class="com.test.dao.UserDaoImp">
        <qualifier value="main"/>
    </bean>

自定义@Qualifier

我们可以自定义注解,只要使用@Qualifier标注即可。如下:

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

然后我们就可以使使用我们自定义的注解,来实现和@Qualifier相同的功能。在代码中和xml中的使用方式依次如下:

@Autowired
   @MyQualify("userMy")
   private UserDao userDao;
<bean id="userDao1" class="com.test.dao.UserDaoImp">
        <qualifier type="com.test.service.Myqualify" value="userMy"/>
    </bean>

@value

用来自动装配基本类型(如int 等),可以和springEL 配合使用,也可以注入properties属性文件和常量值。

如下所示注入properties文件定义的值或者常量:

package com.test.service;

import org.springframework.beans.factory.annotation.Value;

public class TestValue {

   @Value("${a}")
   private int a ;
   @Value("${b}")
   private String b;
   @Value("${c}")
   private boolean c;

   private double d;

   /**
    * properties的定义
    */
   @Value("${d}")
   public void setD(double d) {
      this.d = d;
   }

   /**
    * 注入常量
    */
   @Value(" i am const")
   private String e;

   @Override
   public String toString() {
      return "TestValue [a=" + a + ", b=" + b + ", c=" + c + ", d=" + d
            + ", e=" + e + "]";
   }

}

testvalue.properties的值如下:


a=11

b=11

c=true

d=1.33

最后需要在xml文件中加入对properties文件的读取,不要加入相应的命名空间,如下:

<context:property-placeholder location="classpath:/com/test/testvalue.properties"/>

总结

以上较详细的说明了下Spring 支持的依赖级别的注解的使用方法,主要介绍了@Autowired和@qualifier ,简单的介绍了其他如 @Resource 。对于JSR-330 @Inject 则略过,其实它和@Autowired的作用一样,但是没有其功能强大。@Required 没有提。

最后注意,Spring使用BeanPostProcessor来处理@Autowired等注解,所以在自定义的的BeanPostProcessor中不能使用这些它,必须在xml文件中配置。

本篇中bean的定义还是在xml中声明,下篇将会改变这点通过使用@component。完整测试代码

时间: 2024-10-11 01:10:26

spring之注解(二)Autowired的相关文章

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的

本文介绍了使用spring注解注入属性的方法. 使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现. 使用注解以前我们是怎样注入属性的 类的实现: 1. public class UserManagerImpl implements UserManager { 2. private UserDao userDao; 3. public v

Spring入门(二)— IOC注解、Spring测试AOP入门

一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 配置listener主要是为了捕获项目发布 | 服务器启动的契机 ,为了解析xml , 创建工厂. 这个listener是spring官方提供

spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差

代码: 为了探寻  '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Person","Organization".这样我就可以在注入Bean的时候不必使用具体类型(指使用接口类型即可).这样做也方便我研究当一个接口有多个实现类与之匹配的时候Spring是如何解决依赖注入的不确定性的. public interface Party {} packa

Spring的注解@Qualifier(二十五)

转载:https://www.cnblogs.com/smileLuckBoy/p/5801678.html 近期在捯饬spring的注解,现将遇到的问题记录下来,以供遇到同样问题的童鞋解决~ 先说明下场景,代码如下: 有如下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); } 同时有下述两个实现类 EmployeeServiceImpl和EmployeeServiceImpl1

spring常用注解使用讲解

spring常用注解使用讲解 本文讲述spring的几个常用的注解 @RequestMapping @RequestParam @ResponseBody @RequestBody @Autowired 一.@RequestMapping  RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: v

spring中@Resource和@Autowired理解

一.@Resource的理解 @Resource在bean注入的时候使用,@Resource所属包其实不是spring,而是javax.annotation.Resource,只不过spring支持该注解@Resource里有name,lookup,type,authenticationType,shareable,mappedName,description这几个属性具体看源码结构截图 0.可以直接在要注入的属性上这样写@Resourceprivate User user;不管配置文件里有没有

看看Spring源码(二)——bean实例化

首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prep

Spring基于注解及SpringMVC

1.使用注解 (1)组件扫描 指定一个包路径,Spring会自动扫描该包 及其子包所有组件类,当发现组件类定义前有 特定的注解标记时,就将该组件纳入到Spring 容器.等价于原有XML配置中的<bean>定义功能. 组件扫描可以替代大量XML配置的<bean>定义. (2)如何使用 step1,在配置文件当中,添加 <context:component-scan base-package=""/> 让容器扫描指定的包及其子包下面的类. step2,

Spring应用注解配置实现IOC

一.组件自动扫描 可以按指定的包路径,将包下所有组件扫描,如果发现组件类定义前有以下标记,就会将组件扫描到容器. @Component 其他组件 @Controller  控制层组件 @Service  业务层组件  XXXService @Repository  数据访问层组件 XXXDao @Named (不是Spring中定义的,需要引入第三方标准包) 组件自动扫描需要我们手动开启,开启方式即在applicationContext.xml中添加以下配置: <context:componen