准备
Controller层调用Service层
Service层Interface:
public class UserServiceImpl implements UserService {
// ... 代码
}
Service层实现类:
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
调用方式
Controller层三种调用Service注解:(@Autowired,@Resouce,@Inject,其中@Inject使用较少)
@Autowired
private IUserService userService;
@Resource
private IUserService userService;
@Inject
private IUserService userService;
区别
1.@Autowired
默认是先按照类型注入,如果一个类型存在多个bean,再按照bean的名称,即id进行注入。特点:
①可以作用到构造方法上、属性上、方法上
②拥有 required 属性,表示在IOC容器加载时,是否必须注入。如果标注为false则不会再IOC容器启动加载时注入IOC容器。
@Autowired(required = false)
③根据 @Retention(RetentionPolicy.RUNTIME) ,注解保留至运行期
④可以和Qualifier搭配使用,按照指定id的bean对象注入
@Qualifier(value = "uService")
2.@Resource
是JDK提供的注解,在javax.annotation包下,属于JSR250规范。
@Resource只能使用bean名称进行注入。没有required属性,即容器初始化时就必须注入对象,若无法注入则报错。特点:有name属性
//从容器中寻找id为uService的bean注入
@Resource(name="uService")
3.@Inject
属于JSR330的规范,若要使用@Inject注解则需要引入以下依赖
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
特点:搭配@Named使用,按照id注入bean
@Named(value = "uService")
总结
1.@Resource是JavaEE规范定义的注解,@Autowired是Spring框架提供的注解, @Inject 是JSR-330规范中的注解。
2.@Resource是按照名称进行注入的,它可以通过name属性指定具体要注入的资源名称,如果未指定名称,则按照类型进行注入。而@Autowired是按照类型进行注入的,它会根据类型在容器中找到对应的实例进行注入。不行的话会根据名称来进行注入。