IOC 基于注解的自动装配(@Autowired注解)

  注解的自动装配@Autowired注解

          自动装配就是让应用程序上下文为你找出依赖项的过程。

          说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性!

         Spring自动装配解决了Spring时代项目配置繁琐的问题,简化配置。

     (自动装配是使用spring满足bean依赖的一种方法,spring会在应用上下文中为某个bean寻找其依赖的bean。)

   1 . 自动装配的实现

       ① 前提

          参与自动装配的组件(需要装配别人、被别人装配)全部都必须在IOC容器中。

       ② @Autowired注解

                在成员变量上直接标记@Autowired注解即可,不需要提供setXxx()方法。

                 以后在项目中的正式用法就是这样

 

        [①] 给Controller装配Service

@Controller
public class UserController {
   @Autowired
   private UserService userService;
   public void saveUser(){
       userService.saveUser();
  }
}

      [②] 给Service装配Dao

@Service
public class UserServiceImpl implements UserService {
   @Autowired
private UserDao userDao;

   @Override
   public void saveUser() {
       userDao.saveUser();
  }

     [③] Dao层

@Repository
public class UserDaoImpl implements UserDao {
   @Override
   public void saveUser() {
       System.out.println("保存成功");
  }
}

     [④] XML

<!--  扫描组件  -->
<!-- 通过包来扫描的,包下面所有类进行扫描 -->
   <context:component-scan base-package="com.atguigu.spring"></context:component-scan>

     [⑤测试类]

/**    @Autowired:实现自动装配功能的注解
    *   1. @Autowired注解能够标识的位置
    *   ①标识在成员变量上,此时不需要设置成员变量的set方法
    *   ②标识在set方法上
    *   ③为当前成员变量赋值的有参构造上
    */
 @Test
   public void test(){
       ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
       UserController bean = ioc.getBean(UserController.class);
       bean.saveUser();
       //保存成功

 

  基于注解的自动装配@Autowired原理

 

  • 首先根据所需要的组件类型到 IOC 容器中查找

    • 能够找到唯一的 bean:直接执行装配

    • 如果完全找不到匹配这个类型的 bean:装配失败

    • 和所需类型匹配的 bean 不止一个

      • 没有 @Qualifier 注解:根据 @Autowired 标记位置成员变量的变量名作为 bean 的 id 进行匹配

        • 能够找到:执行装配

        • 找不到:装配失败

      • 使用 @Qualifier 注解:根据 @Qualifier 注解中指定的名称作为 bean 的id进行匹配

        • 能够找到:执行装配

        • 找不到:装配失败

*  2.@Autowired注解的原理
*     ①默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值(大多情况成员变量就是属性)
*     ②如有多个类型匹配的bean,此时会自动转换byName的方法实现自动装配的效果
*       即将要赋值的属性的属性名作为bean的id匹配某个bean属性赋值
*     ③若byType和byName的方式都无法实现自动装配,
*       即ioc容器中有多个类型匹配的bean且这些bean的id和要赋值的属性的属性名都不一致,
*       此时抛异常:NoUniqueBeanDefinitionException
*     ④此时可以在要赋值的属性上,添加一个注解@Qualifier
*       通过该注解的value属性值,指定某个bean的id,将这个bean为属性赋值
*     注意:若IOC容器中没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException
*     @Autowired注解中有一个属性required,默认值为true,要求必须完成自动装配
*     可以将required设置为false,此时能装配则装配,无法装配则使用属性的默认值cc

所以:如何使用ioc,三层架构上加上相对于的注解,如何把当前需要进行赋值的属性自动装配

  
 
posted @ 2022-11-16 17:19  zjw_rp  阅读(77)  评论(0)    收藏  举报