@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注解与自动装配.rar
java web开中spring在autowired自动注入极度精简版本,绝对可以运行。博客地址: http://blog.csdn.net/qq5132834/article/details/47870351
autowired spring autowired注解完整版 ... 使用Spring2.5的新特性——Autowired可以实现快速的自动注入,而无需在xml文档里面添加bean的声明,大大减少了xml文档的维护。(偶喜欢这个功能,因为偶对xml不感冒)。
spring的annotation的autowired配置方法。
主要介绍了彻底搞明白Spring中的自动装配和Autowired注解的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
下面小编就为大家带来一篇基于Spring@Autowired注解与自动装配详谈。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
学习弹簧自动装配 学习自动装配弹簧
请解释Spring Bean的自动装配 请解释自动装配模式的区别 如何开启基于注解的自动装配 请举例解释Required annotation 请举例解释Autowired注解 请举例说明Qualifier注解 构造方法注入和设值注入有什么区别 Spring...
NULL 博文链接:https://ysj5125094.iteye.com/blog/2054257
在阅读本篇之前,如果对后置处理器还不够熟悉的先参考下spring BeanPostProcessor 生命周期 @Autowired使用 构造函数注入 public Class Outer { private Inner inner; @Autowired public Outer(Inner inner) { ...
NULL 博文链接:https://forestqqqq.iteye.com/blog/2235292
NULL 博文链接:https://wujiu.iteye.com/blog/2010601
- 重构 controller 包,使用 @Autowired 装配对象 - 更新依赖 - web-mvc 对应 database-mvc - web 对应 database - 添加数据库 SQL 转储文件 ### Ver. 2.0 - 添加 web-mvc module - 新 module 使用 spring-web...
文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说web.xml配置: [java] view plaincopy 01.<?xml version="1.0" encoding="UTF-8"?> 02....
2.6 spring-bean 配置mapper自动扫描 MapperScannerConfigurer将扫描basePackage所指定的包下的所有接口类(包括子类), 如果它们在SQL映射文件中定义过,则将它们动态定义为一个Spring Bean, 这样,我们在...
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。 1、共同点 两者都可以写在字段和setter方法上。两者...