现在的位置: 首页 > 综合 > 正文

4、自动装配(autowire)

2018年02月05日 ⁄ 综合 ⁄ 共 6792字 ⁄ 字号 评论关闭

自动装配bean的属性值

模式 说明
no               
byName  

根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType

如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor

byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect

通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

1、byName的用法:

<?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"
		xmlns:tx="http://www.springframework.org/schema/tx"
		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
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 配置一个master对象 -->
<bean id="master" class="com.cdtax.autowire.Master" autowire="byName">
	<property name="name" value="小明"></property>
	<!-- 传统set方式 -->
	<!-- 
	<property name="dog" ref="dog"></property>
	 -->
</bean>

<!-- 配置dog对象 -->
<bean id="dog" class="com.cdtax.autowire.Dog">
	<property name="name" value="小黄"></property>
	<property name="age" value="3"></property>
</bean>
</beans>

byName方式,master的属性dog虽然没有配置,但是spring容器会自动查找id为dog的bean,然后赋给master的dog属性,这时按名字自动装配。

byName寻找和属性名相同的bean,若找不到,则装配不上。

2、byType的用法:寻找和属性类型相同的bean,找不到,装配不上,找到多个抛异常。

3、constructor:查找和bean的构造参数一致的一个或多个bean,若找不到或找到多个,抛异常,按照参数的类型装配

4、autodetect:3和2之间选一个方式。不确定性的处理与3和2一致,构造函数方式优先

5、default:这个需要在<beans default-autowire="指定" />,当你在<beans>中指定了default-autowire后,的、所有的bean的默认的autowire就是指定的装配方法;

如果没有在<beans default-autowire="指定" />没有default-autowire="指定",则默认是default-autowire=“no”

6、no:不自动装配,这是autowire的默认方式。

7、混合使用手动和自动组装

<bean id="bar" class="...Bar" autowire="byName">

<property name="cousedao">

<ref bean="somebean: />

</property>

</bean>

8、spring2.5提供了<context:annotation-config />配置,该配置可以激活在类中探测到的各种注解,@Requested  @Autowire  @PostConstrct  @PreDestroy  @Resource   @EJB  @PersistenceContext  @WebServiceRef等等,也可以选择为这些注解激活单独的后处理器。

例如:AutowiredAnnotationBeanPostProcessor(处理自动装配),CommonAnnotationBeanPostProccessor(生命周期等)

注意,该标志不能激活事务处理,需要使用tx:annotation-driven
9、使用spring的特殊bean

让spring特殊对待这些bean。使它们可以:
1)通过配置后加工bean,涉及到Bean和Bean工厂生命周期。
2)改变依赖注入,将字符串转换为其他类型
3)从属性文本装载信息,包括信息国际化。
4)监听并处理其他bean及spring发布的系统消息。
5)知道自己在spring中的唯一标识。

在配置文件中可以配置三种bean:一种是我们自己写的bean,一种是别人写的打包给我们的,第三种就是spring本身提供的特殊bean

如对bean进行后处理的BeanPostProcessor接口提供机会来修改bean。

public interface BeanPostProcessor{

//Bean初始化(调用afterPropertiesSet()以及Bean的指定initmethod方法)之前被调用

Object postProcessorBeforeInitialation(...);

//在初始化之后马上调用

Object postProcessorAfterInitialation(...);

}

如果使用的是Bean工厂,需要调用工厂的addBeanPostProcessor()来注册。

factory.addBeanPostProcessor(...);

BeanPostProcessor在bean载入后,对bean进行一些后处理工作,而BeanFactoryPostProcessor在bean工厂载入所有bean的定义后,实例化bean之前,对Bean工厂做一些后处理工作。

分散配置(有两种方式引入文件)

将配置文件分成几个分散的配置文件。如数据源。

<bean class="...propertyplaceholderConfigurer">

    <property name="locations">

    <list>

        <value>xx/yy/db.properties</value>

        <value>xx/yy/db2.properties</value>

    </list>

    </property>

</bean>

<!--名字空间配置(2.5) -->

<context:property-placeholder location="classpath:com/cdtax/spring/dispatcher/db.properties" />

使用spring的特殊bean完成分散配置

package com.cdtax.dispatch;

public class DBUtil
{
	private String driver;
	private String url;
	private String name;
	private String pwd;
	public String getDriver()
	{
		return driver;
	}
	public void setDriver(String driver)
	{
		this.driver = driver;
	}
	public String getUrl()
	{
		return url;
	}
	public void setUrl(String url)
	{
		this.url = url;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getPwd()
	{
		return pwd;
	}
	public void setPwd(String pwd)
	{
		this.pwd = pwd;
	}
	
}

<?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"
		xmlns:tx="http://www.springframework.org/schema/tx"
		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
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 引入我们的db.properties 就可以使用分散配置方式,多个分散文件引入,使用逗号分隔-->
<context:property-placeholder location="classpath:com/cdtax/dispatch/db.properties,classpath:com/cdtax/dispatch/db2.properties"/>

<!-- 配置一DBUtil对象 -->
<!-- 传统的配置方式 -->
<!-- 
<bean id="dbutil" class="com.cdtax.dispatch.DBUtil">
	<property name="name" value="scott"></property>
	<property name="driver" value="oracle:jdbc:driver:oracleDriver"></property>
	<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:cdtax"></property>
	<property name="pwd" value="tiger"></property>
</bean>
 -->
 
 <!-- 分散式配置方式  配置一DBUtil对象,使用db.properties ${}叫做占位符-->
<bean id="dbutil" class="com.cdtax.dispatch.DBUtil">
	<property name="name" value="${name}"></property>
	<property name="driver" value="${driver}"></property>
	<property name="url" value="${url}"></property>
	<property name="pwd" value="${pwd}"></property>
</bean>

 <!-- 分散式配置方式 配置一DBUtil对象,使用db2.properties-->
<bean id="dbutil2" class="com.cdtax.dispatch.DBUtil">
	<property name="name" value="${db2.name}"></property>
	<property name="driver" value="${db2.driver}"></property>
	<property name="url" value="${db2.url}"></property>
	<property name="pwd" value="${db2.pwd}"></property>
</bean>
</beans>

db.properties

name=scott
driver=oracle:jdbc:driver:oracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:cdtax
pwd=tiger

db2.properties

db2.name=scott2
db2.driver=oracle:jdbc:driver:oracleDriver2
db2.url=jdbc:oracle:thin:@127.0.0.1:1521:cdtax2
db2.pwd=tiger2

package com.cdtax.dispatch;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App1
{
	public static void main(String[] args)
	{
		ApplicationContext ac = new ClassPathXmlApplicationContext("com/cdtax/dispatch/beans.xml");
		
		DBUtil dbutil = (DBUtil)ac.getBean("dbutil");
		System.out.println("driver:=" + dbutil.getDriver());
		System.out.println("name:=" + dbutil.getName());
		System.out.println("url:=" + dbutil.getUrl());
		System.out.println("pwd:=" + dbutil.getPwd());
		
		DBUtil dbutil2 = (DBUtil)ac.getBean("dbutil2");
		System.out.println("driver:=" + dbutil2.getDriver());
		System.out.println("name:=" + dbutil2.getName());
		System.out.println("url:=" + dbutil2.getUrl());
		System.out.println("pwd:=" + dbutil2.getPwd());
	}
}

执行结果:

driver:=oracle:jdbc:driver:oracleDriver
name:=scott
url:=jdbc:oracle:thin:@127.0.0.1:1521:cdtax
pwd:=tiger
driver:=oracle:jdbc:driver:oracleDriver2
name:=scott2
url:=jdbc:oracle:thin:@127.0.0.1:1521:cdtax2
pwd:=tiger2

【上篇】
【下篇】

抱歉!评论已关闭.