采用构造函数注入,以及setter方法注入都需要写大量的XML配置文件,这时可以采用另一种方式,就是自动装,由Spring来给我们自动装配我们的Bean.

Spring提供了四种自动装配类型

1:ByName 采用这种方式时给属性自动注入值时,会根据Bean里的setXXX中的XXX去搜寻有没有id=XXX的Bean,有的话,将其自动注入,没有的话,就表示setXXX里要装入属性没有装配值。

2:ByType 采用这种方式给属性自动注入值时,会根据Bean里的setXXX中的参数类型来搜寻配置文件中的Bean定义,如果发现了一个,就自动将其注入,否则如果有0个这个属性没有被装配,如果有多个,则会抛出异常。

3:constructor 这种方式的注入与ByType其实没什么区别,无非是将ByType移入到了构造函数中,这种方式下,构造函数是自动注入的,在构造对象时,会自动根据构造函数的参数类型搜寻Bean,如果有一个合适的,则成功,一个没有,则失败,有多个,则会抛出异常。

4:autodetect 自动检测方式,会采用如下流程,先按照constructor方式,再按照ByType方式。

例子源代码如下

例子一个Java工程师从一个网站上买东本

一个普通的JavaBean

interface Engineer{
Object buyApple();
}
public class JavaEngineer implements Engineer{
private String name;
private Website ws;
public JavaEngineer(String name){
this.name=name;
}
public void setWebsite(Website ws){
this.ws=ws;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
public Object buyApple(){
System.out.print("工程师"+name);
return ws.buyApple();
}
}

这个网站假设是淘宝网:

interface Website{
Object buyApple();
}
public class TaobaoWebsite implements Website {
public TaobaoWebsite()
{
}
public Object buyApple()
{
System.out.println("购买了一个苹果");
return new Object();
}
}

则采用自动装配的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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 这个名字要和setXXX中的XXX保持一致,不区分大小写 -->
<bean id="website" class="com.pp.TaobaoWebsite"/>
<bean id="engineer" class="com.pp.JavaEngineer" autowire="byName">
<constructor-arg value="ppTest"/>
<!-- 这里有一个属性采用的是自动byName的方式注入的 -->
</bean>
</beans>

打印结果如下:

工程师ppTest购买了一个苹果

有了第一个结果后,第二个结果也就很简单了

ByType的测试

修改配置文件如下

	<!-- 这个名字 不再需要和setXXX中的XXX保持一致-->
<bean id="web" class="com.pp.TaobaoWebsite"/>
<bean id="engineer" class="com.pp.JavaEngineer" autowire="byType">
<constructor-arg value="ppTest"/>
<!-- 这里有一个属性采用的是自动byName的方式注入的 -->
</bean>

其他的地方可以不用修改。

Constructor自动装配,为了测试,给JavaEngineer加入一个构造函数,如下方式

	public JavaEngineer(Website ws){
this.ws=ws;
this.name="ppTest";
}

再修改配置文件如下

	<bean id="web" class="com.pp.TaobaoWebsite"/>
<bean id="engineer" class="com.pp.JavaEngineer" autowire="constructor">
<!--<constructor-arg value="ppTest"/>-->
<!-- 这里有一个属性采用的是自动byName的方式注入的 -->
</bean>

结果是一样的。

自动装配autodetect,通过将autowire设置为autodetect,是指示Spring容器让它先尝试使用constructor自动装配,如果没有找到合适的Bean,就尝试使用ByType自动装配,新版本中好象已经没有这个属性了。

[置顶] Spring的自动装配的更多相关文章

  1. spring的自动装配,骚话@Autowired的底层工作原理

    前言 开心一刻 十年前,我:我交女票了,比我大两岁.妈:不行!赶紧分! 八年前,我:我交女票了,比我小两岁,外地的.妈:你就不能让我省点心? 五年前,我:我交女票了,市长的女儿.妈:别人还能看上你?分 ...

  2. 五、Spring之自动装配

    Spring之自动装配 ​ Spring利用依赖注入(DI),完成对IOC容器中各个组件依赖关系的赋值. [1]@Autowired @Autowired 注解,它可以对类成员变量.方法及构造函数进行 ...

  3. spring注解-自动装配

    Spring利用依赖注入(DI)完成对IOC容器中中各个组件的依赖关系赋值 一.@Autowired 默认优先按照类型去容器中找对应的组件(applicationContext.getBean(Boo ...

  4. Spring的自动装配Bean

    spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会 ...

  5. spring完成自动装配

    让spring完成自动装配 Autowiring 解决标签为javaBean注入时难以维护而实现的 下面是几种autowire type的说明: 1,byname:试图在容器中寻找和需要自动装配的属性 ...

  6. spring中自动装配bean

    首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...

  7. Spring Boot 自动装配(二)

    目录 目录 前言 1.起源 2.Spring Boot 自动装配实现 2.1.@EnableAutoConfiguration 实现 2.1.1. 获取默认包扫描路径 2.1.2.获取自动装配的组件 ...

  8. Eureka 系列(03)Spring Cloud 自动装配原理

    Eureka 系列(03)Spring Cloud 自动装配原理 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 本文主要是分析 Spring Cloud 是如何整合 Eu ...

  9. Spring Boot自动装配

    前言 一些朋友问我怎么读源码,这篇文章结合我看源码时候一些思路给大家聊聊,我主要从这三个方向出发: 确定目标,这个目标要是一个具体,不要一上来我要看懂Spring,这是不可能的,目标要这么来定,比如看 ...

随机推荐

  1. ArcMap2SLD添加中文支持

    首先,你可以从作者提供的链接下载ArcMap2SLD.zip(支持ArcMap10.2) 1.打开LUT_sld_mapping_file.xml文件(上传文件中已经修改)修改文件<LUT> ...

  2. SQLAlchemy-对象关系教程ORM-create

    ORM是建立在SQL语言构造器之上的工具集,用于将Python对象映射到数据库的行,提供了一系列接口用于从数据库中存取对象(行).在ORM 工作时,在底层调用SQL语言构造器的API,这些通用的操作有 ...

  3. maven pom.xml配置

    <repositories> <repository> <id>central</id> <name>Maven Repository Sw ...

  4. 查找sqlserver数据库中,查询某值所表名和字段名

    有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将这个存储过程放在所查询的数据库. CR ...

  5. python 统计MySQL大于100万的表

    一.需求分析 线上的MySQL服务器,最近有很多慢查询.需要统计出行数大于100万的表,进行统一优化. 需要筛选出符合条件的表,统计到excel中,格式如下: 库名 表名 行数 db1 users 1 ...

  6. 浅谈C#中的模式窗体和非模式窗体

    ShowDialog(); // 模式窗体 Show(); // 非模式窗体 区别: 返回值不同,DialogResult/void 模式窗体会使程序中断,直到关闭模式窗口 打开模式窗体后不能切换到应 ...

  7. 使用mongo-java-driver-3.0.2连接MongoDB数据库

    这里使用的mongodb的java驱动版本是:3.0.2,文件名mongo-java-driver-3.0.2.jar  博客本地下载下载网址(也可以下载其它版本):http://central.ma ...

  8. CCF CSP 201412-3 集合竞价

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-3 集合竞价 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确 ...

  9. linux kernel.shmall shemax shemin解释

        Linux X86-64操作系统,Oracle 10g数据库,由8G加到16G,把kernel.shmmax参数改到17179869184(16G)后,发现只要修改sga_max_size和s ...

  10. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...