背景

业务中有一个项目还是Spring+Tomcat的结构进行开发部署的,在引入一个功能的时候一位同学使用了如下方式注入一个参数

  1. public class T {
  2. @Value("${open}")
  3. private Boolean enable;
  4. }

结果在发布到测试环境的过程中却出现了 ${open} 不能被解析的错误。

原因

这个错误比较典型,很容易产生明明这个数据有,就是不能注入的错觉,然后看别人各种博客,百思不得其解。细究其原因,还是对Spring的理解不到位。

在我理解中,Spring解决了Bean依赖管理以及Bean生命周期的问题。如果不用Spring,我们需要手动去实现new操作,然后进行注入,以此实现多个类相互引用的目的。

不局限于Bean管理,还有profile环境管理,properties参数管理

为什么Spring能够实现依赖注入?

Spring能够实现注入的前提是Bean被Spring的容器管理了,如果Bean没有被容器管理,那么Spring的依赖注入就是无根之萍,根本就找不到一个合格的Bean可以被用于注入。

同理,在这个错误中也是如此,使用 ${open} 来进行注入,那么就必须将properties文件注入到Spring中去,将properties交付给Spring进行管理。

在这一步很容易将maven编译器的properties文件和注入Spring的properties文件进行混淆,这个是最需要注意的。

如果能理解明白这两层含义,基本上就不会遇到这些问题了。

  • Bean注入,参数注入等等需要将数据交付给Spring进行管理
  • 作用在编译期和运行期的properties文件要区分开来

    好消息

虽然这里算是一个小坑点,但是随着SpringBoot的深入人心,大家都会使用SpringBoot约定俗成的习惯,后边碰到这种问题的情况就越来越低了

小结

万变不离其宗,Spring的依赖注入首先还是需要Bean被其管理,其次才能实现注入,理解了这里的问题,后边再怎么变化都能解决。