SpringInAction--Bean参数的自动注入
前面我已经学过了,将一个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参数的自动注入相关推荐
- spring10: 引用类型的自动注入
package com.atChina.Test5;public class Student {private String name;private int age;private School s ...
- Spring自动注入
谈及一个问题,无非牵扯到三点,是什么,怎么来的,怎么用的 Spring自动注入是什么 是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建: Spr ...
- Spring——16 自动注入
自动注入 概念 在 Spring 配置文件中对象名和 ref="id" 的id 名相同,使用自动注入,可以不配置property/ 标签 两种配置办法 ①在bean 标签中通过 a ...
- Spring三种方法的注解自动注入
1 @Autowired注解 @Autowired是Spring提供的自动注入的方法,该注解可以放在变量和方法上,在bean+返回值类型的注解中,@Autowired还可以放在参数前:@Autowir ...
- autowired java_Java 基础之Autowired 是否是自动注入
Java 基础之Autowired 是否是自动注入 相信很多人对Autowired 注解理解不深入,或者是认为此注解就是spring的自动注入.相信看完本篇文章,你会有更加不一样的理解. 首先我们先看 ...
- spring——autowire自动注入
通过指定bean标签上的autowire属性可对bean对象进行自动注入 autowire = byName 根据名称注入 autowire = byType 根据类型注入 当有多个bean与属性对应 ...
- Servlet自动注入Spring容器中的Bean解决方法
Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...
- 【Spring学习】spring注解自动注入bean
Spring mvc注解用到的配置: <!-- 启用spring mvc 注解 --> <context:annotation-config /> <context:co ...
- 解决Spring+Quartz无法自动注入bean问题
问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...
最新文章
- 057 Insert Interval 插入区间
- 商汤等提出:统一多目标跟踪框架
- 从自定义TagLayout看自定义布局的一般步骤[手动加精]
- eCognition易康导出分割结果
- vb.net2019-下载文件
- C++11标准库 - array
- cache工作的详细过程
- 产品运营:当你和上级发生争执你会怎么处理?
- 查看linq的生成语句
- 【51/STM32】详解控制系统中的继电器
- kindle电子书转PDF,结合calibre工具和DeDRM_tools使用
- Vs2010 破解 序列号
- SOAP协议的深度解析
- java 信鸽推送demo_iOS中关于信鸽推送的使用demo详解
- 【Windows】Mathpix Snip-公式神器
- tf.data.Dataset.from_tensor_slices
- LIC2020 百度语言与智能技术竞赛(一)——语义解析冠军方案
- Hadoop中的slaves文件
- 10个顶尖响应式HTML5网页
- otc焊接机器人编程模拟软件_OTC弧焊机器人离线编程系统开发.pdf