1、处理自动装配的歧义性

1.1 标记首选的bean

​ 使用@Primary 来说明一个bean是首选的。

@Component
@Primary
public class GuoRongCD implements CompactDisc {}

或是

@Bean
@Primary
public MediaPlayer getAnotherCDplay(CompactDisc aa){
CDPlayer k = new CDPlayer();
k.setCompactDisc(aa);
return k;
}

或是

<bean id="glCD" class="com.di.book.GuoRongCD" primary="true"/>

​ 但是,一个类型的bean只能有一个首选标志,如果多个,就失去意义了。

1.2 限定自动装配的bean

​ 如果被注入的bean类型不是唯一的,需要设置限定符,来确定哪个bean是被需要的。@Qualifier注解是使用限定符的主要方式。

@Autowired
@Qualifier("guoRongCD")
public void setCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}

​ @Qualifier 设置的参数就是想要注入的bean的ID。所有使用@Component 注解声明的bean,默认的ID是首字母变小写的类名。

​ 更精确的说,@Qualifier("guoRongCD") 所要引用的bean是具有String类型的“guoRongCD”作为限定符。如果没有指定限定符,bea一般会有一个默认的限定符,这个限定符和bean 的ID相同。

  • 给bean指定限定符
  @Component
@Qualifier("kkd")
public class GuoRongCD implements CompactDisc {}

或是

  @Bean
@Qualifier("kkd")
public CompactDisc getCompactDisc(){
return new GuoRongCD();
}

2、作用域

。。。。。。

3、运行时值注入

​ 为了避免硬编码,可以是程序在运行时候再给属性复制。有如下两种方式:

  • 属性占位符
  • Spring 表达式语言

3.1 注入外部值

@Configuration
@PropertySource("classpath:test.properties")//引入配置文件
public class ExpressiveConfig {
@Autowired
Environment env;//自动检索属性
@Bean
public BlankDisk disc(){
return new BlankDisk(
//寻找键值,进行注入
env.getProperty("disc.title"),
env.getProperty("disc.artist"));
}
}

test.properties

disc.title = vae
disc.artist = vae Son

3.2 深入研究

关于getProperty()的重载形式:

//只有key
String getProperty(String key)
//含有默认值,如果找不到改善属性值,就会适应默认值
String getProperty(String key, String defaultValue)
//可以类型转换,比如字符串转整型,
//getProperty("port", Integer.class)
<T> T getProperty(String key, Class<T> targetType);
//带有默认值
<T> T getProperty(String key, Class<T> targetType, T defaultValue);

​ 当使用getProperty()时候,如果是空值,结果适null,不会包异常。如果希望该结果不存在的时候抛异常,就可以使用 getRequiredProperty() 方法,所有使用方法和前者一致,若是值不存在,会抛出异常。

3.3 属性占位符

  • XML中,可以使用“${}”来占位。
  <bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="driverClassName" value="${mysql.driverClassName}"/>
<property name="password" value="${mysql.password}"/>
</bean>
  • 在JavaConfig中,使用@Value来占位
  @Bean
public BlankDisk disc(@Value("${disc.title}")String title,
@Value("${disc.artist}")String artist) {
return new BlankDisk(title,artist);
}

但是,为了使用占位符,需要含有PropertySourcesPlaceholderConfigurer 类型的bean:

  @Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}

在XML中,需要使用命名空间

  <context:property-placeholder/>

这个命名空间会给你自动创建这个bean。

Spring 高级依赖注入方式的更多相关文章

  1. 一步一步深入spring(3)--spring的依赖注入方式

    对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ...

  2. spring六种种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  3. Spring的依赖注入(DI)三种方式

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...

  4. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  5. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  6. 转:深入浅出spring IOC中四种依赖注入方式

    转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...

  7. spring四种依赖注入方式(转)

    spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...

  8. 给力啊!这篇Spring Bean的依赖注入方式笔记总结真的到位,没见过写的这么细的

    1. Bean的依赖注入概念 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现.在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是 ...

  9. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

随机推荐

  1. 适配ios11与iphone x实践

    一.适配iOS11 问题1:项目中有原生与H5的交互,运行在iOS11时,直接漰溃在框架WebViewJavascriptBridge内部. 报错信息:Completion handler passe ...

  2. ch3-form(get/post) $.ajax(get/post)

    1 http(get)请求 提交的数据 用req.query接收 1.1 router.get() //http(get)请求方式 1.2 接收http(get)方式提交的数据 req.query 方 ...

  3. 关于Struts与Ajax整合时的异常处理

     关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...

  4. sqlDependency监控数据库数据变化,自动通知

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. iOS多线程基本使用

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. 【学习】滚动延迟加载插件scrollLoading用法

    今天遇到一个很好用的滚动延迟加载的插件,作者是我的偶象大神张鑫旭,其博客为http://www.zhangxinxu.com/. 以前也写过这种效果,用的是lazyload,不过只能实现图片的加载.而 ...

  7. (10.19)Java小作业

    在java的学习过程中数组的版块也是十分重要的,包括一些教程也会在这个知识点花上更多的时间来讲解,足以证明 这个知识点的重要性,今天想和大家分享一道学习数组过程中不可避免的求最值题. 已知一个整形数组 ...

  8. 【转】Sizeof与Strlen的区别与联系

    原文地址:http://www.cnblogs.com/carekee/articles/1630789.html 1.sizeof  sizeof(...)是运算符,在头文件中typedef为uns ...

  9. 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律

    脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...

  10. HTML笔记<note1>

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...