Spring2.5学习笔记1-控制反转-Autowiring策略(续)
小结:@Required注解针对dependency-check属性提出,@Autowired针对autowire属性提出,@Autowired的required 可以进行@Required的依赖检查工作
四 、 细粒度Autowiring策略控制
primary属性虽然可以避免多个协作者的异常,但是不能满足企业级应用需求,比如多个同类型不同协作者注入到它能够以受管bean的时候。@Qualifier注解可以解决此类问题。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class QualifierBean {
@Autowired
@Qualifier("h1")//默认注解
@FineQualifier(keyFine="k1",valueFine="v1")//自定义注解
private HelloWorld hw1;
@Autowired
@Qualifier("h2")//默认注解
@FineQualifier(keyFine="k2",valueFine="v2")//自定义注解
private HelloWorld hw2;
public HelloWorld getHw2() {
return hw2;
}
public void setHw2(@FineQualifier(keyFine="k2",valueFine="v2") HelloWorld hw2) {
this.hw2 = hw2;
}
public HelloWorld getHw1() {
return hw1;
}
public void setHw1(@FineQualifier(keyFine="k1",valueFine="v1") HelloWorld hw1) {
this.hw1 = hw1;
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Qualifier //无此注释时 需要借助 org.springframework.beans.factory.annotation.CustomAutowireConfigurer对象
public @interface FineQualifier {
String keyFine() default "";
String valueFine() default "";
}
<bean name="qualifierBean" class="cn.beanfactory.bean.QualifierBean" autowire="byType">
</bean>
<bean name="hw1" class="cn.beanfactory.bean.HelloWorld" >
<!-- 自定义限定注解 -->
<qualifier type="cn.beanfactory.bean.FineQualifier">
<attribute key="keyFine" value="k1"/>
<attribute key="valueFine" value="v1"/>
</qualifier>
<!-- <qualifier value="h1"/> -->
</bean>
<bean name="hw2" class="cn.beanfactory.bean.HelloWorld">
<!-- 自定义限定注解 -->
<qualifier type="cn.beanfactory.bean.FineQualifier">
<attribute key="keyFine" value="k2"/>
<attribute key="valueFine" value="v3"/>
</qualifier>
<!-- <qualifier value="h2"/> -->
</bean>
<!-- FineQualifier 无类一级的@Qualifier时需要借助以下对象 -->
<bean id="customAutowireConfiger"
class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
<property name="customQualifierTypes">
<set>
<value>cn.beanfactory.bean.FineQualifier</value>
</set>
</property>
</bean>
注:<context:annotation-config /> 元素可以提供各种注解的支持对象例如:RequiredAnnotationBeanPostProcessor,但是却不能自定义RequiredAnnotationBeanPostProcessor行为
五、depends-on 属性
ref属性虽然能完成依赖注入,但是不能保证按照开发者指定的循序实例化,depends-on 属性可以强制指定依赖对象,从而优先实例化依赖对象。
<bean name="qualifierBean" class="cn.beanfactory.bean.QualifierBean" depends-on="hw1,hw2"
autowire="byType">
</bean>
<bean name="hw1" class="cn.beanfactory.bean.HelloWorld">
<!-- 自定义限定注解 -->
<qualifier type="cn.beanfactory.bean.FineQualifier">
<attribute key="keyFine" value="k1" />
<attribute key="valueFine" value="v1" />
</qualifier>
<!-- <qualifier value="h1"/> -->
</bean>
<bean name="hw2" class="cn.beanfactory.bean.HelloWorld">
<!-- 自定义限定注解 -->
<qualifier type="cn.beanfactory.bean.FineQualifier">
<attribute key="keyFine" value="k2" />
<attribute key="valueFine" value="v2" />
</qualifier>
<!-- <qualifier value="h2"/> -->
</bean>
六、抽象Bean和子Bean
public class AbstractBean {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
AbstractBean abstractBean = gbfa.getBean("childBean1");
log.info("userName=" + abstractBean.getUsername());
log.info("password=" + abstractBean.getPassword());
AbstractBean abstractBean2 = gbfa.getBean("childBean2");
log.info("userName=" + abstractBean2.getUsername());
log.info("password=" + abstractBean2.getPassword());
AbstractBean abstractBean3 = gbfa.getBean("childBean3");
log.info("userName=" + abstractBean3.getUsername());
log.info("password=" + abstractBean3.getPassword());
<!-- 抽象和子Bean -->
<!-- 抽象Bean Spring 不会实例化 -->
<bean id="abstractBean1" class="cn.beanfactory.bean.AbstractBean" abstract="true">
<property name="username" value="un_ab1"/>
</bean>
<bean id="childBean1" class="cn.beanfactory.bean.AbstractBean" parent="abstractBean1">
<property name="password" value="pwd_cb1"/>
</bean>
<bean id="abstractBean2" abstract="true">
<property name="username" value="un_ab2"/>
</bean>
<bean id="childBean2" class="cn.beanfactory.bean.AbstractBean" parent="abstractBean2" >
<property name="password" value="pwd_cb2"/>
</bean>
<!-- 继承 -->
<bean id="childBean3" class="cn.beanfactory.bean.AbstractBean" parent="childBean2">
<property name="username" value="un_cb3"/> <!-- 覆盖父Bean属性值 -->
</bean>
七、别名 alias
<alias name="testBean" alias="tb"/>
转载于:https://blog.51cto.com/wuql4689908/646908
Spring2.5学习笔记1-控制反转-Autowiring策略(续)相关推荐
- Spring.NET学习笔记1——控制反转(基础篇) Level 200
在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...
- Java学习笔记——流程控制
Java学习笔记--流程控制 Day05 一.用户交互Scanner 1.Scanner对象 我们通过Java工具包java.util.Scanner中的Scanner类来获取用户的输入 基本语法:S ...
- python反转一个三位数的整数_Python学习笔记3-整数反转
Python学习笔记3-整数反转 题目: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: - ...
- STM32学习笔记(9)——(I2C续)读写EEPROM
STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...
- Vue.js 学习笔记 七 控制样式
Vue.js可以灵活的控制样式 我们首先随便写2个样式 <style>.divCss {background-color: green;width:400px;height:400px;} ...
- matlab学习笔记3(控制系统仿真)
matlab学习笔记3(控制系统仿真) 1.典型二阶系统 H ( S ) = ω n 2 S 2 + 2 ξ ω n S + ω n 2 H\left(S\right)=\frac{\omega_n^ ...
- Spring学习:IOC控制反转
一.Spring概述: Spring是一个开源框架,其存在的根本使命就是简化JAVA开发.为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略: 基于POJO的最轻量级和最小侵入性编程: ...
- 强化学习笔记:PPO 【近端策略优化(Proximal Policy Optimization)】
1 前言 我们回顾一下policy network: 强化学习笔记:Policy-based Approach_UQI-LIUWJ的博客-CSDN博客 它先去跟环境互动,搜集很多的 路径τ.根据它搜集 ...
- Spring源码学习笔记:经典设计模式之策略模式
1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...
最新文章
- Django之ModelForm验证
- javascript事件模型框架
- 2022.2.21显示器连接器引脚信号定义1
- 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager
- 移动设备改变IO,试图改变(数据的)存储和处理(CPU)
- 蓝桥杯基础模块4_1:独立按键
- [vue] 说说你对provide和inject的理解
- javascript时间戳和日期字符串相互转换
- 分享,用sql快速创建MODEL,快速提高工作效率哦
- 苹果Mac系统无法输入密码的解决办法
- Julia: Dict中元素的顺序:是无序的!
- 面试之springboot是什么?
- python图片转换成文字_在python中将图像转换为字节文字 - python
- 绝对不可错过的圣诞节H5游戏
- Windows脚本 同网段ip检测与持续ping包测试
- Liquibase常用操作
- mac电脑有很多._开头的文件
- Win10运行LoadRunner11录制脚本无法启动浏览器
- php使用Qrcode生成二维码
- 第三天-01-批处理文件