Spring中的两个疑惑?

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

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

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

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

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

阅读 4.6k
5 个回答

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

@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里面写死字符串的,一般是引用配置文件中的内容

@value 结合配置文件来使用的场景应该是不变的量,如果是一个变量更应该在代码中定义

疑问一

Spring表达式语言(SpEL)是一种功能强大的表达式语言,在Spring框架的多个方面得到广泛应用。以下是一些常见的使用场景:

  • 配置文件中

    • 在Spring的XML配置文件或注解中使用SpEL进行动态值计算。例如,通过SpEL可以根据其他配置项的值计算当前配置项的值。
  • 注解中

    • 在注解(例如@Value)中使用SpEL来动态注入值。例如,@Value("${username}")可以从配置文件中读取值并注入到Bean的属性中。
  • Spring Security

    • 使用SpEL定义安全表达式,控制访问权限。例如,@PreAuthorize("hasRole('ROLE_ADMIN')")
  • Spring Data JPA

    • 在查询方法中使用SpEL动态生成查询条件。例如,通过SpEL可以根据方法参数动态构建查询语句。

尽管SpEL功能强大,但在日常开发中,开发者会根据具体需求选择是否使用SpEL。如果项目中需要动态计算值或进行复杂的配置,SpEL会非常有用。

疑问二

@Value注解是Spring框架中的常用注解之一,用于将外部配置文件中的值注入到Bean的属性中。虽然看起来像是直接在代码中写死了值,但实际上@Value注解的主要目的是从外部配置文件中读取值,而不是硬编码在代码中。例如:

@Value("${username}")
private String username;

在这个例子中,username的值是从配置文件(如application.properties)中读取的:

username=张三

这样做的好处是,如果需要修改username的值,只需修改配置文件,而不需要重新编译代码。

使用@Value注解并不违背Spring的初衷,反而是Spring提供的一种灵活的配置方式,允许开发者将配置与代码分离,增强代码的可维护性和可扩展性。

新手上路,请多包涵

(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的依赖注入和其他特性来提高代码的可维护性和可扩展性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏