@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='三'}
最后修改:2023 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏