起源
idea 自动注入Mapper有警告,而且又红色错误提醒(编译可以通过)
这很烦,不是吗? 我受够了,得想点办法。
idea会提示
Spring team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies.”
为毛Spring这样推荐哇?(⊙o⊙)嗯,按照提示先修改为:
1 | private final UserMapper userMapper; |
此时仍然存在一个问题是idea提示
Could not autowire.
自动注入 bean, spring帮助我们完成了,但是同时Spring提供了一些注解来显式的注明bean之间的引用关系,其中最为熟知的自然是@Controller
,@Service
,@Repository
,@Component
等。
这里其实给UserMapper
接口加上@Repository
,@Component
就可以解决,那么他们之间有什么区别?
区别@Controller
,@Service
,@Repository
,@Component
在Stackoverfolw找到了同样的问题,得票最高的给出了一个表
Annotation | Meaning |
---|---|
@Component | generic stereotype for any Spring-managed component |
@Repository | stereotype for persistence layer |
@Service | stereotype for service layer |
@Controller | stereotype for presentation layer (spring-mvc) |
也提出,使用@Service, @Controller, @Repository更好做切面,也有人给出总结:
@Service, @Controller, @Repository = {@Component + some more special functionality}
为什么建议构造器注入
构造器注入与域注入
热门文章 Why field injection is evil 给出总结:
Field injection:
- less code to write
- unsafe code
- more complicated to test
Constructor injection:
- safe code
- more code to write (see the hint to Lombok)
- easy to test
Spring 的博客上指出 Setter injection versus constructor injection and the use of @Required