三、@Autowired注解
@Autowired注解作用与属性 方法和构造器,启用此注解需要定义org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
required=false 可以使的@ Autowired注解的属性方法在找不到协作者时不报错
 小结:@Required注解针对dependency-check属性提出,@Autowired针对autowire属性提出,@Autowired的required 可以进行@Required的依赖检查工作
 四 、 细粒度Autowiring策略控制
          primary属性虽然可以避免多个协作者的异常,但是不能满足企业级应用需求,比如多个同类型不同协作者注入到它能够以受管bean的时候。@Qualifier注解可以解决此类问题。

package cn.beanfactory.bean;

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;
  }

}

package cn.beanfactory.bean;

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 "";

}

<!-- @Qualifier 注解 -->
    <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 属性可以强制指定依赖对象,从而优先实例化依赖对象。

<!-- @Qualifier 注解 -->
  <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

package cn.beanfactory.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;
  }

}

log.info("==========抽象类和子Bean==========");

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策略(续)相关推荐

  1. Spring.NET学习笔记1——控制反转(基础篇) Level 200

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  2. Java学习笔记——流程控制

    Java学习笔记--流程控制 Day05 一.用户交互Scanner 1.Scanner对象 我们通过Java工具包java.util.Scanner中的Scanner类来获取用户的输入 基本语法:S ...

  3. python反转一个三位数的整数_Python学习笔记3-整数反转

    Python学习笔记3-整数反转 题目: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: - ...

  4. STM32学习笔记(9)——(I2C续)读写EEPROM

    STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...

  5. Vue.js 学习笔记 七 控制样式

    Vue.js可以灵活的控制样式 我们首先随便写2个样式 <style>.divCss {background-color: green;width:400px;height:400px;} ...

  6. matlab学习笔记3(控制系统仿真)

    matlab学习笔记3(控制系统仿真) 1.典型二阶系统 H ( S ) = ω n 2 S 2 + 2 ξ ω n S + ω n 2 H\left(S\right)=\frac{\omega_n^ ...

  7. Spring学习:IOC控制反转

    一.Spring概述: Spring是一个开源框架,其存在的根本使命就是简化JAVA开发.为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略: 基于POJO的最轻量级和最小侵入性编程: ...

  8. 强化学习笔记:PPO 【近端策略优化(Proximal Policy Optimization)】

    1 前言 我们回顾一下policy network: 强化学习笔记:Policy-based Approach_UQI-LIUWJ的博客-CSDN博客 它先去跟环境互动,搜集很多的 路径τ.根据它搜集 ...

  9. Spring源码学习笔记:经典设计模式之策略模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...

最新文章

  1. Django之ModelForm验证
  2. javascript事件模型框架
  3. 2022.2.21显示器连接器引脚信号定义1
  4. 稳扎稳打Silverlight(33) - 3.0控件之AutoCompleteBox, DataPager
  5. 移动设备改变IO,试图改变(数据的)存储和处理(CPU)
  6. 蓝桥杯基础模块4_1:独立按键
  7. [vue] 说说你对provide和inject的理解
  8. javascript时间戳和日期字符串相互转换
  9. 分享,用sql快速创建MODEL,快速提高工作效率哦
  10. 苹果Mac系统无法输入密码的解决办法
  11. Julia: Dict中元素的顺序:是无序的!
  12. 面试之springboot是什么?
  13. python图片转换成文字_在python中将图像转换为字节文字 - python
  14. 绝对不可错过的圣诞节H5游戏
  15. Windows脚本 同网段ip检测与持续ping包测试
  16. Liquibase常用操作
  17. mac电脑有很多._开头的文件
  18. Win10运行LoadRunner11录制脚本无法启动浏览器
  19. php使用Qrcode生成二维码
  20. 第三天-01-批处理文件

热门文章

  1. Docker 集群环境实现的新方式
  2. 通过经典题目来理解多种闭包实现方式
  3. vim 查找匹配字符串次数
  4. Oracle 10g 中 X$KCVFH 说明
  5. 一刀两断划分子网例子
  6. 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
  7. Java IO编程全解(六)——4种I/O的对比与选型
  8. Leetcode c语言-Divide Two Integers
  9. initrd的使用及说明
  10. rhel5.5下安装oracle10g报libXp.so.6错误