在基于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.自动装配不如显示依赖注入精确。如果有可能尽量使用显示依赖注入。

最新文章

  1. Android 异步任务,通过PHP访问数据库,多线程,线程间通讯
  2. TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理
  3. .NET3.5中JSON用法以及封装JsonUtils工具类
  4. java多线程之:SynchronousQueue队列
  5. Arraylist和Vector的区别与HashMap和Hashtable的区别
  6. delphi7如何实现 科学计数的转换。 比如我输入2,触发之后会转换成2.000000E+00.求赐教
  7. poj 3980 取模运算
  8. Oracle数据库作业-4 查询
  9. WinForm控件小知识
  10. CentOS6.5下docker的安装及遇到的问题和简单使用
  11. C#中类的默认访问是私有的
  12. longlistselector 闪烁问题研究
  13. Java中的Object、T(泛型)、?区别
  14. 你知道BFC、IFC、FFC、GFC及多栏自适应布局吗?
  15. Python3 指定文件夹下所有文件(包括子目录下的文件)拷贝到目标文件夹下
  16. 如何在mysql客户端即mysql提示符下执行操作系统命令
  17. 用 PLSQL 创建新用户及导入 dmp
  18. Extjs6 modern formpanel 上传文件 问题
  19. 12.C# 接口和抽象类的区别
  20. Jmeter(三十四)Jmeter-Question之“Cookie获取”

热门文章

  1. [Lydsy1805月赛]对称数 BZOJ5361
  2. Scala--操作符
  3. spark-windows(含eclipse配置)下本地开发环境搭建
  4. Python 语言简介
  5. Android开发——Android多进程以及使用场景介绍
  6. linux gz 解压缩
  7. CentOS7永久挂载硬盘
  8. eclipse 最最最常用快捷键
  9. JAVAWEB 项目注册登录模块问题总结
  10. 使用Redis做分布式