以前我们注入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 #{}