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. Pycharm安装、设置、优化

    一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...

  2. HDU1257 最少拦截系统 (贪心+STL+二分)

    第一次在博客园写博客,好紧张 .博客搬家居然很多代码成了乱码,欲哭无泪,妈咪. 开学东西太多了吧,没时间写备注,有点时候只能贴个代码,以后有时间再加备注吧,只贴代码不是好习惯. 咦,贪心怎么写,我只会 ...

  3. webpack html

    调用了原模板 修改路径 使html放在JS外面 可以传递参数 多个html指定对应chunks 除了某些模块其余的都被引入

  4. C# XML序列化方法和常用特性

    /* C#对象XML序列化(一):序列化方法和常用特性 .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和 ...

  5. SSH/HTTPS安全的本质都依赖于TLS/SSL

    1.SSH/HTTPS的安全本质是TLS/SSL. 2.1990年互联网上的网页主要是静态内容,作为信息发布,使用HTTP明文传输是可以的.不过,后来很多公司开始使用网页进行金融交易,例如:股票,于是 ...

  6. $http设置headers来实现IE不缓存url请求的资源

    var getOrders = function(){    var deferred = $q.defer();    $http({    method:'get',    url:'/getOr ...

  7. (10.20)Java小作业!

    今天想要和大家分享一道我最近遇到的题,里面既包括了嵌套循环的运用,还有函数的定义与调用,我个人觉得挺有价值的. 打印一个由*号构成的等腰三角形: 具体的解题方法如下: public class get ...

  8. 起名字好难啊!(初识Django)

    这次我们将实现一个简单的登录注册功能,并吧相应的数据写入数据库: 做这件事之前我已经在数据库中新建了两张表(当然一张表也可以用,先注册后登录嘛···)    两张结构很简单的数据表:↓ 接下来就该干正 ...

  9. 谈谈我对php通信的理解及人生小感

    故事背景: 小王和小甜是亲密无间的好朋友. 小王到自己QQ群里看到一个免单活动, 自己支付宝余额不足, 遂用小甜的手机淘宝先花150元购买了活动产品. 到货后商家告诉小王, 确认收货后提供旺旺账号.支 ...

  10. For循环的实质

    For循环的实质 1.调用可迭代对象的iter方法返回一个迭代器对象 2.不断调用迭代器对象的next方法 3.处理StopIteration