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下载)。

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

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页