Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入。
一、通过构造方法注入
先简单了解一下测试项目的结构,用 maven 构建的,四个包:
- entity:存储实体,里面只有一个 User 类
- dao:数据访问,一个接口,两个实现类
- service:服务层,一个接口,一个实现类,实现类依赖于 IUserDao
- test:测试包
在 spring 的配置文件中注册 UserService,将 UserDaoJdbc 通过 constructor-arg 标签注入到 UserService 的某个有参数的构造方法
<!-- 注册 userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
<constructor-arg ref="userDaoJdbc"></constructor-arg>
</bean>
<!-- 注册 jdbc 实现的 dao -->
<bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
如果只有一个有参数的构造方法并且参数类型与注入的 bean 的类型匹配,那就会注入到该构造方法中。
public class UserService implements IUserService {
private IUserDao userDao;
public UserService(IUserDao userDao) {
this.userDao = userDao;
}
public void loginUser() {
userDao.loginUser();
}
}
@Test
public void testDI() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取 bean 对象
UserService userService = ac.getBean(UserService.class, "userService");
// 模拟用户登录
userService.loginUser();
}
测试打印结果:jdbc-登录成功
注:模拟用户登录的 loginUser 方法其实只是打印了一条输出语句,jdbc 实现的类输出的是:jdbc-登录成功,mybatis 实现的类输出的是:mybatis-登录成功。
问题一:如果有多个有参数的构造方法并且每个构造方法的参数列表里面都有要注入的属性,那 userDaoJdbc 会注入到哪里呢?
public class UserService implements IUserService {
private IUserDao userDao;
private User user;
public UserService(IUserDao userDao) {
System.out.println("这是有一个参数的构造方法");
this.userDao = userDao;
}
public UserService