Spring中的两个疑惑?

后端新人,正在学习Spring,有两个很困惑的地方
(1)Spring表达式语言(SpEL)在日常开发中用的多吗?
(2)

@Value("张三")
private String username;

使用注解的写法是否违背了Spring诞生的初衷?
看了很多Spring教程,在讲述为什么要使用Spring的时候,都提出了一个很重要的原因就是,以前的

private String username = "张三";
private Object obj = new xxxxxxx();

这种直接赋值的写法写死了,要修改值的话可能要改很多地方,而且代码要重新编译、测试,不利于代码的维护和扩展。
所以有了Spring,我们可以把这些变量的值放到配置文件中,如果以后想要改变这些变量的值的话,直接修改配置文件,而不需要修改代码。
但是使用注解这种写法,不就又回到了之前没有Spring的写法了吗?不还是在代码中写死了吗?

阅读 1.1k
3 个回答
新手上路,请多包涵

(1)Spring表达式语言(SpEL)在日常开发中用的多吗?

SpEL(Spring Expression Language)是Spring框架提供的一种强大的表达式语言,它允许在运行时查询和操作对象图。SpEL在Spring框架中被广泛使用,特别是在需要动态计算或操作对象属性时。例如,你可以在XML配置文件中使用SpEL来动态指定bean的属性值,或者在@Value注解中使用SpEL来注入复杂的表达式结果。

在日常开发中,SpEL的使用频率取决于你的具体需求。如果你的项目中有很多动态计算的需求,或者你需要在运行时根据条件来决定bean的配置,那么SpEL会非常有用。然而,如果你的项目相对简单,或者你更倾向于静态的配置,那么SpEL的使用可能不会那么频繁。

(2)使用@Value注解的写法是否违背了Spring诞生的初衷?

使用@Value注解本身并不违背Spring诞生的初衷。Spring的核心目的是简化企业级应用的开发,提供依赖注入(DI)和面向切面编程(AOP)等功能。@Value注解是Spring提供的一种方便的方式来注入配置值,它允许你将配置值与代码解耦。

当你在代码中直接赋值,如private String username = "张三";,你确实将值硬编码到了代码中,这不利于维护和扩展。但是,当你使用@Value注解,如@Value("张三"),你实际上是在告诉Spring框架,这个值应该由Spring容器来管理。这意味着值可以从外部配置文件、环境变量或者其他地方动态地注入到你的bean中。

这样做的好处是,你可以在不修改代码的情况下,通过改变配置文件来改变应用程序的行为。例如,你可以在开发环境中使用一个值,在生产环境中使用另一个值,而不需要重新编译代码。这正是Spring所提倡的配置与代码分离的理念。

总的来说,@Value注解是一种将配置值注入到bean属性的便捷方式,它并没有违背Spring的初衷,反而正是Spring框架提供的一种实现配置与代码分离的手段。当然,过度使用硬编码值或者在代码中直接创建对象确实会降低代码的灵活性和可维护性,这是需要避免的。正确的做法是合理地使用Spring的依赖注入和其他特性来提高代码的可维护性和可扩展性。

你这问题提的挺有意思的,因为第一个问题就是第二个问题的答案。

@Value("张三") private String name

完全可以写作

@Value("${name_in_properties}") private String name

然后在配置文件里面写

name_in_properties = 张三

这样就不用重新编译了。

新手上路,请多包涵

表达式好像主要是可以使用一些方法,列如把

test: a,b,c

注入

@Value("#{'${test:}'.split(',')}")
private List testList;

很少直接在@Value里面写死字符串的,一般是引用配置文件中的内容

推荐问题
宣传栏