讲解实例+详细介绍@Resource与@Autowired注解的区别

前言
1、什么是byName和byType
简单来说,byName就是根据变量名去匹配bean的id属性,而byType则是根据变量类型去匹配bean的class属性。实例说明:

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

此处byName就是拿变量名userService去匹配IOC容器的id为userService的bean,而byType就是拿变量类型UserService去匹配IOC容器的id为com.test.UserService.UserServiceImpl的bean,这里可以匹配成功是因为UserServiceImplUserService的实现类。

2、@Resource与@Autowired都是用来调用已经注入到IOC容器中的bean的

一、@Resource
1、java中自带的注解 (javax.annotation.Resource)
2、默认按照名称(byName)方式进行bean装配,也可以按类型(byType)装配 
3、@Resource的作用范围:类、成员变量、方法
4、@Resource的使用
步骤:@Resource默认通过byName注入,如果没有匹配则通过byType注入。

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

@Resource
private UserService userService;

首先默认通过byName匹配,变量名userService无法匹配IOC容器中任何一个id(因为这里UserService有两个实现类,也就对应有相应的两个bean,即userServiceImpl1userServiceImpl2),于是再通过byType匹配,发现类型UserService的实现类是两个,仍然无法确定,于是报错。
这时候就要提到@Resource两个重要的属性:name和type,它们用来显式指定byName和byType方式。
显示指定去匹配那个bean时,主要有以下四种情况:

// 1. 默认方式:byName 即不显示指定
@Resource  
private UserService userDao; 

// 2. 显示指定byName
@Resource(name="userService")  
private UserService userService; 

// 3. 显示指定byType
@Resource(type=UserService.class)  
private UserService userService; 

// 4. 显示指定byName和byType
@Resource(name="userService",type=UserService.class)  
private UserService userService; 

①既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
②指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
③指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则失败报错
④同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败报错。

二、@Autowired
1、Spring自带的注解(org.springframework.beans.factory.annotation.Autowired)
2、默认按照类型(byType)方式进行bean装配,也可以按名称(byName)装配,需要结合@Qualifier如:@Autowired @Qualifier("manImpl")
3、默认要求装配的bean对象必须在IOC容器中存在,如果不存在会报错但不影响正常使用;若允许bean对象不存在,可设置@Autowired(required = false) 。即表示忽略当前要注入的bean,如果有直接注入,没有则跳过,也不会报错了
4、@Autowired的作用范围:成员变量、构造器、方法、参数、注解
5、@Autowired的使用
步骤:@Autowird默认的注入方式为byType,也就是根据类型匹配,当有多个实现时,则通过byName注入,也可以通过配合@Qualifier注解来显式指定name值,指明要使用哪个具体的实现类。

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

@Autowired
private UserService userService;

根据上面的步骤,可以很容易判断出,直接这么使用是会报错的。
原因:首先通过byType注入,判断UserService类型有两个实现,无法确定具体是哪一个,于是通过byName方式,这里的变量名userService也无法匹配IOC容器中id(此处指的userServiceImpl1userServiceImpl2),于是报错。
(注意:通过注解注入到IOC容器的id值默认是其类名首字母小写,比如上面的UserServiceImpl1和UserServiceImpl2类bean的id默认为userServiceImpl1和userServiceImpl2)

解决方案:

// 方式一:改变变量名
//将原来的userservice改名为userServiceImpl1,这样就能匹配到对应的唯一bean了
@Autowired
private UserService userServiceImpl1;
// 方式二:配合@Qualifier注解来显式指定name值,这样就能匹配到对应的唯一bean了
@Autowired
@Qualifier(value = "userServiceImpl2")
private UserService userService;
// 方式三:配合@Primary注解来指定自动装配哪一个bean
//加上@Primary,匹配bean时,该bean就会被优先选中。
@Service
@Primary
public class UserServiceImpl1 implements UserService

三、总结
1、@Resource与@Autowired对比
在这里插入图片描述
2、@Autowired装配流程
在这里插入图片描述
3、@Resource装配流程
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 9 一、 什么是IOC、DI 9 二、 编辑xml文件时,没有提示 9 三、 注入类型(Injecting dependencies) 9 (一) setter注入类型Setter Injection 9 (二) 构造方法Constructor Injection 10 四、 id、name 11 五、 简单属性的注入 11 六、 Bean的作用范围scope 12 七、 集合注入 12 八、 自动装配autowire 13 (一) byName 13 (二) byType 14 (三) 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:annotation方式Spring 16 一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope、@PostConstruct、@PreDestroy 19 六、 注解对应的jar包 19 第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ类库 22 (三) AOP的annotation实例 22 (四) AspectJ的专业术语 23 (五) 织入点语法 23 (六) Advice 24 (七) Pointcut 26 (八) annotatin方式的AOP实例 26 二、 AOP配置xml方式 27 三、 AOP实现动态代理注意 28 第九课:DataSource 28 一、 Sping配置数据源: 28 二、 注入使用 29 三、 dbcp.BasicDataSource 29 第十课 Spring整合Hiberante3 30 一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的jar包 31 (三) 搭建日志环境并配置显示DDL语句jar包 31 三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步: 首先整合Spring + Hibernate 41 三、 第三步:再来整合Struts2 41 四、 struts的读常量: 43 第十二课:DTO、VO 43 一、 DTO 43 二、 VO 43 第十二课:SSH整合存在的问题 43 一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46
1 Spring基本特征 6 2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化(简单工厂模式) 14 3.3.3初始化(创建)bean时机 15 Lazy-init初始化bean的时机拓展: 15 3.4 Bean的作用域 16 Scope单例多例作用域拓展: 16 3.4.1 singleton(默认值) 16 3.4.2 prototype 17 3.4.3 Request 17 3.4.4 Session 18 3.4.5 Global session 18 3.4.6 指定Bean的初始化方法和销毁方法 18 Bean的初始化和销毁拓展: 18 Spring的IOC总结: 20 3.5 依赖注入(DI) 20 3.5.1 使用构造器注入 20 3.5.2 使用属性setting方法进行注入 21 3.5.3 装配list集合 22 3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 3.6.2 @Qualifier 27 3.6.3 @Resource 27 3.6.4 @PostConstruct 28 3.6.5 @PreDestroy 28 注解注入拓展: 28 3.7扫描注入 30 注解扫描拓展: 32 Mvc用注解写: 34 Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理异常 96 4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 继承JdbcDaoSupport 107 5.1.6 使用properties文件 107 5.1.7 RowMapper的使用 107 拓展: 108 DataSource注入的三种方式: 108 5.1.8声明式事务管理 116 5.1.8.1Spring的事务管理器 117 5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 HibernateTemplate模板 131 5.2.2 声明式事务 131 配置XML文件 131 拓展: 132 注解形式: 137 拓展: 138 6 Struts2+spring+hibernate 141 6.1 需要添加的jar包 141 6.2 Spring融合web服务器 141 6.3 struts.xml文件 143 6.4 OpenInSessionView 143 拓展: 144 实例: 146

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值