@Value竟然能玩出这么多花样 (4)

以前我们注入bean,一般都是用的@Autowired或者@Resource注解。例如:

@Service public class RoleService { public String getRoleName() { return "管理员"; } } @Service public class UserService { @Autowired private RoleService roleService; public String test() { System.out.println(roleService.getRoleName()); return null; } }

但我要告诉你的是@Value注解也可以注入bean,它是这么做的:

@Value("#{roleService}") private RoleService roleService;

通过这种方式,可以注入id为roleService的bean。

7.2 bean的变量和方法

通过EL表达式,@Value注解已经可以注入bean了。既然能够拿到bean实例,接下来,可以再进一步。

在RoleService类中定义了:成员变量、常量、方法、静态方法。

@Service public class RoleService { public static final int DEFAULT_AGE = 18; public int id = 1000; public String getRoleName() { return "管理员"; } public static int getParentId() { return 2000; } }

在调用的地方这样写:

@Service public class UserService { @Value("#{roleService.DEFAULT_AGE}") private int myAge; @Value("#{roleService.id}") private int id; @Value("#{roleService.getRoleName()}") private String myRoleName; @Value("#{roleService.getParentId()}") private String myParentId; public String test() { System.out.println(myAge); System.out.println(id); System.out.println(myRoleName); System.out.println(myParentId); return null; } }

在UserService类中通过@Value可以注入:成员变量、常量、方法、静态方法获取到的值,到相应的成员变量中。

一下子有没有豁然开朗的感觉,有了这些,我们可以通过@Value注解,实现更多的功能了,不仅仅限于注入系统属性。

7.3 静态类

前面的内容都是基于bean的,但有时我们需要调用静态类,比如:Math、xxxUtil等静态工具类的方法,该怎么办呢?

答:用T加括号。

示例1:

@Value("#{T(java.io.File).separator}") private String path;

可以注入系统的路径分隔符到path中。

示例2:

@Value("#{T(java.lang.Math).random()}") private double randomValue;

可以注入一个随机数到randomValue中。

7.4 逻辑运算

通过上面介绍的内容,我们可以获取到绝大多数类的变量和方法的值了。但有了这些值,还不够,我们能不能在EL表达式中加点逻辑?

拼接字符串:

@Value("#{roleService.roleName + '' + roleService.DEFAULT_AGE}") private String value;

逻辑判断:

@Value("#{roleService.DEFAULT_AGE > 16 and roleService.roleName.equals('苏三')}") private String operation;

三目运算:

@Value("#{roleService.DEFAULT_AGE > 16 ? roleService.roleName: '苏三' }") private String realRoleName;

还有很多很多功能,我就不一一列举了。

EL表达式实在太强大了,对这方面如果感兴趣的小伙伴可以找我私聊。

8 ${}和#{}的区别

上面巴拉巴拉说了这么多@Value的牛逼用法,归根揭底就是${}和#{}的用法。

下面重点说说${}和#{}的区别,这可能是很多小伙伴比较关心的话题。

8.1 ${}

主要用于获取配置文件中的系统属性值。

例如:

@Value(value = "${susan.test.userName:susan}") private String userName;

通过:可以设置默认值。如果在配置文件中找不到susan.test.userName的配置,则注入时用默认值。

如果在配置文件中找不到susan.test.userName的配置,也没有设置默认值,则启动项目时会报错。

8.2 #{}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgxwy.html