Spring学习(五)
自动装备
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学习(五)的更多相关文章
- spring学习(五) ———— 整合web项目(SSM)
一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后在编写springmvc. 1.2.开发需求 查询商品列表(从数据库中查询) 1.3.创建web工程 ...
- Spring学习五(JDBC支持)
Spring的jdbc支持 1配置db.properties,将有关JDBC的信息载入 2bean文件配置数据源,这里用e3p0作为数据源载入db.properties 3配置template的bea ...
- Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)
在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...
- Spring学习五
1: servlet生命周期: Servlet加载 -> 实例化-> 服务 -> 销毁 2:Servlet重要函数: init():在Servlet的生命周期中,仅 ...
- Spring学习五----------Bean的配置之Bean的生命周期
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的生命周期 1.定义 2.初始化 3.使用 4.销毁 初始化和销毁的三种方式 1.实现org.springframework.beans.fa ...
- Spring学习(五)--构建Spring Web应用程序
一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ...
- spring学习五:Spring Bean 定义继承
Bean 定义继承 bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等. 子 bean 的定义继承父定义的配置数据.子定义可以根据需要 ...
- spring学习 五 依赖注入的方式
依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...
- spring 学习(五):spring 事务
spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...
随机推荐
- go基础_数组
数组有2种赋值方式 一种明确指定长度,另一种从赋值数目指定长度 package main import "fmt" func main() { //数组赋值方式1,指定长度 arr ...
- 每日扫盲(四):java之Netty原理和使用
转自:https://www.jdon.com/concurrent/netty.html Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Nett ...
- 常用的vi的命令模式下的快捷命令
知识点 在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光 ...
- C语言程序设计100例之(26):二进制数中1的个数
例26 二进制数中1的个数 问题描述 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),称它为一个n位二进制数.所有的n位二进制数中,1的总个数是多少呢? 例如,3位二进制数总共有4个, ...
- JS高级---实例对象和构造函数之间的关系
实例对象和构造函数之间的关系: 1. 实例对象是通过构造函数来创建的---创建的过程叫实例化 2. 如何判断对象是不是这个数据类型? 1) 通过构造器的方式 实例对象.构造器==构造函数 ...
- SpringBoot启动后自动打开浏览器访问项目
之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...
- Spring Boot 编辑器 IDEA 免费许可申请
最近 IDEA 陆续到期(试用版)听说可以申请开源许可,试试吧. 点击 https://www.jetbrains.com/shop/eform/opensource?product=ALL 填写相关 ...
- 12、API - 输入设备(API - Input Devices)
学习目录:树莓派学习之路-GPIO Zero 官网地址:https://gpiozero.readthedocs.io/en/stable/api_input.html 环境:UbuntuMeta-1 ...
- leetcode 697
Given a non-empty array of non-negative integers nums, the degree of this array is defined as the ma ...
- html解析のBeautifulSoup
引子: 使用python爬虫对爬取网页进行解析的时候,如果使用正则表达式,有很多局限,比如标签中出现换行,或者标签的格式不规范,都有可能出现取不到数据,BeautifulSoup作为一个专门处理htm ...