Spring XML配置--使用注解装配(@Atutowired、@Inject、@Resource)

陈科肇--http://blog.csdn.net/u013474104/article/details/44352765

=======

1.装配术语

创建应用对象之间协作关系的行为通常被称为装配

2.使用注解装配

Spring是从Spring2.5开始引入使用注解自动装配的。

Spring容器是默认禁用注解装配的,因此如果要使用Spring的注解装配,你必须启用它。启用方式:使用Spring的context命名空间配置中的<context:annotation-config>元素,配置启用如下:

<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<!--
		spring默认是禁用注解装配,添加下行代码可启用
		spring支持几种不同的用于自动装配的注解
		Spring自带的@Autowired
		JSR-330的@Inject
		JSR-250的@Resource
	-->
	<context:annotation-config />
</beans>

一旦配置完成,我们就可以对代码添加注解,标识Spring应该为属性、方法和构造器进行自动装配

好了,我们可以看到上述的配置的自动装配配置中,spring支持几种不同的用于自动装配的注解,接下来我就详解下使用各个不同注解进行自动装配。

3.4种类型的自动装配

当涉及自动装配Bean的依赖关系时,Spring有多种处理的方式。因此,Spring提供了4种各具特色的自动装配策略。

a.byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;

b.byType:把与Bean的属性具有相同类型的其它Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;

c.constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中;

d.autodetect:首先尝试constructor进行自动装配。如果失败,再尝试使用byType进行自动装配;

4.Spring自带的@Autowired

首先,@Autowired可以对Bean的属性可以进行多种装配方式,比如属性的setter方法、Bean引用的任意方法、构造器以及可以使用@Autowired直接标注属性,并删除setter方法,比如:

注:在执行@Autowired注解时,Spring就会尝试对该方法执行byType自动装配

HelloWord对象有一个helloChina属性的对象,我们要对helloChina进行注解装配!

1.setter方法
@Autowired
public void setHelloChina(HelloChina helloChina){
	this.helloChina=helloChina;
}
2.任意方法
@Autowired
public void xx(HelloChina helloChina){
	this.helloChina=helloChina;
}
3.构造器
@Autowired
public HelloWord(HelloChina helloChina){
	this.helloChina=helloChina;
}
4.删除setter方法
@Autowired
private HelloChina helloChina;

看,@Autowired甚至不会受限于private关键字,那是不是@Autowired注解没有任何限制了呢?

其实并不是这样的,@Autowired注解的确存在两种阻碍我们工作的场景。具体来说,应该中必须只能有一个Bean适合装配到@Autowired注解所标识的属性或参数中。如果没有匹配的Bean,或者存在多个匹配的Bean,@Autowired注解就会遇到一些麻烦(异常:NoSuchBeanDefinitionException)。

这类型麻烦的解决方案如下:

a.可选的自动装配

属性不一定非要装配,null值也即可接受:

@Autowired(required=false)
private HelloChina helloChina;

表示的是,如果没有找到HelloChina进行装配,则helloChina为null值;

注:required属性可以用于@Autowired注解所使用的任意地方。但用于构造器装配时,只有一个构造器可以将@Autowired的required属性设置为true。其他使用@Autowired注解所标识的构造器只能将required属性设置为false。此外,使用@Autowired标识多个构造器时,Spring就会从所有满足装配条件的构造器中选择入参数最多的那个构造器;

b.限定歧义性的依赖

当Bean的属性有多个适合自动装配的Bean时,那么@Autowired应该使用那个Bean呢?这时@Autowired就不知道了。

这时为了确定,我们需要装配的Bean时,可以配合使用@Qualifier来明确指定名为xxName的Bean。

@Autowired
@Qualifier("xxName")
private HelloChina helloChina;

如上所示,@Qualifier注解尝试注入ID为xxName的Bean。

原理,也即是将byType自动装配转换为byName自动装配。

@Qualifier限定器,还可以自个创建,即满足不了我们的需求时,这时就不介绍了,有需要的google去吧;

5.JSR-330的@Inject

为了统一各种依赖注入框架的编程模型,JCP最近发布了java依赖注入规范,JCP将其称为JSR-330,@Inject注解是JSR-330的核心部件。该注解几乎可以完全替代Spring的@Autowired注解。所以除了使用Spring特定的@Autowired注解,我们可以选择@Inject。

和@Autowired一个,@Inject可以用来自动装配属性、方法和构造器;与@Autowired不同的是,@Inject没有required属性。因此@Inject注解注入的依赖关系必须存在,否则报异常。

与@Autowired一样,@Inject有自己限定的方法,即处理限定歧义性的依赖,配置如下:

@Autowired
@Named("xxName")
private HelloChina helloChina;

另外,@Inject还可以创建自己的Qualifier,这里就不扯了....

注:实际上,@Named注解就是一个使用@Qualifier注解所标注的注解

6.在注解中注入表达式:

Spring3.0引入了@Value,可以让我们使用注解装配String类型的值和基本类型的值,例如:int、boolean。

@Value("陈科肇")
private String myName;

上述纯属为硬编码了,你们可能会问,把值定死有什么意义。

@Value+SpEL表达式才能展现出来强大魔力,这里就不讲解了,有兴趣的去google吧....

时间: 2024-10-07 05:29:40

Spring XML配置--使用注解装配(@Atutowired、@Inject、@Resource)的相关文章

spring实战之使用注解装配

使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细粒度的自动装配. Spring容器默认禁用注解装配.所以,在使用基于注解的自动装配前,需要在Spring配置中启用它,最简单的启用方式是使用spring的context命名空间配置中的 <context:annotation-config>元素,如下所示: <?xml version=&qu

spring xml配置

一个完整的spring xml配置:是把action,service,dao以及其它的资源性配置(如basedao)和公共性配置(如连接数据库)配置在resource.xml中,这样就有四个xml配置信息. 案例: 四个xml配置: applicationContext-action.xml: <?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframe

Spring学习一:IOC(控制反转)和AOP(面向切面)的xml配置和注解方式

Spring框架的作用:为了简化java开发 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的 一.IOC(控制反转) 1 构造器注入 (xml配置) 2方法注入 (注解方式) (xml配置) 二,AOP(面向切面) 注解方式 xml配置 只是使用,那简单,

Spring学习笔记--使用注解装配

使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的context命名空间配置中的<context:annotation-config>元素,如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.

&lt;Spring实战&gt;3:最小化Spring XML配置

1 自动装配 Bean 属性 1.1 4 种类型的自动装配 byName:把与 Bean 的属性具有相同名字或 ID 的其他 Bean 自动装配到 Bean 的对应属性中 byType:把与 Bean 的属性具有相同类型的其他 Bean 自动装配到 Bean 的对应属性中 constructor:把与 Bean 的构造器入参具有相同类型的其他 Bean 自动装配到 Bean 构造器的对应入参中 autodetect:首先尝试使用 constructor 进行自动装配,如果失败再尝试使用 byTy

[Spring]04_最小化Spring XML配置

4.1 自动装配 Bean Spring 装配 bean 时,有时非常明确,就是需要将某个 bean 的引用装配给指定属性. 例如,若应用上下文中只有一个 javax.sql.DataSource 类型的 bean,那么任意一个依赖 DataSource 的其他 bean 就是需要这个 DataSource Bean. 为了应对这种明确的装配场景,Spring提供了自动装配(autowiring). 4.1.1 四种类型的自动装配 Spring提供了4种自动装配策略 (1)byName——把与

第3章 最小化Spring XML配置

目录: 自动装配Bean属性 使用注解装配 自动检测Bean 使用Spring基于Java的配置 自动装配Bean属性 四种类型的自动装配: 1 byName 通过id的名字与属性的名字进行判断,要保证Bean实例中属性名字与该装配的id名字相同. 2 byType 通过类型确定装配的bean,但是当存在多个类型符合的bean时,会报错. 3 contructor 在构造注入时,使用该装配方式,效果如同byType. 4 autodetect 首先尝试使用constructor进行自动装配.如果

(转)java之Spring(IOC)注解装配Bean详解

在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看Annotation的魅力所在吧. 先来看看之前的bean注解装配例子: package com.eco.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import

spring3.0定时器 xml配置和注解方式

1.xml配置方式 web.xml <!-- 配置spring监听器和配置文件路径 -->     <context-param>         <param-name>contextConfigLocation</param-name>         <param-value>classpath:applicationContext.xml</param-value>     </context-param>