第二个实验 [重要]自动装配
1、设定情景
- SoldierController需要SoldierService
- SoldierService需要SoldierDao
同时在各个组件中声明要调用的方法。
①在SoldierController中声明方法
package com.atguigu.ioc.component;
import org.springframework.stereotype.Controller;
@Controller(value = “tianDog”)
public class SoldierController {
private SoldierService soldierService;
public void getMessage() {<br /> soldierService.getMessage();<br /> }
}
②在SoldierService中声明方法
@Service(“smallDog”)
public class SoldierService {
private SoldierDao soldierDao;
public void getMessage() {<br /> soldierDao.getMessage();<br /> }<br />}
③在SoldierDao中声明方法
@Repository
public class SoldierDao {
public void getMessage() {<br /> System.out.println("I am a soldier");<br /> }
}
2、自动装配的实现
①前提
参与自动装配的组件(需要装配别人、被别人装配)全部都必须在IOC容器中。
②@Autowired注解
在成员变量上直接标记@Autowired注解即可,不需要提供setXxx()方法。以后我们在项目中的正式用法就是这样。
[1]给Controller装配Service
@Controller(value = “tianDog”)
public class SoldierController {
@Autowired<br /> private SoldierService soldierService;
public void getMessage() {<br /> soldierService.getMessage();<br /> }
}
[2]给Service装配Dao
@Service(“smallDog”)
public class SoldierService {
@Autowired<br /> private SoldierDao soldierDao;
public void getMessage() {<br /> soldierDao.getMessage();<br /> }<br />}
3、@Autowired注解其他细节
①标记在其他位置
[1]构造器
@Controller(value = “tianDog”)
public class SoldierController {
private SoldierService soldierService;
@Autowired<br /> public SoldierController(SoldierService soldierService) {<br /> this.soldierService = soldierService;<br /> }<br /> ……
[2]setXxx()方法
@Controller(value = “tianDog”)
public class SoldierController {
private SoldierService soldierService;
@Autowired<br /> public void setSoldierService(SoldierService soldierService) {<br /> this.soldierService = soldierService;<br /> }<br /> ……
②@Autowired工作流程
- 首先根据所需要的组件类型到IOC容器中查找
- 能够找到唯一的bean:直接执行装配
- 如果完全找不到匹配这个类型的bean:装配失败
- 和所需类型匹配的bean不止一个
- 没有@Qualifier注解:根据@Autowired标记位置成员变量的变量名作为bean的id进行匹配
- 能够找到:执行装配
- 找不到:装配失败
- 使用@Qualifier注解:根据@Qualifier注解中指定的名称作为bean的id进行匹配
- 能够找到:执行装配
- 找不到:装配失败
- 没有@Qualifier注解:根据@Autowired标记位置成员变量的变量名作为bean的id进行匹配
@Controller(value = “tianDog”)
public class SoldierController {
@Autowired<br /> @Qualifier(value = "maomiService222")<br /> // 根据面向接口编程思想,使用接口类型引入Service组件<br /> private ISoldierService soldierService;
③佛系装配
给@Autowired注解设置required = false属性表示:能装就装,装不上就不装。但是实际开发时,基本上所有需要装配组件的地方都是必须装配的,用不上这个属性。
@Controller(value = “tianDog”)
public class SoldierController {
// 给@Autowired注解设置required = false属性表示:能装就装,装不上就不装<br /> @Autowired(required = false)<br /> private ISoldierService soldierService;