首页 > 代码库 > Spring学习总结三——SpringIOC容器三

Spring学习总结三——SpringIOC容器三

一:spring容器自动装配注入

为了减少xml中配置内容,可以使用自动装配注入,代替setter注入,只需要在

bean对象配置中添加属性autoWire即可,那么在类中就会自动扫描setXXX(),实现自动装配注入。

autowire的装配方式分为以下几种:

技术分享

示例如下:

1:创建UserService类

 1 /**
 2  * 
 3  */
 4 package com.hlcui.service;
 5 
 6 import com.hlcui.dao.impl.OracleUserDAO;
 7 import com.hlcui.dto.User;
 8 
 9 /**
10  * @author Administrator
11  * 
12  */
13 public class UserService {
14 
15     private OracleUserDAO dao;
16 
17     public User login(String username, String pwd) {
18         try {
19             User user = dao.findByName(username);
20             if (pwd != null && pwd.equals(user.getPwd())) {
21                 return user;
22             }
23         } catch (Exception e) {
24             e.printStackTrace();
25         }
26         return null;
27 
28     }
29 
30     public OracleUserDAO getDao() {
31         return dao;
32     }
33 
34     public void setDao(OracleUserDAO dao) {
35         this.dao = dao;
36     }
37 
38 }

2:在applicationContext.xml配置文件配置bean

 

第一种情况:

通过类型注入byType,那么在UserService类中查找setXXX(A a)方法,然后在spring容器中找A类型对象注入

1 <!-- 配置userService对象 -->
2     <bean id="userService" class="com.hlcui.service.UserService"
3         autowire="byType"></bean>

编写测试方法并运行:

1 @Test
2     /**测试spring自动装配注入*/
3     public void testAutoWire() {
4         ApplicationContext ac = getApplicationContext();
5         UserService us = ac.getBean("userService", UserService.class);
6         User user = us.login("Tom", "123");
7         System.out.println(user);
8     }

技术分享

通过结果可以看出登录成功,说明OracleUserDAO对象成功的通过类型装配注入到了UserService对象中。

 

第二种情况:

默认情况下就是autowire="no",的情况,就是禁止自动装配,将autowire属性删除

1 <!-- 配置userService对象 -->
2     <bean id="userService" class="com.hlcui.service.UserService"></bean>

运行测试方法:

技术分享

报空指针异常,而且是在login()方法中,dao调用findByName(),所以说明dao这个对象没有注入进来。

 

第三种情况:

通过byName名称注入,UserService类中setXXX(A a)方法,在spring容器配置文件找与匹配的bean名称,然后将对象注入。

修改配置文件:

<!-- 配置userService对象 -->
    <bean id="userService" class="com.hlcui.service.UserService"
    autowire="byName"></bean>

因为UserDao对象bean的id为userDao

<!-- 配置userDao对象 -->
    <bean id="userDao" class="com.hlcui.dao.impl.OracleUserDAO">
        <constructor-arg index="0" ref="jdbcDatasource" />
    </bean>

所以UserSerivce类中的属性名字也应该修改为userDao

修改后如下:

 1 /**
 2  * 
 3  */
 4 package com.hlcui.service;
 5 
 6 import com.hlcui.dao.impl.OracleUserDAO;
 7 import com.hlcui.dto.User;
 8 
 9 /**
10  * @author Administrator
11  * 
12  */
13 public class UserService {
14 
15     private OracleUserDAO userDao;
16 
17     public User login(String username, String pwd) {
18         try {
19             User user = userDao.findByName(username);
20             if (pwd != null && pwd.equals(user.getPwd())) {
21                 return user;
22             }
23         } catch (Exception e) {
24             e.printStackTrace();
25         }
26         return null;
27         
28     }
29 
30     public OracleUserDAO getUserDao() {
31         return userDao;
32     }
33 
34     public void setUserDao(OracleUserDAO userDao) {
35         this.userDao = userDao;
36     }
37 
38     
39 }

运行测试方法:

技术分享

说明UserDao对象成功注入!

 

二:对spring容器以及三种注入方式做个小结

1:注入方式

setter注入方式:对应的类中必须有setXXX(A a)方法,然后在配置文件bean元素添加property的子元素。

构造器注入:对应的类中必须有有参数构造方法,然后在配置文件bean元素中添加constructor-arg元素,如果有多个

参数,可以写多个并列子元素。

自动装配注入:类中必须有setXXX(A a)方法,然后配置文件bean元素添加属性autowire,可以按照类型或者名称进行

注入。

Spring学习总结三——SpringIOC容器三