采用构造函数注入,以及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. unity 优秀开源项目

    ihaiu.GUIDRef (查看项目资源使用情况) http://blog.ihaiu.com/unity-GUIDRef Ihaiu.PoolManager (对象池) http://github ...

  2. java 读取配置文件类

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; im ...

  3. linux查看内存、CPU占用资源最多的进程

    [内存占用] #利用ps命令,默认使用ps参数会显示的结果 ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 ...

  4. android studio实现Intent通信-------牛刀小试

    概述: 本博文实现一种小程序,两个Activity单向通信,主从关系,MainActivty 页面布局一个EditText+Button,实现逻辑是单击按钮将信息发送给另外一个DisplayMessa ...

  5. AT994 【11の倍数】

    超短AC代码压行小技巧 #include<iostream> using namespace std; string s; ]; int main() { cin>>s; in ...

  6. JAVA复习笔记分布式篇:zookeeper

        前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能:     概念:ZooK ...

  7. 一键开关VS的release模式优化

    因为我们公司的项目规模非常大了,如果日常调试使用debug模式的话,每次调试启动都要非常长的时间,因此大多数人使用release关优化的方式来进行日常开发.但是因为持续集成的存在,上传的代码要求是开启 ...

  8. Java读取本地文件(输入流)

    package cn.buaa; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; imp ...

  9. OA项目CRUD和单元测试(一)

    使用ModeFirst方法生成数据库,EntityFramework5.0. 一:Model层的模型:(根据模型生成数据库) 二:Dal层的UserInfo代码: namespace SunOA.EF ...

  10. sql中循环插入

    #!/bin/sh for i in {1..10}dokdsql sys/kdb<<EOF insert into test values(2) ; EOFdone