`
moshowgame
  • 浏览: 42961 次
  • 性别: Icon_minigender_1
  • 来自: 潮州
社区版块
存档分类
最新评论

Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

阅读更多

 

@Autowired自动装配

上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我们需要偷懒一下,然spring去帮我们自动装配,自动装配的类型有两种,一种是byName,一种是byType

 

*。如果是XML版,只需要在bean里面加个 autowire="byXXX"就行了。

重写一下DAO.ImpltoString()方法来做测试,看看注入的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下载)。

^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!

 

  • 大小: 123.5 KB
  • 大小: 4.4 KB
9
11
分享到:
评论

相关推荐

    4Spring自动装配——annotation resource方式

    本文将深入探讨如何通过注解(Annotation)和`@Resource`来实现自动装配,以及其背后的源码实现。 ### 一、注解驱动的自动装配 在Spring 2.5引入了注解支持后,开发者可以使用注解来声明Bean的属性、方法或构造...

    Struts2+Spring2.5+Hibernate3+annotation 整合程序

    例如,`@Controller`、`@Service`、`@Repository` 和 `@Component` 注解用于标记Spring的Bean,`@Transactional` 用于标记事务管理,`@Autowired` 用于自动装配依赖。在Hibernate中,`@Entity`、`@Table`、`@Id`等...

    Spring Annotation简介一

    1. **依赖注入(Dependency Injection, DI)**:Spring Annotation中最常用的注解之一是`@Autowired`,它实现了自动装配bean。当在类的字段或构造器上使用`@Autowired`时,Spring会自动寻找类型匹配的bean并注入。...

    spring源码spring-framework-4.2.5.RELEASE

    4. **@Autowired**:Spring的自动装配注解,用于注入依赖。在`org.springframework.beans.factory.annotation`包中,我们可以找到AutowiredAnnotationBeanPostProcessor,它是处理@Autowired注解的关键。 5. **@...

    struts1.3+spring2.5+hibernate3.3 组合开发 annotation实现

    此外,通过 `@Autowired` 注解,Spring 可以自动装配依赖关系,降低代码间的耦合度。 Hibernate3.3 是一个流行的 Java ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式来操作数据库。在 Hibernate3.3...

    3Spring使用annotation方式autowire

    本篇将详细探讨"3Spring使用annotation方式autowire"这一主题,包括注解驱动的自动装配(Autowiring)以及相关的源码分析。 ### 一、注解驱动的自动装配 自动装配是Spring框架的一个核心特性,它允许框架自动管理...

    Spring - Annotation 自动匹配注入IOC

    在Spring框架中,注解(Annotation)自动匹配注入IoC(Inversion of Control,控制反转)是一种关键特性,它极大地简化了Java应用的配置管理。本文将深入探讨这一主题,帮助开发者更好地理解和利用这一功能。 首先...

    Spring源码

    在Spring中,Bean装配是配置和实例化Bean的过程,可以通过XML配置文件、注解或Java配置类来实现。Bean装配涉及Bean的生命周期管理,包括初始化、销毁方法以及属性的设置。 "04-di-annotation"则关注于依赖注入(DI...

    struts2+spring2+hibernate3 Annotation的整合

    Spring 2引入了大量注解,如`@Autowired`实现自动装配,`@Service`、`@Repository`和`@Controller`定义服务层、数据访问层和控制层组件,`@Transactional`实现事务管理。通过注解,可以实现无XML配置的依赖注入。 ...

    spring2.5源码

    `@Autowired`注解可以自动装配bean,而`@Qualifier`则用于指定多个相同类型的bean中需要哪一个。这种改进使得代码更加简洁,降低了XML配置的复杂性。 2. **注解驱动的开发** 在Spring 2.5中,许多原本需要XML配置...

    学习Spring笔记_Annotation(注解)_Component

    例如,使用`@Autowired`注解可以自动装配bean的依赖,而`@Qualifier`则可以指定特定的bean实例。 4. **注解配置与XML配置的对比**:Spring框架既支持XML配置也支持注解配置。XML配置方式直观,但代码量大,维护困难...

    SpringIOC_SpringMVC_SpringAnnotation_JPA

    例如,@Autowired用于自动装配依赖,@Service、@Repository和@Controller用于标记服务、数据访问和控制器层的类,@RequestMapping用于映射HTTP请求等。注解的使用使得代码更直观,减少了配置文件的复杂性。 JPA...

    spring3.0 项目源码

    例如,@Controller注解标记一个类作为Spring MVC的控制器,而@Autowired注解用于自动装配依赖,无需显式配置XML。 Spring MVC是Spring框架的一部分,主要用于构建Web应用程序。在这个项目中,你可以看到如何使用...

    spring +hibernate +maven 的案例

    Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和装配。依赖注入使得代码更加松耦合,易于测试和维护。此外,Spring的AOP功能允许开发者定义横切关注点,如日志记录、安全性等,而不影响...

Global site tag (gtag.js) - Google Analytics