自动装配bean的属性值
模式 | 说明 |
---|---|
no | |
byName | 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为 |
byType | 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 |
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>
name=scott driver=oracle:jdbc:driver:oracleDriver url=jdbc:oracle:thin:@127.0.0.1:1521:cdtax pwd=tigerdb2.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