@Resource与@Autowired有啥区别?
@Autowired:
该注解属于Spring中的注解,使用必须有spring的依赖,根据类型进行装配(ByType),默认情况下装配的对象必须存在,如果允许为null的话需要设置required属性为false(@Autowried(required=false)),如果想使用名称装配可以结合@Qualifier注解使用(@Autowried @Qualifier("xxxService"))
@Resource:
@Resource跟@Autowired基本一样,@Resource不属于spring体系中的,是Java中javax.annotation.Resource包下的,也就是JSR250标准,但是spring依然支持该注解的注入装配,该注解有两个属性为name与type,默认按照名称进行注入装配(ByName),在spring中会将name属性解析成bean名称,type属性解析为bean类型,也可以指定任意一种方式进行装配(@Resource(name="xxxService"))、(@Resource(type=xxxService.class)),或者也可以同时指定两种方式进行装配,使用任意一种方式都会去spring上下文中去找唯一匹配的bean装配,如果找不到则会抛出异常。
@Resource不支持@Primary注解表示的优先级。
@Resource不支持设置检查注入是否为null,也就是没有@Autowired的required的设置。
总结:
看完上面的介绍,我们可以知道其实两个注解都是为了装配bean而来,主要区别也就是装配的方式不同,并没有哪一个有相对的不足,但是可以在不同的场景和情况使用不同的注解会更佳,下面举例一种情况。
接口:
public interface UserService {
public List<User> listUser();
}
实现类1:
@Service
public class UserServiceImpl1 implements UserService{
@Autowired
private UserMapper mapper;
public List<User> listUser() {
System.out.println("UserServiceImpl1");
return mapper.listUser();
}
}
实现类2:
@Service
public class UserServiceImpl2 implements UserService{
@Autowired
private UserMapper mapper;
public List<User> listUser() {
System.out.println("UserServiceImpl2");
return mapper.listUser();
}
}
上面准备一个一个接口,但有两个实现类,下面我们再写一个控制器对该接口进行注入装配
控制器:
@Controller
public class UserController {
@Autowired
private PersonService service;
@RequestMapping("listUser")
@ResponseBody
public void listUser(){
List<User> list = service.listUser();
System.out.println(list);
}
}
如果我们继续像原来一样使用@Autowried注解进行默认方式装配则是按类型进行装配,那么在此情况一个接口有两个实现类按照类型装配则会有两个实例,则会抛出org.springframework.beans.factory.BeanCreationException bean异常,无法做出选择,那么我们可以使用以下方式
@Controller
public class UserController {
@Resource(name="UserServiceImpl1")
private PersonService service;
@Autowired
@Qualifier("UserServiceImpl2")
private PersonService service2;
@RequestMapping("listPerson")
@ResponseBody
public void listPerson(){
List<Person> list = service.listPerson();
System.out.println(list);
}
@RequestMapping("listPerson2")
@ResponseBody
public void listPerson2(){
List<Person> list = service2.listPerson();
System.out.println(list);
}
}
使用对ByName进行注入需要在Service类中的@Service注解中指定默认value值(name名称),否则编译会报错
@Service("UserServiceImpl1")
public class UserServiceImpl1 implements UserService{
@Autowired
private UserMapper mapper;
public List<User> listUser() {
System.out.println("UserServiceImpl1");
return mapper.listUser();
}
}
@Service("UserServiceImpl2")
public class UserServiceImpl2 implements UserService{
@Autowired
private UserMapper mapper;
public List<User> listUser() {
System.out.println("UserServiceImpl2");
return mapper.listUser();
}
}
搜原创公众号: Java资料社区。