采用构造函数注入以及setter方法注入都需要写大量的XML配置文件这时可以采用另一种方式就是自动装由Spring来给我们自动装配我们的Bean
Spring提供了四种自动装配类型
:ByName 采用这种方式时给属性自动注入值时会根据Bean里的setXXX中的XXX去搜寻有没有id=XXX的Bean有的话将其自动注入没有的话就表示setXXX里要装入属性没有装配值
:ByType 采用这种方式给属性自动注入值时会根据Bean里的setXXX中的参数类型来搜寻配置文件中的Bean定义如果发现了一个就自动将其注入否则如果有个这个属性没有被装配如果有多个则会抛出异常
:constructor 这种方式的注入与ByType其实没什么区别无非是将ByType移入到了构造函数中这种方式下构造函数是自动注入的在构造对象时会自动根据构造函数的参数类型搜寻Bean如果有一个合适的则成功一个没有则失败有多个则会抛出异常
:autodetect 自动检测方式会采用如下流程先按照constructor方式再按照ByType方式
例子源代码如下
例子一个Java工程师从一个网站上买东本
一个普通的JavaBean
[java]
interface Engineer{
Object buyApple();
}
public class JavaEngineer implements Engineer{
private String name;
private Website ws;
public JavaEngineer(String name){
thisname=name;
}
public void setWebsite(Website ws){
thisws=ws;
}
@Override
public String toString() {
// TODO Autogenerated method stub
return supertoString();
}
public Object buyApple(){
Systemoutprint(工程师+name);
return wsbuyApple();
}
}
interface Engineer{
Object buyApple();
}
public class JavaEngineer implements Engineer{
private String name;
private Website ws;
public JavaEngineer(String name){
thisname=name;
}
public void setWebsite(Website ws){
thisws=ws;
}
@Override
public String toString() {
// TODO Autogenerated method stub
return supertoString();
}
public Object buyApple(){
Systemoutprint(工程师+name);
return wsbuyApple();
}
}
这个网站假设是淘宝网
[java]
interface Website{
Object buyApple();
}
public class TaobaoWebsite implements Website {
public TaobaoWebsite()
{
}
public Object buyApple()
{
Systemoutprintln(购买了一个苹果);
return new Object();
}
}
interface Website{
Object buyApple();
}
public class TaobaoWebsite implements Website {
public TaobaoWebsite()
{
}
public Object buyApple()
{
Systemoutprintln(购买了一个苹果);
return new Object();
}
}则采用自动装配的ByName方式的配置文件如下
[java]
<?xml version= encoding=UTF?>
<beans
xmlns=/schema/beans
xmlns:xsi=//XMLSchemainstance
xmlns:p=/schema/p
xsi:schemaLocation=/schema/beans /schema/beans/springbeansxsd>
<! 这个名字要和setXXX中的XXX保持一致不区分大小写 >
<bean id=website class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=byName>
<constructorarg value=ppTest/>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>
</beans>
<?xml version= encoding=UTF?>
<beans
xmlns=/schema/beans
xmlns:xsi=//XMLSchemainstance
xmlns:p=/schema/p
xsi:schemaLocation=/schema/beans /schema/beans/springbeansxsd>
<! 这个名字要和setXXX中的XXX保持一致不区分大小写 >
<bean id=website class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=byName>
<constructorarg value=ppTest/>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>
</beans>打印结果如下
[java]
工程师ppTest购买了一个苹果
工程师ppTest购买了一个苹果
有了第一个结果后第二个结果也就很简单了
ByType的测试
修改配置文件如下
[html]
<! 这个名字 不再需要和setXXX中的XXX保持一致>
<bean id=web class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=byType>
<constructorarg value=ppTest/>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>
<! 这个名字 不再需要和setXXX中的XXX保持一致>
<bean id=web class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=byType>
<constructorarg value=ppTest/>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>其他的地方可以不用修改
Constructor自动装配为了测试给JavaEngineer加入一个构造函数如下方式
[java]
public JavaEngineer(Website ws){
thisws=ws;
thisname=ppTest;
}
public JavaEngineer(Website ws){
thisws=ws;
thisname=ppTest;
}
再修改配置文件如下
[html]
<bean id=web class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=constructor>
<!<constructorarg value=ppTest/>>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>
<bean id=web class=comppTaobaoWebsite/>
<bean id=engineer class=comppJavaEngineer autowire=constructor>
<!<constructorarg value=ppTest/>>
<! 这里有一个属性采用的是自动byName的方式注入的 >
</bean>结果是一样的
自动装配autodetect通过将autowire设置为autodetect是指示Spring容器让它先尝试使用constructor自动装配如果没有找到合适的Bean就尝试使用ByType自动装配新版本中好象已经没有这个属性了