zoukankan      html  css  js  c++  java
  • Spring点滴十:Spring自动装配(Autowire)

         在基于XML配置元数据,在bean的配置信息中我们可以使用<constructor-arg/>和<property/>属性来实现Spring的依赖注入。Spring 容器也可以在不使用<constructor-arg/>和<property/>元素下自动装配各个bean之间的依赖关系。

    自动装配模式:

          在基于XML配置元数据时,你可以使用bean元素的autowire属性来指定具体的自动装配模式。Spring提供了5中自动装配模式。

    模式 讲解
    no 这是默认设置,意味着它没有使用自动装配模式。你应该显示的使用bean引用来连接
    byName 由属性名自动装配。Spring 容器看到bean采用了自动装配byName模式(autowire="byName"),然后根据它的属性在Spring 容器中寻找与属性名相同bean进行关联
    byType 由属性的数据类型自动装配。Spring容器看到bean采用了自动装配的byType模式(autowire="byType"),然后根据属性类型在Spring容器中寻找与属性类型相同bean进行关联。如果存在不止一个这样的bean,将抛出异常。
    constructor 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生
    autodetect Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配

    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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
         <bean id="autowireTest1" class="com.test.spring.AutowireTest1" autowire="byName">
         </bean>
         <bean id="autowireTest2" class="com.test.spring.AutowireTest2">
         </bean>
    </beans>

    Java 类:

    package com.test.spring;
    
    public class AutowireTest1 {
        
        private  AutowireTest2 autowireTest2;
    
        public AutowireTest2 getAutowireTest2() {
            return autowireTest2;
        }
    
        public void setAutowireTest2(AutowireTest2 autowireTest2) {
            this.autowireTest2 = autowireTest2;
        }
    }
    -------------------------------------------------------------------------------------------
    package com.test.spring;
    
    public class AutowireTest2 {
    
    }

    测试:

    package com.test.spring;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class T {
        ApplicationContext applicationcontext=null;
        @Before
        public void before() {
            System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
            applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
            System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
        }
        @Test
        public void  test() {
            AutowireTest1 autowireTest1= applicationcontext.getBean(AutowireTest1.class);
            System.out.println(autowireTest1.getAutowireTest2());
        }
    }

    测试结果:

    》》》Spring ApplicationContext容器开始初始化了......
    2017-03-19 22:53:54  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@496419dc: startup date [Sun Mar 19 22:53:54 CST 2017]; root of context hierarchy
    2017-03-19 22:53:54  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
    》》》Spring ApplicationContext容器初始化完毕了......
    com.test.spring.AutowireTest2@63465272

    byType:

    只需要将bean改为如下:

    <bean id="autowireTest1" class="com.test.spring.AutowireTest1" autowire="byType">

    测试结果:

    》》》Spring ApplicationContext容器开始初始化了......
    2017-03-19 22:53:54  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@496419dc: startup date [Sun Mar 19 22:53:54 CST 2017]; root of context hierarchy
    2017-03-19 22:53:54  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
    》》》Spring ApplicationContext容器初始化完毕了......
    com.test.spring.AutowireTest2@63465272

    constructor:

    只需要将bean改为如下:

    <bean id="autowireTest1" class="com.test.spring.AutowireTest1" autowire="constructor">
    对应AutowireTest1类改为:
    package com.test.spring;
    
    public class AutowireTest1 {
        
        private  AutowireTest2 autowireTest2;
    
        public AutowireTest1(AutowireTest2 autowireTest2) {
            this.autowireTest2 = autowireTest2;
        }
    }
    
    

    测试结果输出:

    》》》Spring ApplicationContext容器开始初始化了......
    2017-03-20 09:13:48  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4752dd7b: startup date [Mon Mar 20 09:13:48 CST 2017]; root of context hierarchy
    2017-03-20 09:13:48  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
    》》》Spring ApplicationContext容器初始化完毕了......
    com.test.spring.AutowireTest1@43bb703d

    总结:

      自动装配的好处:

         自动装配可以有效减少bean标签的<constructor-arg/>或<property/>元素的使用

     自动装配的局限性和不利条件:

        1.显示的依赖注入<constructor-arg/>或<property/>会重写自动装配。不能自动装配基本数据类型、字符串、数组等,这是自动装配设计的局限性。

        2.自动装配不如显示依赖注入精确。如果有可能尽量使用显示依赖注入。

  • 相关阅读:
    使用CSS将图片转换成黑白(灰色、置灰)
    require.js
    Tortoisegit安装下载
    谷歌浏览器添加扩展程序
    IOS 照相问题
    java的interface和PHP的区别
    Object中的hashCode方法
    PHP、js、Java中的匿名函数、闭包、回调函数
    Java和PHP中的浅克隆和深克隆
    unicode字符编码中一些专业词汇的全称
  • 原文地址:https://www.cnblogs.com/sishang/p/6583057.html
Copyright © 2011-2022 走看看