博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringInAction--Bean参数的自动注入
阅读量:6510 次
发布时间:2019-06-24

本文共 2923 字,大约阅读时间需要 9 分钟。

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

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

@Bean    public 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中配置的时候,注入:

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


 

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

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

 

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

@Configuration@PropertySource(value = "/com/bean/java/cd.properties")public class CDPlayerConfig {    @Autowired    Environment environment;    @Bean    public 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= dnqcd.qnyh = qnyhcd.w = wcd.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方式

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

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

xml中需要添加:

 

让我们再来看下第二种方法: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

你可能感兴趣的文章
exchange online 用户疑问之许可证和用户数据归档
查看>>
QImage Mat IplImage 之间的相互转换
查看>>
lsof命令详解
查看>>
使用eclipse与android studio 在开发自定义控件时的区别
查看>>
我的友情链接
查看>>
mysql学习笔记
查看>>
django 问题解决
查看>>
年年有鱼游戏Android源码项目
查看>>
java使用Iterator、for循环同步数据
查看>>
创建镜像iso文件
查看>>
Linux下创建软RAID5和RAID10实战
查看>>
mariadb的日志
查看>>
C++类的存储
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>
解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
查看>>
跟我一起学docker(四)--容器的基本操作
查看>>
磁化强度
查看>>
C/C++ 数据范围
查看>>
LVS+keepalived+nginx
查看>>
monkey如何通过uiautomatorviewer的bounds坐标点击控件
查看>>