前面我已经学过了,将一个bean引用注入到另一个bean的属性或构造器参数中,这边指的是将一个对象与另一个对象进行关联。

我们学过的方法是在创建的时候根据new对象的时候,注入参数,如下:

   @Beanpublic CompactDisc randomCd() {int choice = (int) Math.floor(Math.random() * 4);switch (choice) {case 0:return new RandomCd("dangNianQing");case 1:return new RandomCd("qianNvYouHun");case 2:return new RandomCd("wo");default:return new RandomCd("chenMoShiJing");}}

也可以在xml中配置的时候,注入:

  <bean id="randomCd" class="com.bean.xml.RandomCd"><constructor-arg index="0" value="当年情"/><constructor-arg index="1" value="张国荣"/></bean>

这些方法属于的值属于 硬编码值。


有时候硬编码是可以的,但有的时候,我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:

  • 属性占位符(Property placeholder)。
  • Spring表达式语言(SpEL)。

先看第一种的方法,属性占位符,主要是使用@PropertySource注解和Environment

@Configuration
@PropertySource(value = "/com/bean/java/cd.properties")
public class CDPlayerConfig {@AutowiredEnvironment environment;@Beanpublic CompactDisc randomCd() {int choice = (int) Math.floor(Math.random() * 4);switch (choice) {case 0:return new RandomCd(environment.getProperty("cd.dnq"));case 1:return new RandomCd(environment.getProperty("cd.qnyh"));case 2:return new RandomCd(environment.getProperty("cd.w"));default:return new RandomCd(environment.getProperty("cd.cmsj"));}}}

cd.properties内容为:
cd.dnq= dnq
cd.qnyh = qnyh
cd.w = w
cd.cmsj = cmsj

cd.properties在运行的时候会被加载到Spring的Environment 通过从Environment检索可以得到文件中的属性值,取值的方式有以下四种种:

  • String getProperty(String var1);
  • String getProperty(String var1, String var2);
  • <T> T getProperty(String var1, Class<T> var2);
  • <T> T getProperty(String var1, Class<T> var2, T var3);

第一个就是上面所用的key-value 键值对对于的key

第二个是指当指定key,没有特定的value的时候,后面的值即是为默认值

第三个跟第四种相似,只不过他特定了一个类型,方便你用吗,无需取完之后再去转换

当然了Environment除了这些属性,还有:

  • String[] getActiveProfiles():返回激活profile名称的数组;
  • String[] getDefaultProfiles():返回默认profile名称的数组;
  • boolean acceptsProfiles(String... profiles):如果environment支持给定profile的话,就返回true。

上面的是java配置解析的 ,我们也来看看如何用xml跟自动扫描的方式来解析占位符

  public CompactDisc randomCd(@Value("${cd.dnq}") String str) {System.out.println(str);
}

xml方式

<bean id="randomCd" class="com.bean.xml.RandomCd"><constructor-arg index="0" value="${cd.dnq}"/><constructor-arg index="1" value="张国荣"/>
</bean>

当然使用这些方法是要有前提的,需要配置PropertySourcesPlaceholderConfigurer,因为它能够基于Spring Environment及其属性源来解析占位符。

    @Beanpublic static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){return  new PropertySourcesPlaceholderConfigurer();}

xml中需要添加:

  <context:property-placeholder />

让我们再来看下第二种方法:Spring表达式语言进行装配。SpEL表达式要放到“#{ ... }”之中,这与属性占位符有些类似,属性占位符需要放到“${ ... }”之中

SpEL的表达式学问还是很深的,我这里就学习点皮毛:

比如表达式为一个常量

#{3}

为一个小小的函数(T为类型)

#{T(System).currentTimeMillis()}

也可以引起其他bean的属性,这里的dangNianQing为一个bean,可以获得他的title属性和方法

#{dangNianQing.title}
#{dangNianQing.play()}

还可以通过systemProperties对象引用系统属性:

#{SystemProperties['cd.dnq']}

就先介绍这一点,等学的更多的时候,在贴上来。。。

以上就是Bean自动注入的学习笔记,如有错,欢迎指出,谢谢~

转载于:https://www.cnblogs.com/eoooxy/p/6438109.html

SpringInAction--Bean参数的自动注入相关推荐

  1. spring10: 引用类型的自动注入

    package com.atChina.Test5;public class Student {private String name;private int age;private School s ...

  2. Spring自动注入

    谈及一个问题,无非牵扯到三点,是什么,怎么来的,怎么用的 Spring自动注入是什么 是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建: Spr ...

  3. Spring——16 自动注入

    自动注入 概念 在 Spring 配置文件中对象名和 ref="id" 的id 名相同,使用自动注入,可以不配置property/ 标签 两种配置办法 ①在bean 标签中通过 a ...

  4. Spring三种方法的注解自动注入

    1 @Autowired注解 @Autowired是Spring提供的自动注入的方法,该注解可以放在变量和方法上,在bean+返回值类型的注解中,@Autowired还可以放在参数前:@Autowir ...

  5. autowired java_Java 基础之Autowired 是否是自动注入

    Java 基础之Autowired 是否是自动注入 相信很多人对Autowired 注解理解不深入,或者是认为此注解就是spring的自动注入.相信看完本篇文章,你会有更加不一样的理解. 首先我们先看 ...

  6. spring——autowire自动注入

    通过指定bean标签上的autowire属性可对bean对象进行自动注入 autowire = byName 根据名称注入 autowire = byType 根据类型注入 当有多个bean与属性对应 ...

  7. Servlet自动注入Spring容器中的Bean解决方法

    Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...

  8. 【Spring学习】spring注解自动注入bean

    Spring mvc注解用到的配置: <!-- 启用spring mvc 注解 --> <context:annotation-config /> <context:co ...

  9. 解决Spring+Quartz无法自动注入bean问题

    问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...

最新文章

  1. 057 Insert Interval 插入区间
  2. 商汤等提出:统一多目标跟踪框架
  3. 从自定义TagLayout看自定义布局的一般步骤[手动加精]
  4. eCognition易康导出分割结果
  5. vb.net2019-下载文件
  6. C++11标准库 - array
  7. cache工作的详细过程
  8. 产品运营:当你和上级发生争执你会怎么处理?
  9. 查看linq的生成语句
  10. 【51/STM32】详解控制系统中的继电器
  11. kindle电子书转PDF,结合calibre工具和DeDRM_tools使用
  12. Vs2010 破解 序列号
  13. SOAP协议的深度解析
  14. java 信鸽推送demo_iOS中关于信鸽推送的使用demo详解
  15. 【Windows】Mathpix Snip-公式神器
  16. tf.data.Dataset.from_tensor_slices
  17. LIC2020 百度语言与智能技术竞赛(一)——语义解析冠军方案
  18. Hadoop中的slaves文件
  19. 10个顶尖响应式HTML5网页
  20. otc焊接机器人编程模拟软件_OTC弧焊机器人离线编程系统开发.pdf

热门文章

  1. OSChina 周四乱弹 ——世界满满的恶意
  2. AI帮你找美食!文字叙述让AI自动产生美食图片
  3. Linux下启动和关闭Redis
  4. Vdsat、Vov、Vds联系与区别
  5. C语言:用switch语句求分段函数
  6. labview基于一维数组的二维曲线绘制
  7. 振铃效应(Ringingeffect)
  8. 《工业互联网行动计划》新旧对比,揭秘工业互联未来3年新格局!
  9. MUI实现日期选择器
  10. 点积和叉积(基本的东西,先挖个坑)