@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下载)。
^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!
相关推荐
本文将深入探讨如何通过注解(Annotation)和`@Resource`来实现自动装配,以及其背后的源码实现。 ### 一、注解驱动的自动装配 在Spring 2.5引入了注解支持后,开发者可以使用注解来声明Bean的属性、方法或构造...
例如,`@Controller`、`@Service`、`@Repository` 和 `@Component` 注解用于标记Spring的Bean,`@Transactional` 用于标记事务管理,`@Autowired` 用于自动装配依赖。在Hibernate中,`@Entity`、`@Table`、`@Id`等...
1. **依赖注入(Dependency Injection, DI)**:Spring Annotation中最常用的注解之一是`@Autowired`,它实现了自动装配bean。当在类的字段或构造器上使用`@Autowired`时,Spring会自动寻找类型匹配的bean并注入。...
4. **@Autowired**:Spring的自动装配注解,用于注入依赖。在`org.springframework.beans.factory.annotation`包中,我们可以找到AutowiredAnnotationBeanPostProcessor,它是处理@Autowired注解的关键。 5. **@...
此外,通过 `@Autowired` 注解,Spring 可以自动装配依赖关系,降低代码间的耦合度。 Hibernate3.3 是一个流行的 Java ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式来操作数据库。在 Hibernate3.3...
本篇将详细探讨"3Spring使用annotation方式autowire"这一主题,包括注解驱动的自动装配(Autowiring)以及相关的源码分析。 ### 一、注解驱动的自动装配 自动装配是Spring框架的一个核心特性,它允许框架自动管理...
在Spring框架中,注解(Annotation)自动匹配注入IoC(Inversion of Control,控制反转)是一种关键特性,它极大地简化了Java应用的配置管理。本文将深入探讨这一主题,帮助开发者更好地理解和利用这一功能。 首先...
在Spring中,Bean装配是配置和实例化Bean的过程,可以通过XML配置文件、注解或Java配置类来实现。Bean装配涉及Bean的生命周期管理,包括初始化、销毁方法以及属性的设置。 "04-di-annotation"则关注于依赖注入(DI...
Spring 2引入了大量注解,如`@Autowired`实现自动装配,`@Service`、`@Repository`和`@Controller`定义服务层、数据访问层和控制层组件,`@Transactional`实现事务管理。通过注解,可以实现无XML配置的依赖注入。 ...
`@Autowired`注解可以自动装配bean,而`@Qualifier`则用于指定多个相同类型的bean中需要哪一个。这种改进使得代码更加简洁,降低了XML配置的复杂性。 2. **注解驱动的开发** 在Spring 2.5中,许多原本需要XML配置...
例如,使用`@Autowired`注解可以自动装配bean的依赖,而`@Qualifier`则可以指定特定的bean实例。 4. **注解配置与XML配置的对比**:Spring框架既支持XML配置也支持注解配置。XML配置方式直观,但代码量大,维护困难...
例如,@Autowired用于自动装配依赖,@Service、@Repository和@Controller用于标记服务、数据访问和控制器层的类,@RequestMapping用于映射HTTP请求等。注解的使用使得代码更直观,减少了配置文件的复杂性。 JPA...
例如,@Controller注解标记一个类作为Spring MVC的控制器,而@Autowired注解用于自动装配依赖,无需显式配置XML。 Spring MVC是Spring框架的一部分,主要用于构建Web应用程序。在这个项目中,你可以看到如何使用...
Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和装配。依赖注入使得代码更加松耦合,易于测试和维护。此外,Spring的AOP功能允许开发者定义横切关注点,如日志记录、安全性等,而不影响...