原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm
本文介绍了使用Spring注解注入属性的方法。使用注解以前,注入属性通过类以及配置文件来实现。现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等注解来实现。
1.1. 使用注解以前我们是怎样注入属性的
类的实现:
public class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... }
配置文件:
<bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl"> <property name="userDao" ref="userDao" /> </bean> <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl"> <property name="sessionFactory" ref="mySessionFactory" /> </bean>
1.2. 引入@Autowired注解(不推荐使用,建议使用@Resource)
类的实现(对成员变量进行标注)
public class UserManagerImpl implements UserManager { @Autowired private UserDao userDao; ... }
或者(对方法进行标注)
public class UserManagerImpl implements UserManager { private UserDao userDao; @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... }
配置文件
<bean id="userManagerImpl" class="com.kedacom.spring.annotation.service.UserManagerImpl" /> <bean id="userDao" class="com.kedacom.spring.annotation.persistence.UserDaoImpl"> <property name="sessionFactory" ref="mySessionFactory" /> </bean>
@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。以上两种不同实现方式中,@Autowired的标注位置不同,它们都会在Spring在初始化userManagerImpl这个bean时,自动装配userDao这个属性,区别是:第一种实现中,Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量;第二种实现中,Spring会调用 setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。
1.3. 让@Autowired工作起来
要使@Autowired能够工作,还需要在配置文件中加入以下代码
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
1.4. @Qualifier
@Autowired是根据类型进行自动装配的。在上面的例子中,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出 BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。
a. 可能存在多个UserDao实例
@Autowired public void setUserDao(@Qualifier("userDao") UserDao userDao) { this.userDao = userDao; }
这样,Spring会找到id为userDao的bean进行装配。
b. 可能不存在UserDao实例
@Autowired(required = false) public void setUserDao(UserDao userDao) { this.userDao = userDao; }
1.5. @Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解)
Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
1.6. @PostConstruct(JSR-250)
在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。
它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的setter方法时,如:
public class UserDaoImpl extends HibernateDaoSupport implements UserDao { private SessionFactory mySessionFacotry; @Resource public void setMySessionFacotry(SessionFactory sessionFacotry) { this.mySessionFacotry = sessionFacotry; } @PostConstruct public void injectSessionFactory() { super.setSessionFactory(mySessionFacotry); } ... }
这里通过@PostConstruct,为UserDaoImpl的父类里定义的一个sessionFactory私有属性,注入了我们自己定义的sessionFactory(父类的setSessionFactory方法为final,不可复写),之后我们就可以通过调用 super.getSessionFactory()来访问该属性了。
1.7. @PreDestroy(JSR-250)
在方法上加上注解@PreDestroy,这个方法就会在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景,这里不不去演示。其用法同@PostConstruct。
1.8. 使用< context:annotation-config />简化配置
Spring2.1添加了一个新的context的Schema命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的,它仅提供元数据信息。要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作起来。
AutowiredAnnotationBeanPostProcessor和 CommonAnnotationBeanPostProcessor就是处理这些注释元数据的处理器。但是直接在Spring配置文件中定义这些 Bean显得比较笨拙。Spring为我们提供了一种方便的注册这些BeanPostProcessor的方式,这就是< context:annotation-config />:
<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 /> </beans>
<context:annotationconfig />将隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor、 CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor以及 RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。
相关推荐
@JsonPropertyOrder , @JsonSerialize , @JsonSetter , @Lazy , @Order , @PathVariable , @Pointcut , @PostConstruct , @PostMapping , @PreDestroy , @Primary , @PropertySource , @Qualifier , @Repository , ...
Spring框架是Java开发中广泛应用的一个轻量级框架,它的核心特性是依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)。配置注解是Spring框架中的一种简化配置的方式...
在Spring框架中,注解是实现依赖注入和配置的核心机制之一。本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一...
3. `@Autowired`:此注解用于实现自动装配,Spring会根据类型或名称自动将依赖注入到Bean的属性或构造器中。例如,对于`Zoo`类的`tiger`和`monkey`属性,可以使用`@Autowired`注解进行注入。 ```java @Component ...
另外,类中可能还有`@Autowired`注解来自动装配依赖,`@Value`注解注入值,以及`@PostConstruct`和`@PreDestroy`注解来标记初始化和销毁方法。 **XML与注解结合配置的步骤:** 1. **定义Bean**:在Java类上使用`@...
注解配置是Spring框架的一种简化配置手段,它允许开发者通过在类或方法上添加特定的注解,替代传统的XML配置文件,使得代码更加简洁且易于维护。 首先,我们需要理解Spring配置文件的作用。在早期的Spring版本中,...
本示例将详细介绍如何使用注解配置实现Spring框架的注入。 首先,我们需要了解几个关键的注解: 1. `@Component`:这是Spring中的基础组件注解,可以标记一个类为Spring管理的bean。例如,我们可以定义一个简单的...
- `@Resource`:用于注入基于名称的依赖,与`@Autowired`不同的是,它默认按名称查找,而不是类型。 5. **例子** 在给定的例子中,`Office`、`Car`和`Boss`三个类可以通过注解配置。例如,`Boss`类可以这样注解:...
Spring的核心特性之一就是其强大的依赖注入(Dependency Injection,DI)机制,而注解(Annotation)的引入进一步简化了配置,使得代码更加简洁、易读。本篇文章将深入探讨Spring中的注解及其在实际开发中的应用。 ...
7. **Aspect-Oriented Programming (AOP)**:虽然不是IoC的一部分,但Spring AOP通过`@Aspect`、`@Before`、`@After`等注解,提供了面向切面的编程能力,可以方便地实现横切关注点,如日志记录、事务管理等。...
在Spring框架中,注解是实现依赖注入(Dependency Injection,DI)和简化配置的主要手段。在"Spring全注解Examples"这个项目中,我们将探讨如何使用Spring 4.2.2版本的注解来配置bean,执行AOP(面向切面编程)以及...
本篇文章将深入探讨如何通过注解将配置资源注入到Bean中,以此来理解Spring的注解驱动开发。 1. **注解的基本概念** 注解是Java提供的一种元数据机制,它允许我们在代码中嵌入额外的信息,这些信息可以被编译器或...
在这个版本中,Spring框架对注解的支持进一步加强,使得开发者可以更加便捷地进行依赖注入和配置管理,减少了XML配置文件的需求。 一、Spring框架简介 Spring是一个开源的Java平台,它为开发企业级应用程序提供了...
Spring可以通过`@Autowired`、`@Qualifier`等注解进行自动装配,减少手动配置。`@Autowired`默认按类型匹配,`@Qualifier`可以指定具体哪个Bean。 六、ConsoleAppSpring 在提供的`ConsoleAppSpring`可能是Spring...
Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了依赖注入、配置管理和AOP(面向切面编程)等任务。本文将深入探讨Spring注解及其在实际开发中的应用。 1. **依赖注入(Dependency Injection, ...
5. **方法参数注入**:除了字段注入外,Spring还支持通过方法参数注入,尤其是在AOP切面或事件处理中。例如,`@RequestParam`、`@PathVariable`用于处理HTTP请求参数。 6. **SpEL(Spring Expression Language)**...
通过阅读“spring注解的学习.pdf”,你可以深入了解Spring注解的使用,掌握如何利用注解实现依赖注入、AOP编程、MVC处理等核心功能,从而提高开发效率,让代码更简洁、更易于维护。学习并熟练运用这些注解,对于提升...
4. **方法注入(Method Injection)**:`@PostConstruct`和`@PreDestroy`注解分别标识初始化方法和清理方法,Spring会在bean初始化和销毁时调用它们。 5. **AOP注解**:`@Aspect`定义了一个切面,`@Before`、`@...
Spring框架是Java开发中不可或缺的一部分,它通过提供依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等特性,极大地简化了企业级应用的开发工作。在Spring中,注解是实现...
2. **依赖注入**:Spring的注解驱动的依赖注入是通过`@Autowired`、`@Qualifier`和`@Value`等注解实现的。`@Autowired`自动将匹配的bean注入到需要的字段或方法中,可以根据类型或名称进行匹配。`@Qualifier`用于当...