`
langgufu
  • 浏览: 2288853 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring <bean>标签属性 Autowire自动装配(转载)

阅读更多

在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象。但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的<ref>标签。实际上,这种方式也会在另一种形式上增加了应用程序的复杂性,那么如何解决这个问题呢?Spring为我们提供了一个自动装配的机制,尽管这种机制不是很完善,但是在应用中结合<ref>标签还是可以大大的减少我们的劳动强度。前面提到过,在定义Bean时,<bean>标签有一个autowire属性,我们可以通过指定它来让容器为受管JavaBean自动注入依赖对象。

<bean>autowire属性有如下六个取值,他们的说明如下:

1、 No:即不启用自动装配。Autowire默认的值。

2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printerbean,然后使用Seter方法为其注入。

3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printerbean,使用Seter方法为其注入。

4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。

5、 autodetect:在byTypeconstructor之间自动的选择注入方式。

6、 default:由上级标签<beans>default-autowire属性确定。

注意:在配置bean时,<bean>标签中Autowire属性的优先级比其上级标签高,即是说,如果在上级标签中定义default-autowire属性为byName,而在<bean>中定义为byType时,Spring IoC容器会优先使用<bean>标签的配置。

下面通过一个例子来说明如何在应用中使用自动装配(工程代码见例程3.2)。新建一个java工程,为其添加上Spring开发能力后,创建一个ioc.test包,再分别创建电脑类(Computer)、主机类(Host)和显示器类(Dispaly),为电脑类添加Host类型的属性hostDisplay类型的属性display,再添加一个run方法,让电脑可以“运行”一起来。属性代码如下:

电脑类:

 1package ioc.test;
 2
 3/**
 4 * @author zhangyong
 5*/

 6public class Computer {
 7    
 8    private Host host;
 9    private Display display;
10    //电脑运行方法
11    public void run(){
12        System.out.println("你好,我是电脑,正在运行!");
13        System.out.print("   "+host.run()+",");
14        System.out.println(display.run());
15    }

16//Geter和Seter方法,省略
17}

18


 

再给主机类添加一run方法,让主机也可以“运行”,代码如下:

 

1package ioc.test;
2
3public class Host {
4    public String run(){
5        return "我是主机,正在运行!";
6    }

7}

8


  同上也给Display添加run方法,如下:

1package ioc.test;
2
3public class Display {
4    public String run(){
5        return "我是显示器,正在运行!";
6    }

7}

8

 

下面便是修改Spring的配置文件,让IoC容器为我们的“电脑”自动装配“主机”和“显示器了”。分别配置两个beanhostdisplay。再配置一个名computer1beanautowire属性设为byName,同理配置computer1computer3autowire属性分别设为byTypedefault,最后设置<beans>标签的default-autowire属性为autodetect。至此,配置工作已经完成,可以看到,我们并没有显式的给computer bean它注入依赖对象hostdisplay。配置代码如下:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans    default-autowire="autodetect">
 3    <bean id="computer1" class="ioc.test.Computer" autowire="byName"></bean>
 4    <bean id="computer2" class="ioc.test.Computer" autowire="byType"></bean>
 5    <bean id="computer3" class="ioc.test.Computer" autowire="default"></bean>
 6    
 7    <bean id="host" class="ioc.test.Host"></bean>
 8    <bean id="display" class="ioc.test.Display"></bean>    
 9</beans>
10

现在可以建立一个测试类来测试一下Spring时候真的为我们自动装配好了我们需要的bean。代码如下:

 1package ioc.test;
 2
 3//import省略
 4public class TestMain {
 5
 6    public static void main(String[] args) {
 7        ApplicationContext ac = new ClassPathXmlApplicationContext(
 8                "applicationContext.xml");
 9        //byName
10        Computer computer1 = (Computer)ac.getBean("computer1");
11        System.out.println("autowire=\"byName\":");
12        computer1.run();
13        
14        //byType
15        Computer computer2 = (Computer)ac.getBean("computer2");
16        System.out.println("autowire=\"byType\":");
17        computer2.run();
18        
19        //default
20        Computer computer3 = (Computer)ac.getBean("computer3");        
21        System.out.println("autowire=\"default\":");
22        computer3.run();
23    }

24}

25

运行该类,输出结果如下:

 
从运行结果可以看出,Spring IoC容器已经为我们自动的装配好的“电脑”,从而配置文件简洁了许多。但是,自动装配并不是十全十美的,我们不论是使用byName还是byType的方法,Spring不一定就能很准确的为我们找到JavaBean依赖的对象。另外,如果使用自动装配,Spring配置文件的可读性也大大降低,我们不能很容易的看出个bean之间的依赖关系,这也在一定程度上降低了程序可维护性。因此在使用自动装配时,应当权衡利弊,合理的与ref的方法相结合,尽量在降低工作量的同时,保证应用的可维护度。

分享到:
评论
1 楼 calm01 2017-06-15  
  学习了.

相关推荐

    Jimmy-Ma#SpringDemo#004.自动装配(XML)1

    使用autowire属性指定自动装配的方式byName根据bean的名字和当前bean的setter风格属性名进行自动装配若有匹配,则自动转配若无匹配,则不装配

    spring2.5学习PPT 传智博客

    13.@Autowire注解与自动装配 14.让Spring自动扫描和管理Bean 15.使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP...

    springboot-autowire:学习springboot自动装配原理

    #学习springboot自动装配 ##一,手动装配 ### 1,模式注解装配 @Component注解,或者@Component注解的扩展,@ Controller,@ Service,存储库,@ Configruation等, ### 2. @ Configuration启动容器+ @ Bean注册...

    xmljava系统源码-SpringInAction4:《SpringInAction4th》学习笔记

    可以在一个应用上下文中定义多个配置文件,每个配置文件设置自己的默认自动装配策略(default-autowire) 如果使用constructor自动装配策略,就不能混合使用constructor-arg 注解方式可以实现更细粒度的自动装配,...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.3.6. 自动装配(autowire)协作者 3.3.6.1. 设置Bean使自动装配失效 3.3.7. 依赖检查 3.3.8. 方法注入 3.3.8.1. Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. ...

    Spring中文帮助文档

    3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的依赖 3.4.4. 其他作用域 ...

    Spring API

    3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的依赖 3.4.4. 其他作用域 ...

    Spring 2.0 开发参考手册

    3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1...

    spring chm文档

    3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1...

    spring学习过程

    spring基础,主要讲解了 spring的autowire:自动装配 collections:属性配置的细节 properties:外部属性文件的使用 relati:bean之间的关系 scope:bean的作用域 spel:spel的使用

    Spring的学习笔记

    八、 自动装配autowire 13 (一) byName 13 (二) byType 14 (三) 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:...

    spring2.5 学习笔记

    八、 自动装配autowire 13 (一) byName 13 (二) byType 14 (三) 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:...

    Struts2属性文件详解

    指定Spring框架的自动装配模式, 该属性的默认值是name, 即默认根据Bean的name属性自动装配. struts.objectFactory.spring.useClassCache 该属性指定整合Spring框架时,是否缓存Bean实例,该属性只允许使用true和false...

    mockitobeans

    概述Mockitobeans是一个 ,通过使用Spring自己的@Autowire语法,您可以无缝地对所有bean进行自动装配。历史mockitobeans时,我一直在寻找一种方式来开始使用嘲笑说已经自动装配依赖其中有额外的自动装配Autowired的...

Global site tag (gtag.js) - Google Analytics