自动装备

1、定义

  • 自动装配(autowiring): 将某个Bean实例中所引用的其它的Bean自动注入到当前Bean实例中
  • 自动装配就是指由Spring来自动地注入依赖对象,无需人工参与。
  • 自动装配的好处是减少构造器注入和setter注入配置,减少配置文件的长度。自动装配通过配置<bean>标签的 “autowire”属性来改变自动装配方式。

2、四种装配方式

  • no(default): 默认值,即不启动自动装配,需要显示地引用相应的bean

    setter 注入 : ( setter-base ),提供setter方法进行注入,依赖于无参构造和setter方法

    Person类

    package ecut.ioc.autowiring;
    
    public class Person {
    
        private Integer id;
    private String name; private Dog wangcai ; public Person() {
    super();
    } public Person(Dog wangcai) {
    super();
    this.wangcai = wangcai;
    System.out.println( "public Person(Dog)" );
    } public Integer getId() {
    return id;
    } public void setId(Integer id) {
    this.id = id;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Dog getWangcai() {
    return wangcai;
    } public void setWangcai(Dog wangcai) {
    this.wangcai = wangcai;
    } }

    Dog类

    package ecut.ioc.autowiring;
    
    public class Dog {
    
        private String name ;
    
        public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } }

    配置文件

    <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <bean id="p" class="ecut.ioc.autowiring.Person" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    <property name="wangcai" ref="dog" />
    </bean>

    构造方法注入 : ( constructor-base )通过构造方法往里面传入值

    配置文件

    <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <bean id="p" class="ecut.ioc.autowiring.Person" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    <constructor-arg name="wangcai" ref="dog" />
    </bean>
  • byName: 根据属性名称和被引用的bean名称来实现自动注入(setter)

    byName-autowiring.xml

    <?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-4.3.xsd"> <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <bean id="wangcai" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="旺财" />
    </bean> <!-- 根据 名称 实现 自动装配 ( setter ) -->
    <bean id="huaan" class="ecut.ioc.autowiring.Person" autowire="byName" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    <!-- <property name="wangcai" ref="wangcai" /> -->
    </bean> </beans>

    如果在被装配的bean中含有xxx属性(实际上是setter方法),则会自动把id为xxx的bean装配上来
    测试类

    package ecut.ioc.autowiring;
    
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext; public class AutowireByName { public static void main(String[] args) { String configLocations = "classpath:ecut/**/byName-autowiring.xml" ; AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations ); Person s = container.getBean( "huaan" , Person.class ); System.out.println( s.getId() + " : " + s.getName() ); Dog d = s.getWangcai(); System.out.println( d.getName() ); container.close(); } }
  • byType: 根据属性类型和被引用的bean的类型来实现自动注入(setter)

    byType-autowiring.xml

    <?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-4.3.xsd"> <!-- NoUniqueBeanDefinitionException
    <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean>
    --> <bean id="wangcai" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="旺财" />
    </bean> <!-- 根据 类型 实现 自动装配 ( setter ) -->
    <bean id="huaan" class="ecut.ioc.autowiring.Person" autowire="byType" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    </bean> </beans>

    如果在被装配的bean中含有一个xxx类型的属性,则会自动把类型为xxx的bean装配上来,但是如果含有多个xxx类型的bean,则抛出NoUniqueBeanDefinitionException
     测试案例

    package ecut.ioc.autowiring;
    
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext; public class AutowireByType { public static void main(String[] args) { String configLocations = "classpath:ecut/**/byType-autowiring.xml" ; AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations ); Person s = container.getBean( "huaan" , Person.class ); System.out.println( s.getId() + " : " + s.getName() ); Dog d = s.getWangcai(); System.out.println( d.getName() ); container.close(); } }
  • constructor: 根据构造方法的参数类型和被引用的Bean的类型实现自动装配(constructor)

    当存在多个同种类型的Bean与构造方法中的参数类型相同时:
    如果某Bean的名称跟参数的名称一致,则根据名称进行自动装配。constructor-autowiring.xml中bean的名称和构造方法中 public Person(Dog wangcai) 的参数保持一致。下面配置输出狗的名称是旺财

    <?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-4.3.xsd"> <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <bean id="wangcai" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="旺财" />
    </bean> <!-- 根据 类型 实现 自动装配 ( constructor ) -->
    <bean id="huaan" class="ecut.ioc.autowiring.Person" autowire="constructor" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    </bean> </beans>

    如果这些Bean的名称跟参数的名称都不相同,则不再执行自动装配。但是,也不抛出异常

    <?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-4.3.xsd"> <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <bean id="wc" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="旺财" />
    </bean> <!-- 根据 类型 实现 自动装配 ( constructor ) -->
    <bean id="huaan" class="ecut.ioc.autowiring.Person" autowire="constructor" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    </bean> </beans>

    当且仅当与构造方法中的参数类型相同的Bean只有一个时,此时根据类型进行自动装配。下面配置输出狗的名称是拉的多不多

    <?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-4.3.xsd"> <bean id="dog" class="ecut.ioc.autowiring.Dog" >
    <property name="name" value="拉的多不多" />
    </bean> <!-- 根据 类型 实现 自动装配 ( constructor ) -->
    <bean id="huaan" class="ecut.ioc.autowiring.Person" autowire="constructor" >
    <property name="id" value="1001" />
    <property name="name" value="华安" />
    </bean> </beans>

    测试类

    package ecut.ioc.autowiring;
    
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext; public class AutowireByConstructor { public static void main(String[] args) { String configLocations = "classpath:ecut/**/constructor-autowiring.xml" ; AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations ); Person s = container.getBean( "huaan" , Person.class ); System.out.println( s.getId() + " : " + s.getName() ); Dog d = s.getWangcai(); System.out.println( d.getName() ); container.close(); } }

    使用构造方法自动装备,创建person实例时,使用带参数的构造,并为参数注入指定类型的bean。

加载配置文件通配符

1、* 匹配同一级别路劲的多个字符,ecut/*/autowiring/constructor-autowiring.xml
2、 ** 匹配多级路劲中的多个字符,ecut/**/constructor-autowiring.xml

String configLocations = "classpath:ecut/**/constructor-autowiring.xml" ;
AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations );

ecut.ioc.autowiring包中有一个constructor-autowiring.xml
3、 ?仅匹配一个字符

4、如果多个包中都beans.xml文件,并且期望全部加载它们,则可以写作classpath*:ecut/**/beans.xml

ecut包中有beans.xml, ecut.ex包中有beans.xml,ecut.xxx.yyyy包中有beans.xml

转载请于明显处标明出处

https://www.cnblogs.com/AmyZheng/p/9253193.html

Spring学习(五)的更多相关文章

  1. spring学习(五) ———— 整合web项目(SSM)

    一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后在编写springmvc. 1.2.开发需求 查询商品列表(从数据库中查询) 1.3.创建web工程 ...

  2. Spring学习五(JDBC支持)

    Spring的jdbc支持 1配置db.properties,将有关JDBC的信息载入 2bean文件配置数据源,这里用e3p0作为数据源载入db.properties 3配置template的bea ...

  3. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  4. Spring学习五

    1: servlet生命周期:  Servlet加载    ->   实例化->   服务 ->  销毁 2:Servlet重要函数: init():在Servlet的生命周期中,仅 ...

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

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

  6. Spring学习(五)--构建Spring Web应用程序

    一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ...

  7. spring学习五:Spring Bean 定义继承

    Bean 定义继承 bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等. 子 bean 的定义继承父定义的配置数据.子定义可以根据需要 ...

  8. spring学习 五 依赖注入的方式

    依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...

  9. spring 学习(五):spring 事务

    spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...

随机推荐

  1. Codeforces Round #618 (Div. 1)B(几何,观察规律)

    观察猜测这个图形是中心对称图形是则YES,否则NO #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace ...

  2. 无显示器安装raspberry zero w树莓派 zero w

    笔者的环境 1. Macbook 电脑用于烧录树莓派系统到SD卡 2. 树莓派 zero w 把SD卡放进读卡器,插到Mac电脑上, 打开命令行工具Terminal diskutil list列出di ...

  3. 查看Mysql数据库版本

    一.使用终端 1.参数为-V(大写字母)或者--version 使用方法: D:\mysql\bin>mysql -V 或者 D:\mysql\bin>mysql --version

  4. bootstrap的pillbox使用

    使用bootstrap的cameo模版,搭建了一个cms系统,使用pillbox做显示的时候,出现点击×失败的问题. 分析了一下pillbox这个控件的使用方法. pillbox的样例在cameo/f ...

  5. mybatis-01-简单概述基础点

    1.mybatis的优点 mybatis:半自动化持久化框架 sql(专注数据)和java编码(专注业务)分离 可使用简单的xml或者注解用于配置和原始映射 将接口和java中的pojo映射成数据库中 ...

  6. 初识HttpRunner

    一.背景 前段时间接触到HttpRunner自动化测试框架,发现对测试人员代码能力要求极低,用户只需准备好用例脚本即可发起测试,非常方便,故记录一下. 二.安装 运行环境 HttpRunner框架基于 ...

  7. 【MySQL】完整性约束

    " 目录 not null default unique 单列唯一 联合唯一 primary key 单列主键 复合主键 auto_increment 步长与偏移量 foreign key ...

  8. idea 快捷使用(一)条件断点的使用

    调试的时候,在循环里增加条件判断,可以极大的提高效率,心情也能愉悦.以下介绍下IDEA使用条件[Condition]断点的方法 1.编写一段样例代码 /** * @author jiashubing ...

  9. 1-1_微信小程序Buddy群记账背景

    1-1_微信小程序需求背景及评审 背景: 我是一个做了2年的Java后台开发 ,最近换了份工作 改做全栈了,需要对各方面的知识都有一定程度的认识及掌握, 虽然现如今还未要求开发小程序,但是已经有趋势了 ...

  10. JavaSE复习~常量、变量、关键字、标识符

    标识符.关键字 标识符:指程序中为了代表一些东西,用户自己定义的名字 关键字:系统预先定义的一些具有特殊意义的标识符, 保留字:系统预先定义,不作为关键字,也不允许用户使用 Java中的关键字: 标识 ...