Spring实战-最小化Spring XML配置(四)

一.Bean的自动装配

有助于减少甚至消除<property>元素和<constructor-agr>元素,让Spring自动识别如何装配Bean的依赖关系。
Spring一共有四种类型的自动装配:
(1)byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中,如果没有,则该属性不进行装配
(2)byType:把与Bean的属性巨涌相同类型的其他Bean自动装配到Bean的对应属性中,如果没有,则该属性不进行装配
(3)constructor:把与Bean的构造器具有相同类型的其他Bean自动装配到Bean构造器的对应参数
(4)autodetect:首先尝试使用constructor进行自动装配,如果失败,则使用byType
1.byName 自动装配

<bean id="byNameTest1" class="com.Impl.InstrumentList" autowire="byName">
			<property name="song" value="You are my Everything"></property> 
    	</bean> 


		<bean id="instrument" class="com.violino"></bean> 

在本例中,violin的Bean的ID属性月byNameTest1的Bean的instrumen的属性名字是一样的,通过配置autowire属性,spring利用此信息自动装配到byNameTest1的instrument属性。

byName自动装配的约定:为属性自动装配ID月该属性的名字相同的Bean。

2.byType自动装配

<bean id="byTypeTest1" class="com.Impl.InstrumentList" autowire="byType">
			<property name="song" value="You are my Everything!!"></property>
		</bean>
		<bean id="instrument" class="com.violino"></bean> 
如果有多个Bean他们的类型都与自动装配的属性的类型匹配,Spring不会选择合适哪一个,而是会抛出异常。

这里我们可以为自动装配标识一个首选Bean,或者取消某一bean 

使用primary=true,那么该Bean将优先选择。

使用autowire-candidate="false",那么可以排除某个Bean。

3.constructor自动装配

<bean id="constructorTest" class="com.Impl.InstrumentList" autowire="constructor">

<bean id="instrument" class="com.violino"></bean> 

4.最佳自动装配

如果想自动装配Bean,但又不能决定使用哪个类型的自动装配,可以设置autowire的属性为autodetect,由spring来决定,会首先尝试使用constructor自动装配,如果没有匹配上的使用byType 自动装配。

5.默认自动装配

如果需要为Spring应用上下文中的每一个Bean装配相同的autowire属性,那么可为所用的Bean应用相同的自动装配策略。

 default-autowire="byTpye"
默认情况下 default-autowire设置为none,标示所有的Bean都不使用自动装配,除非Bean自己装配了autowire属性。

二.使用注解装配

Spring容器默认禁用注解装配,那么要使用它,我们需要在Spring配置中动它。

<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:util="http://www.springframework.org/schema/util"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   	   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	   	   http://www.springframework.org/schema/util
	   	   http://www.springframework.org/schema/util/spring-util-2.5.xsd
	   	   http://www.springframework.org/schema/context
	   	     http://www.springframework.org/schema/context/spring-context-2.5.xsd"
	   	   
	  >
	 <context:annotation-config/>

1.使用@Autowired

假设我使用@Autowired让spring自动装配乐器演奏家Bean的instrument属性,我们可以对应他的set方法进行标注:

@Autowired
	public void setInstrument(Instrument instrument) {
		this.instrument = instrument;
	}

同样我们可以使用@Autowired自动装配属性,方法和构造器。

2.可选的自动装配

默认情况下,@Autowired所标注的属性或参数必须是可装配的,如果没有Bean可以装配到@Autowired所标注的属性或者参数中,自动装配是失败的。这时我们通过设置@Autowired的required的属性为false来配置自动装配是可选的。此时如果没有对应的Bean会自动注入null.

注意:requeired可以用于@Autowired注解所使用的任意地方。但是当使用构造器装配时,只用一个构造器时可以将@Autowired的required属性设置为true.

3.限定歧义性的依赖

有可能会有很多个Bean都满足装配条件,并且都可以被装配到属性或者参数中,这时@Autowired没有办法选择哪一个才是它想要的。这时会抛出异常,可以使用@Qualifier明确指出要装配那个Bean:

@Autowired
	@Qualifier("violino")
	private Instrument instrument;
4、借助@Inject实现基于标准的自动装配

@Inject同样可以用来装属性,方法和构造器。但是它没有required属性,因此@Inject注解所标注的依赖关系必须存在,如果不存在会报错。相对于@Autowired的@Qualifier,
@Inject所使用的是@Named

5.在注解中使用表达式

@Value("test")

private String str;

三、自动检测Bean

<context:component-scan>除了完成与<context:annotation-config/>一样的工作,还允许Spring自动检测Bean和定义Bean。这就意味着不用使用<bean>元素,Spring应用中的大多数Bean都可以实现定义和装配:

<context:component-scan base-package="com"/>
<context:component-scan>会扫描指定的包以及其所有的子包,并查找出能够自动注册为SpringBean的类。

能够查找到的注解:

(1)@Component:通用的构造型注解,标识该类为Spring组件

(2)@Controller:标识将该类定义为SpringMvc controller

(3)@Repository:标识该类定义为数据仓库

(4)@Service:标识将该类定义为服务

(5)使用@Component标注的任意自定义注解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值