自动装配概述
前面【Spring】Spring 依赖注入 学会如何使用bean
元素来声明 bean 和通过使用 XML 配置文件中的和元素来注入 。
Spring 容器可以在不使用和 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。
自动装配模式
Spring
提供了5中自动装配的模式
模式 | 描述 |
---|---|
no | 这是默认的设置,它意味着没有自动装配,应该使用显式的bean引用来连线。不用为了连线做特殊的事。 |
byName | 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。 |
byType | 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。 |
constructor | 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生 |
autodetect | Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 |
byName
这种模式由属性名称指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 byName。然后,它尝试将它的属性与配置文件中定义为相同名称的 beans 进行匹配和连接。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。
创建dao
UserDao
接口代码
public interface UserDao {
public void selectUser();
}
UserDaoImpl
实现类代码
public class UserDaoImpl implements UserDao{
@Override
public void selectUser() {
System.out.println("UserDaoImpl -> selectUser");
}
}
创建Service
UserService
接口代码
public interface UserService {
public void selectUser();
}
UserServiceImpl
实现类代码
public class UserServiceImpl implements UserService{
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void selectUser() {
userDao.selectUser();
System.out.println("UserServiceImpl -> selectUser");
}
}
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="userDao" class="com.lucas.dao.UserDaoImpl"/>
<bean id="userService" class="com.lucas.service.UserServiceImpl" autowire="byName">
</bean>
</beans>