自动装配:根据指定的策略,在IOC容器中匹配某一个bean,
自动为指定的bean中所依赖的类类型或接口类型属性赋值
准备工作(方法1,手动依赖注入)
根据三层架构进行依赖注入测试,手动测试。
controller控制层
package com.atguigu.spring.controller;
import com.atguigu.spring.service.UserServiceImpl;
public class UserController {
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void saveUser(){
userService.saveUser();
}
}
service层
package com.atguigu.spring.service.impl;
public interface UserService {
// 保存用户信息
void saveUser();
}
service实现类
package com.atguigu.spring.service;
import com.atguigu.spring.dao.UserDao;
import com.atguigu.spring.service.impl.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void saveUser() {
userDao.saveUser();
}
}
dao层
package com.atguigu.spring.dao;
public interface UserDao {
//保存用户信息
void saveUser();
}
dao实现类
package com.atguigu.spring.dao.impl;
import com.atguigu.spring.dao.UserDao;
public class UserDaoImpl implements UserDao {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void saveUser() {
System.out.println("保存成功");
}
}
ApplicationContext.xml文件
<bean id="userController" class="com.atguigu.spring.controller.UserController">
<!-- 而这个成员变量是接口类型的,所以完全把实现类的对象赋值到当前这个接口成员变量中 -->
<property name="userService" ref="userService"></property>
</bean>
<!-- 表示UserServiceImpl实现类的对象 -->
<bean id="userService" class="com.atguigu.spring.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.atguigu.spring.dao.impl.UserDaoImpl"></bean>
测试方法
@Test
public void testAutowire(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserController u = applicationContext.getBean(UserController.class);
u.saveUser();
// 保存成功
}
基于xml的自动装配byName
byType: 根据要赋值的属性的类型,在IOC容器中匹配某个bean,为属性赋值。
用法:
针对类类型的属性和接口类型的属性,字面量类型属性不行。
可以通过bean标签中的autowire属性设置自动装配的策略。
注意:① 若通过类型没有找到任何一个类型匹配的bean,
此时不装配,属性使用默认值。
② 若通过类型找到多个类型匹配的bean,此时会抛出异常
总结:当使用byType实现自动装配时,IOC容器中有且只有一个
类型匹配的bean能够为属性赋值。
ApplicationContext.xml文件
<bean id="userController" class="com.atguigu.spring.controller.UserController" autowire="byType">
<!-- <property name="userService" ref="userService"></property>-->
</bean>
<bean id="userService" class="com.atguigu.spring.service.UserServiceImpl" autowire="byType">
<!-- <property name="userDao" ref="userDao"></property>-->
</bean>
<bean id="userDao" class="com.atguigu.spring.dao.impl.UserDaoImpl"></bean>
基于xml的自动装配byName很少用
将要赋值的属性的属性名作为bean的id在ioc容器中匹配到某个bean,
来为当前属性赋值。
总结:当前类型匹配的bean有多个时,此时可以使用byName实现自动装配。
ApplicationContext.xml文件
<bean id="userController" class="com.atguigu.spring.controller.UserController" autowire="byName">
<!-- <property name="userService" ref="userService"></property>-->
</bean>
<bean id="userService" class="com.atguigu.spring.service.UserServiceImpl" autowire="byName">
<!-- <property name="userDao" ref="userDao"></property>-->
</bean>
<bean id="userDao" class="com.atguigu.spring.dao.impl.UserDaoImpl"></bean>