Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
http://moshowgame.iteye.com/blog/1607718
@Autowired自动装配
上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我们需要偷懒一下,然spring去帮我们自动装配,自动装配的类型有两种,一种是byName,一种是byType。
*。如果是XML版,只需要在bean里面加个 autowire="byXXX"就行了。
重写一下DAO.Impl的toString()方法来做测试,看看注入的ID。
@Override
public String toString() {
return "daoId=" + daoId;
}
-----------------------------------------------------------------------------------------
<bean name="userDAO1" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="1"></property>
</bean>
<bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="2"></property>
</bean>
<bean id="userService" class="com.bjsxt.service.UserService" scope="prototype" autowire="byName">
</bean>
-----------------------------------------------------------------------------------------
①这样的运行结果是null,因为是byName按名字分配的,没有和userDAO的名字相同,如果将"userDAO1"改为"userDAO"则输出daoID=1,同理可得改"userDAO2"为"userDAO"则输出daoID=2。
②记得不能两个同时改为"userDAO",否则报错,找到两个同名,不知道配那个。
③如果直接修改 autowire="byType"会报错,
Error creating bean with name 'userService' defined in class path resource [beans.xml]: Unsatisfied dependency expressed through bean property 'userDAO': : No unique bean of type [com.bjsxt.dao.UserDAO] is defined: expected single matching bean but found 2: [userDAO1, userDAO2]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.bjsxt.dao.UserDAO] is defined: expected single matching bean but found 2: [userDAO1, userDAO2]
就是说找到两个不知道配哪个好......( - - )
④将"userDAO2"的bean用<!-- -->注释掉,然后改autowire="byType",则输出的是daoID=1.
或将"userDAO1"的bean用<!-- -->注释掉,然后改autowire="byType",则输出的是daoID=2.
- -要是两个同时注释掉的话,注意是不会报错,因为没得装配了,跟①的情况差不多,只能输出null。
Annotation版本的@Autowired自动装配
首先得对UserService类的setter注入做做改进,如果是用constructor则对构造方法进行改进,方法和道理一样。
-----------------------------------------------------------------------------------------
<!--如果XML里面只有一个可以装配,那么setter直接加个@Autowired以就可以了.-->
<bean id="u1"
class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
-----------------------------------------------------------------------------------------
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
-----------------------------------------------------------------------------------------
<!--如果XML里面有多个可以装配,那么setter上面加个@Autowired之外还要在参数里面加个@Qualifier("u1")指定装配的是哪个对象-->
<bean id="u1" class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
<bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
-----------------------------------------------------------------------------------------
//加个@Autowired以及指定注入的是u1 @Qualifier("u1")
@Autowired
public void setUserDAO(@Qualifier("u1") UserDAO userDAO) {
this.userDAO = userDAO;
}
-----------------------------------------------------------------------------------------
补充:@Resource的用法:
跟@autowired差不多,不过默认是用byName,得名字完全对应才能自动装配
@Resource
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
-----------------------------------------------------------------------------------------
<bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
<bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
-----------------------------------------------------------------------------------------
XML和Annotation版本源码全部经Junit测试成功!
⊙_⊙最后,按照我的惯例,附上本次的项目源码三个(XML和Annotation版本,还有补充的@Resource的,源码来自尚学堂马士兵),类库用到三个(spring.jar junit.jar(eclipse自带) commons-logging.jar 缺少类库到http://moshowgame.iteye.com/admin/blogs/1606825下载)。
^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!
Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)相关推荐
- Android开发知识(二十二)LayoutInflater装载xml布局过程的源码解析
文章目录 前言 LayoutInflater实例 LayoutInflater的装载过程 include 标签解析 merge 标签解析 attachToRoot参数解析 View创建过程 (1)判断 ...
- Spring 注解面面通 之 @CrossOrigin 处理请求源码解析
@CrossOrigin源码解析主要分为两个阶段: ① @CrossOrigin注释的方法扫描注册. ② 请求匹配@CrossOrigin注释的方法. 本文针对第②阶段从源码角度进行解 ...
- Spring 注解面面通 之 @CrossOrigin 注册处理方法源码解析
参照<Spring 注解面面通 之 @RequestMapping 注册处理方法源码解析>,其讲解了@RequestMapping注释的处理方法注册过程,而@CrossOrigin是基 ...
- Spring中的自动装配和Autowired
彻底搞明白Spring中的自动装配和Autowired 一.自动装配 当Spring装配Bean属性时,有时候非常明确,就是需要将某个Bean的引用装配给指定属性.比如,如果我们的应用上下文中只有一个 ...
- Spring容器父子类继承关系交给spring容器管理采用@autowired自动装配分析
第一个青春是上帝给的 第二个的青春是靠自己努力的. 在开发项目过程中开发者们可能会遇到这样的问题 @autowired自动装配模式的工作模式是:在springIOC定位所有的Bean后,这个字段需要按 ...
- 万字详解! Spring Bean的自动装配
点击上方 Java学习之道,选择 设为星标 每天18点,干货准时奉上! 何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配 ...
- Spring精华问答 | Spring Bean的自动装配是怎么回事?
戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...
- Spring按类型自动装配注入数组、集合、Map
Spring按类型自动装配注入数组.集合.Map时,是把应用上下文中对应类型的bean装配进集合,而不是直接查找一个对应类型的集合然后注入.以下面这段代码为例: import org.springfr ...
- Spring——Bean的自动装配
自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中有三种装配方式 1.在xml中显示的配置 2.在Java中显示的配置 3.隐 ...
最新文章
- linux shell expr命令 字符串操作
- python代码大全表解释-python文件及目录操作代码汇总
- 实例演示在SQL中启用全文检索
- Vue.js使用-http请求
- java导出表格_java怎么导出excel表格
- Git命令:常用Git命令集合
- linux 的swap具体分析_Linux SWAP 深度解读
- drools 7.x-复杂事件处理入门
- kotlin半生对象_Kotlin单一对象,Kotlin伴侣对象
- 了解Hadoop数据类型,输入输出格式及用户如何自定义。
- {Unity} iOS 9 字体的坑
- qt opengl 天空盒
- Ubuntu18.04和Win10共享文件夹
- 如何在win10电脑上录音
- 城市信息area.js
- 如何让树莓派启动实现图形化界面和命令行模式的切换从而解决两个光标的问题
- 综述:人类电生理的脑连接组学
- 使用Caffe尝试DeepID
- 记录关于标记工具LabelIMG生成txt文件时的相关问题
- 基于51单片机密码锁-舵机开锁-CXM
热门文章
- 【数据结构与算法】之深入解析“最接近的三数之和”的求解思路与算法示例
- 234. Palindrome Linked List 回文链表
- 【嵌入式】Ubuntu20.04执行arm-linux-gc 没有那个文件或目录
- 【Qt】Qt中QJsonObject类
- linux查看重传次数,TCP-聊一聊重传次数
- joomla添加html,html – 向joomla的前端组件视图添加表单
- 计算机论文指导书,计算机毕业论文指导书.doc
- mac m1下安装kubenetes的dashboard
- 链接 动态链接 静态链接
- Shell(3)——截取某些字符、默认值处理