一: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,可以按照类型或者名称进行
注入。