资讯专栏INFORMATION COLUMN

Spring高级装配之运行时注入

ZweiZhao / 2699人阅读

摘要:原文地址运行时注入与硬编码注入是相对的。硬编码注入在编译时就已经确定了,运行时注入则可能需要一些外部的参数来解决。提供的两种在运行时求值的方式属性占位符表达式语言注入外部的值使用注解可以引入文件,使用其中的值。

原文地址:http://blog.gaoyuexiang.cn/Sp...

运行时注入与硬编码注入是相对的。硬编码注入在编译时就已经确定了,运行时注入则可能需要一些外部的参数来解决。

Spring提供的两种在运行时求值的方式:

属性占位符(Property placeholder)

Spring表达式语言(SpEL)

注入外部的值

使用@PropertySource注解可以引入.properties文件,使用其中的值。

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JDBCConfig {
    @Autowired
    Environment env;
    
    @Bean
    public DataSource dataSource() {
        env.getProperties("driver");
        ...
    }
}
深入了解Spring中的Environment

上例的Environment有如下方法获取属性

String getProperty(String key);

String getProperty(String key, String defaultValue);

T getProperty(String key, Class type);

T getProperty(String key, Class type, T defaultValue);

这几个重载方法的作用顾名思义。其中第一、三个方法获取一个不存在的属性时,会抛出IllegalStateException异常。

可以使用containsProperty(String key)方法查看是否存在某个属性。

其他相关方法:

Class getPropertyAsClass(String key, Class targetType) : 将获取的属性转换为类

String[] getActiveProfiles() : 返回激活profile名称的数组

String[] getDefaultProfiles() : 返回默认profile名称的数组

boolean acceptsProfiles(String... profiles) : 如果environment支持给定的profile,则返回true

解析属性占位符

使用占位符,可将属性定义到外部的.properties文件中,然后使用占位符插入到bean中。占位符使用${...}包装属性名称。

Java配置中使用@Value注解。

public BlankDisc(@Value("${disc.title}") String title,
            @Value("${disc.artist}") String artist) {
    this.title = title;
    this.artist = artist;
}

使用占位符必须配置一个PropertySourcesPlaceholderConfigurer bean,它能够基于Spring Environment及其属性来解析占位符。

@Bean
public PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
使用Spring表达式语言进行装配

SpEL主要特性:

使用beanID来引用bean

访问对象的属性和方法

可对值进行算数、关系和逻辑运算

正则表达式匹配

集合操作

SpEL还可以用在DI之外的地方

SpEL样例

SpEL表达式要放在#{ ... }中,里面的"..."就是SpEL表达式。

#{1}

常量,结果始终为1

#{T(System).currentTimeMillis()}

T()表达式会将java.lang.System视为Java中对应的类型,然后调用其方法,获取当前时间戳。

#{dataSource.user}

dataSource为声明的其他bean,这里可以获取它的属性user

#{systemProperties["username"]}

通过systemProperties对象获取系统属性

表示字面量

可表示的字面量有int,float/double,String,boolean,其中浮点值可以用科学技术法表示:#{6.18E3}

引用bean、属性和方法
引用对象 表达式
bean #{dataSource}
bean"s field #{dataSource.user}
bean"s method #{dataSource.getPassword()}
bean"s method"s method #{dataSource.getPassword().toUpperCase()}

如果方法返回值为null,第四种情况会抛出NullPoniterException。可以使用:

#{dataSource.getPassword()?.toUpperCase()}

其中的?.运算符能够在访问前确保不为null,否则返回null

在表达式中使用类型

使用T()表达式来访问Java类中的static方法和常量,在括号内的是类名,返回一个Class对象,然后调用其方法和常量。

SpEL运算符
运算符类型 运算符
算数运算 +, -, *, /, %, ^
比较运算 <, >, ==, <=, >=, lt, gt, eq, le, ge
逻辑运算 and, or, not,
条件运算 ?: (ternary), ?: (Elvis)
正则表达式 matches

Elvis运算符

利用三元运算符来检查场景:#{disc.title ?: "Rattle and Hum"},当disc.titlenull时,返回"Rattle and Hum"

名称的来历据说是因为"?"长得像猫王的头发。。。

正则表达式

正则表达式利用matches来支持正则匹配。

计算集合

引入一个元素 : #{jukebox.songs[4].title}

随机选取 : #{jukebox.songs[T(Math).random() * jukebox.songs.size()].title}

String中获得char : #{"This is a test"[2]}

使用.?[]进行过滤,得到符合条件的子集 : #{jukebox.songs.?[artist eq "Aerosmith"]}

使用.^[].$[]进行过滤,得到第一个和最后一个匹配项

使用.![]从集合的每个成员选择特定属性放入新集合中 : #{jukebox.songs.![title]}

最后四个表达式有点像lambda表达式

SpEL的表达式可以相互组合使用。

更多Spring学习笔记:https://github.com/kbyyd24/spring.demo.test/issues

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65048.html

相关文章

  • Spring - 高级装配

    摘要:高级装配条件化的自动装配与歧义性的作用域表达式语言环境与可以为不同的环境提供不同的数据库配置加密算法等注解可以在类级别和方法级别,没有指定的始终都会被创建的方式配置不同环境所需要的数据库配置会搭建一个嵌入式的数据库模式定义在测试数据通过加 高级装配 Spring profile 条件化的bean 自动装配与歧义性 bean的作用域 Spring表达式语言 环境与profile p...

    binta 评论0 收藏0
  • 看起来很长但还是有用的Spring学习笔记

    摘要:关于依赖注入注入的注解提供的注解不仅仅是对象,还有在构造器上,还能用在属性的方法上。与之相反,的限定符能够在所有可选的上进行缩小范围的操作,最终能够达到只有一个满足所规定的限制条件。注解是使用限定符的主要方式。 本文首发于泊浮目的专栏:https://segmentfault.com/blog... Spring致力于提供一种方法管理你的业务对象。在大量Java EE的应用中,随处可...

    DTeam 评论0 收藏0
  • Spring - 装配Bean

    摘要:装配任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入配置的可选方案在中进行显示配置在中进行显示配置隐式的发现机制和自动装配自动化装配组件扫描会自动发现应用上下文 装配Bean 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的 创建应用对象之间协作关系的行为通常称为装配(wiring)...

    CNZPH 评论0 收藏0
  • 第三章 高级装配

    摘要:注解只可以装配只有一个实现类的例如下面的有三个实现类,自动装配时,就会不知道选哪一个,因而会报错误。使用表达式语言进行装配使用的来引用待补充实例调用方法和访问对象的属性对峙进行算数,关系和逻辑运算正则表达式匹配集合操作 完整代码请见:https://github.com/codercuixi... 第一部分 @Profile注解的使用 环境与profile 是否启用某个bean,常用于...

    only_do 评论0 收藏0
  • 慕课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<