© 版权声明:本文为博主原创文章,转载请注明出处

Bean的自动装配(Autowiring)

no:不启用自动装配,此时需要手动注入。参考:Spring学习三----------注入方式

default:优先执行constructor,然后byType,最后byName

byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配

byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么跑出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则说明事都不发生

constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

1.项目结构

2.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springbean</groupId>
<artifactId>Spring-AutoAssemble</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Spring-AutoAssemble Maven Webapp</name>
<url>http://maven.apache.org</url> <properties>
<spring.version>4.3.7.RELEASE</spring.version>
</properties> <dependencies>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies> <build>
<finalName>Spring-AutoAssemble</finalName>
</build>
</project>

3.AutowiringDao.java

package org.spring.autowiring.dao;

public interface AutowiringDao {

	public void say(String word);

}

4.AutowiringDaoImpl.java

package org.spring.autowiring.dao.impl;

import org.spring.autowiring.dao.AutowiringDao;

public class AutowiringDaoImpl implements AutowiringDao {

	public void say(String word) {

		System.out.println("AutowiringDaoImpl接受参数:" + word);

	}

}

5.AutowiringService.java

package org.spring.autowiring.service;

public interface AutowiringService {

	public void say(String word);

}

6.AutowiringServiceImpl.java

  6.1 byName和byType

package org.spring.autowiring.service.impl;

import org.spring.autowiring.dao.AutowiringDao;
import org.spring.autowiring.service.AutowiringService; public class AutowiringServiceImpl implements AutowiringService { //byName时,必须与bean配置的id一致;byType时,可随意命名。本次修改bean的id,不再修改该属性名;效果一样
private AutowiringDao autowiringDao; /**
* (byName和byType)只需setter方法
* @param autowiringDao
*/
public void setAutowiringDao(AutowiringDao autowiringDao) { this.autowiringDao = autowiringDao; } public void say(String word) { System.out.println("AutowiringServiceImpl接受参数:" + word);
autowiringDao.say(word); } }

  6.2 constructor

package org.spring.autowiring.service.impl;

import org.spring.autowiring.dao.AutowiringDao;
import org.spring.autowiring.service.AutowiringService; public class AutowiringServiceImpl implements AutowiringService { private AutowiringDao autowiringDao; /**
* constructor时存在;byName和byType时存在会报错
*
* @param autowiringDao
*/
public AutowiringServiceImpl(AutowiringDao autowiringDao) { this.autowiringDao = autowiringDao; } public void say(String word) { System.out.println("AutowiringServiceImpl接受参数:" + word);
autowiringDao.say(word); } }

7.spring-autowiring.xml(三选一)

  7.1 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"
default-autowire="byName"> <bean id="autowiringService" class="org.spring.autowiring.service.impl.AutowiringServiceImpl"/> <bean id="autowiringDao" class="org.spring.autowiring.dao.impl.AutowiringDaoImpl"/> </beans>

  7.2 byType和constructor

<?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"
default-autowire="byType"> <bean id="autowiringService" class="org.spring.autowiring.service.impl.AutowiringServiceImpl"/> <bean class="org.spring.autowiring.dao.impl.AutowiringDaoImpl"/> </beans>

8.JunitTestBase.java

package org.spring.autowiring.test;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils; /**
* 单元测试基类
*
*/
public class JunitTestBase { private ClassPathXmlApplicationContext context;
private String springXmlPath; /**
* 无参构造器,使用此构造器创建对象,使用默认spring配置文件
*/
public JunitTestBase() { } /**
* 含参构造器,初始化spring配置文件路径
*
* @param springXmlPath
* spring配置文件路径
*/
public JunitTestBase(String springXmlPath) { this.springXmlPath = springXmlPath; } /**
* 启动spring容器,在@Test方法执行之前执行
*/
@Before
public void start() { if(StringUtils.isEmpty(springXmlPath)) {//设置默认spring配置文件路径
springXmlPath = "classpath:spring-*.xml";
}
//加载spring配置文件到spring容器中
context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));
//启动spring容器,并扩散启动信号到该容器下的所有组件
context.start(); } /**
* 销毁spring容器,在@Test方法执行之前执行
*/
@After
public void stop() { if(context != null){
context.destroy();
} } /**
* 通过bean id获取bean对象
*
* @param beanId
* bean id
* @return
*/
public Object getBean(String beanId) { return context.getBean(beanId); } }

9.TestAutowiring.java

package org.spring.autowiring.test;

import org.junit.Test;
import org.spring.autowiring.service.AutowiringService; public class TestAutowiring extends JunitTestBase { /**
* 通过构造器传递spring配置文件路径
*/
public TestAutowiring() { super("classpath:spring-autowiring.xml"); } @Test
public void testAutowiring() { AutowiringService autowiringService =
(AutowiringService) super.getBean("autowiringService");
autowiringService.say("test"); } }

10.效果预览

  10.1 byName或byType(AutowiringServiceImpl.java中含有自定义构造器时)

  10.2 byName(AutowiringServiceImpl.java中不含有自定义构造器时)

  10.3 byType(spring-autowiring.xml中dao层配置的bean中id不存在时)

  10.4 byType(spring-autowiring.xml中dao层配置的bean中id存在时)---只是样式不一样而已。。。

  10.5 constructor

更多测试情况,可自行测试。

参考:http://www.imooc.com/video/3757

Spring学习七----------Bean的配置之自动装配的更多相关文章

  1. Spring学习十----------Bean的配置之Autowired注解实现

    © 版权声明:本文为博主原创文章,转载请注明出处 @Required -@Required注解适用于bean属性的setter方法 -这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在b ...

  2. Java开发学习(七)----DI依赖注入之自动装配与集合注入

    一.自动配置 上一篇博客花了大量的时间把Spring的注入去学习了下,总结起来就两个字麻烦.麻烦在配置文件的编写配置上.那有更简单方式么?有,自动配置 1.1 依赖自动装配 IoC容器根据bean所依 ...

  3. Spring学习记录(十一)---使用注解和自动装配

    Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入c ...

  4. Spring学习十一----------Bean的配置之基于Java的容器注解@Bean

    © 版权声明:本文为博主原创文章,转载请注明出处 @Bean -@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/> -可 ...

  5. Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现

    © 版权声明:本文为博主原创文章,转载请注明出处 Spring Bean常用注解 @Component:通常注解,可用于任何Bean @Repository:通常用于注解DAO层,即持久层 @Serv ...

  6. Spring学习五----------Bean的配置之Bean的生命周期

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的生命周期 1.定义 2.初始化 3.使用 4.销毁 初始化和销毁的三种方式 1.实现org.springframework.beans.fa ...

  7. Spring学习八----------Bean的配置之Resources

    © 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...

  8. spring学习六----------Bean的配置之Aware接口

    © 版权声明:本文为博主原创文章,转载请注明出处 Aware Spring提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化后,可以获取相应的资源 通过Aware接口,可以对S ...

  9. Spring学习四----------Bean的配置之Bean的配置项及作用域

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...

随机推荐

  1. OpenJudge 2971 抓住那头牛

    总时间限制:  2000ms 内存限制:  65536kB 描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0< ...

  2. EF4.2预览版出来了

    原文发布时间为:2011-09-21 -- 来源于本人的百度文章 [由搬家工具导入] http://blogs.msdn.com/b/adonet/archive/2011/08/22/ef-4-2- ...

  3. DB迁移:从SQL Server 2005到MySQL

    一.工具选择 依工作需要进行老产品升级,其中一项重要工作就是将SQL Server数据库改为MySQL数据库,故而在对<各种主流 SQLServer 迁移到 MySQL 工具对比>文章学习 ...

  4. 自定义JS类,并扩展其方法和属性

    function CT() { } CT.prototype.P = "TTT"; CT.Test = function () { alert(arguments[0]); }; ...

  5. AtCoder Regular Contest 077 E - guruguru 线性函数 前缀和

    题目链接 题意 灯有\(m\)个亮度等级,\(1,2,...,m\),有两种按钮: 每次将亮度等级\(+1\),如\(1\rightarrow 2,2\rightarrow 3,...,m-1\rig ...

  6. java使用dbutils工具类实现小程序 管家婆记账软件

    1.所需创建的包和 jar包 2.创建表结构  #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...

  7. ASP.NET MVC 利用Razor引擎生成静态页

    实现原理及步骤: 1.通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView: 2. ...

  8. 树的直径新求法、codeforces 690C3 Brain Network (hard)

    树的直径新求法 讲解题目 今天考了一道题目,下面的思路二是我在考场上原创,好像没人想到这种做法,最原始的题目,考场上的题目是这样的: 你现在有1 个节点,他的标号为1,每次加入一个节点,第i 次加入的 ...

  9. vue.js移动端app实战2

    貌似有部分人要求写的更详细,这里多写一点vuel-cli基础的配置 什么是vue-cli? 官方的解释是:A simple CLI for scaffolding Vue.js projects,简单 ...

  10. PHP处理Android的POST数据

    今天用PHP开发Android网络数据接口的时候,发现Thinkphp的I函数(php的$_POST)并不能获取到androidpost过来的数据 Android代码如下: Map<String ...