浏览 7668 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-05
Autowiring modes 模式 说明 no 不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。 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方式。 ---------------------------------------------------------------------------------- 理解自动装配的优缺点是很重要的。其中优点包括: 自动装配能显著减少配置的数量。不过,采用bean模板也可以达到同样的目的。 自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。 自动装配的一些缺点: 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。 如果采用by type方式自动装配,那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个,如果配置可能存在多个这样的bean,那么就要考虑采用显式装配了。 尽管使用autowire没有对错之分,但是能在一个项目中保持一定程度的一致性是最好的做法。例如,通常情况下如果没有使用自动装配,那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。 代码如下 bean.xml <?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="date" name="myDate" class="java.util.Date"/> <bean id="helloBean" class="javamxj.spring.basic.autowiring.HelloBean" dependency-check="simple"> <property name="hello" value="javamxj"/> </bean> <bean id="HelloByName" class="javamxj.spring.basic.autowiring.HelloDate" autowire="byName"/> <bean id="HelloByType" class="javamxj.spring.basic.autowiring.HelloDate" autowire="byType"/> <bean id="HelloConstructor" class="javamxj.spring.basic.autowiring.HelloDate" autowire="constructor"/> <bean id="HelloAutodetect" class="javamxj.spring.basic.autowiring.HelloDate" autowire="autodetect"/> <bean id="helloCheck" class="javamxj.spring.basic.autowiring.HelloDate" autowire="byType" dependency-check="objects"> <property name="date2"> <bean class="java.util.GregorianCalendar"/> </property> <!-- <property name="date" ref="date"/>--> <!-- <property name="hello" ref="helloBean"/>--> </bean> </beans> HelloBean.java public class HelloBean { private String hello; public String getHello() { return hello; } public void setHello(String hello) { this.hello = hello; } } HelloDate.java public class HelloDate { public HelloDate() { System.out.println("defalt Constructor called"); } public HelloDate(HelloBean hello) { System.out.println("HelloDate(HelloBean) called"); } public HelloDate(HelloBean hello, Date date) { System.out.println("HelloDate(HelloBean,Date) called"); } public void setHello(HelloBean hello) { System.out.println("Property hello set"); } public void setDate(Date date) { System.out.println("Property date set"); } public void setDate2(GregorianCalendar date) { System.out.println("Property date2 set"); } } main.java public class Main { public static void main(String[] args) { BeanFactory bf = new XmlBeanFactory(new ClassPathResource( "javamxj/spring/basic/autowiring/beans.xml")); System.out.println("使用 byName:"); HelloDate hb = (HelloDate) bf.getBean("HelloByName"); System.out.println("\n使用 byType:"); hb = (HelloDate) bf.getBean("HelloByType"); System.out.println("\n使用 constructor:"); hb = (HelloDate) bf.getBean("HelloConstructor"); System.out.println("\n使用 autodetect:"); hb = (HelloDate) bf.getBean("HelloAutodetect"); System.out.println("\n使用 dependency-check:"); hb = (HelloDate) bf.getBean("helloCheck"); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-07
一直没有考虑过使用autowire,现在可以试着在某些情况下使用一下了
|
|
返回顶楼 | |
发表时间:2007-04-18
spring自身有没有定义bean的配置文件
如果有 autowire是不是也能自动装载spring自身定义的bean呢? |
|
返回顶楼 | |