@Autowired的Bean匹配机制是指在执行依赖注入之前,Spring容器会根据被注入字段、方法参数的类型来查找匹配的 Bean。
该机制的执行顺序为:
1、先根据类型匹配
若没有匹配类型,则注入失败
有匹配类型,对应的实例有1个,则注入
2、如果匹配类型的实例有多个,则查看优先级注解:
查看是否有@Qualifier注解,分辨是那个实现类(推荐用这个)
查看是否有@Primary注解,优先级第一
3、如果类型匹配的实例有多个,且无法选出唯一的,则转为根据Bean的名称匹配,如果@service()括号内有自己改的名字,以这个为主,如果名称匹配成功就注入,反之注入失败
实例测试:
首先写个接口:
public interface UserService {
/**
* 保存用户
*/
void save(User user);
}
编写实现类:
@Service
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
System.out.println("保存用户:" + user);
}
}
@Service
public class UserServiceTemp implements UserService {
@Override
public void save(User user) {
System.out.println("临时保存用户:" + user);
}
}
编写controller层:
@Controller
public class UserController {
@Autowired
@Qualifier("userServiceTemp") //参数是对象的实例名
//当有两个以上的实现类的时候,这个注解可以分辨是那个实例
private UserService userService;
/**
* 保存用户
*
* @param user
*/
public void save(User user) {
userService.save(user);
}
}
修改容器,管理类:
/**
* 创建Spring的配置类
* 代表Spring Ioc容器
*/
@Configuration //声明这是Spring Ioc容器
//@ComponentScan("cn.highedu.entity") //声明到哪里去找具有@Component注解的类
//到cn.highedu包以及子包找相关注解(@Component、@controller、@service、@repository)
@ComponentScan("cn.highedu")
public class ContextConfig {
}
编写测试类:
public class DITest {
private ApplicationContext context;
@BeforeEach
public void createContext() {
context = new AnnotationConfigApplicationContext(ContextConfig.class);
}
/**
* @Autowried依赖注入匹配机制
*/
@Test
public void test1(){
User user = new User(1,"张三","三");
UserController userController =
(UserController) context.getBean("userController");
userController.save(user);
}
}
测试结果:
临时保存用户:User{id=1, username='张三', password='三'}
1 条评论
看的我热血沸腾啊www.jiwenlaw.com