你同事说得那么玄乎,但我不知道他在说什么。
@
Autowired 要是写在变量上,同时又不提供 set 方法(包括通过构造方法 set ),那么这个类离开了 Spring 将无法自举,即你直接 new 出来的对象,是无法使用的,@Autowired 的变量永远是 null。Spring 官方推荐的做法是,@Autowired 放到构造器或者 set 方法上,这样即使脱离了 Spring,你这个类还能通过 new 方法实例出一个可用的对象。这里还有另一层含义,传统的依赖注入概念,是让容器 new、set 之后把 bean 给你,后者是符合这种传统概念的,这意味着你的依赖注入容器,可用方便地从 Spring 换成其它容器。
But,Java 不用 Spring 是个伪命题,@Autowired 写在变量上能极大地提高代码可读性,以及更重要地,重构方便性。
另外只写 set 方法但是不加 @
Autowired 注解,是一种严重影响代码可读性地行为,它要求读代码的人必须知道“ Spring 会通过反射扫描到该方法,进而知道这是用来做注入的”,否则将会非常困惑“这叼变量是怎么注入的”。
lombok.@Slf4j 与上面没关系,但是 lombok.@Setter 与 @
Autowired 有关系,用了 @
Setter,你源代码就没有 set 方法了,自然也没办法在 set 方法上加 @
Autowired,lombok 尝试解决这种冲突,但到目前为止实现方式还是很丑陋。