侧边栏壁纸
博主头像
极客手札博主等级

Do everything!

  • 累计撰写 31 篇文章
  • 累计创建 16 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Spring框架学习

spring Boot

SpringBoot注解
Spring从入门到精通
SpringCloud学习

@Autowired 和 @Resource

联系

  • @Autowired和@Resource注解都是作为bean对象注入的时候使用的
  • 两者都可以声明在字段和setter方法上

区别

  • @Autowired注解是Spring提供的,@Resource注解是J2EE本身提供的
  • @Autowired注解默认通过byType方式注入,@Resource注解默认通过byname方式注入
  • @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,标识忽略当前要注入的bean,如果有,直接注入,如果没有,不会报错

byName就是通过变量名去匹配id的属性,byName则是变量类型去匹配bean的class属性

  • bean的定义
<bean id="userService" class="com.test.UserServiceImpl">
</bean>
@Autowired
private UserService userService;

此处byName就是拿变量名userService去匹配IOC容器的id userService,匹配成功;而byType就是拿变量类型UserService去匹配IOC容器的id com.test.UserServiceImpl,因为UserServiceImpl是UserService的实现,所以也匹配成功!

  • @Autowird注解的使用

步骤:@Autowird默认的注入方式为byType,也就是根据类型匹配,当有多个实现时,则通过byName注入,也可以通过配合@Qualifier注解来显式指定name值,指明要使用哪个具体的实现类

举例:

首先有一个接口UserService和两个实现类UserServiceImpl1和UserServiceImpl2,并且这两个实现类已经加入到Spring的IOC容器中了

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

1通过@Autowired注入使用

@Autowired
private UserService userService;

根据上面的步骤,可以很容易判断出,直接这么使用是会报错的

原因:首先通过byType注入,判断UserService类型有两个实现,无法确定具体是哪一个,于是通过byName方式,这里的变量名userService也无法匹配IOC容器中id(此处指的userServiceImpl1和userServiceImpl2),于是报错。

注意:通过注解注入到IOC容器的id值默认是其类名首字母小写

0

评论区