SpringBoot原理学习

发布时间 2023-12-31 10:58:33作者: Avava_Ava

一、IoC/DI相关

1. 如何进行依赖注入?

①依赖注入的三种方式

Ⅰ. 属性注入

    /**
     * Field 注入/属性注入
     * */
//    @Resource(name = "mySQLDbServiceImpl")
//
    @Autowired
    @Qualifier(value = "mySQLDbServiceImpl")
    private DbService dbService;

@Autowired、@Resource均支持,使用简单代码简洁,是最常用的一种依赖注入方式;

 

 Ⅱ. setter注入

    /**
     * setter注入
     * */
    private DbService dbService;

//    @Resource(name = "mySQLDbServiceImpl")

    @Autowired
    @Qualifier(value = "mySQLDbServiceImpl")
    public void setDbService(DbService dbService) {
        this.dbService = dbService;
    }

 @Autowired、@Resource均支持,缺点是setter方法可能会被多次调用,注入对象有被修改的风险,很少使用;

 

 Ⅲ. 构造器注入

    /**
     * 构造器注入
     * */
    private final DbService mySQLDbServiceImpl;

    public DbController(DbService mySQLDbServiceImpl) {
        this.mySQLDbServiceImpl = mySQLDbServiceImpl;
    }

@Autowired支持,@Resource不支持,不过实际上不需要@Autowired也可以完成,如上面的代码;

构造器注入方式可以注入final修饰的对象(前两种注入方式都不可以),可以确保注入对象不会被修改,

而且因为构造器方法在类加载阶段就会执行,所以依赖对象在使用前就会被初始化,可以确保需要的依赖不为空;

 

构造器注入是Spring官方推荐的依赖注入方式,配合lombok的@RequiredArgsConstructor使用可以省去手写构造器的步骤,代码也非常简洁;

 (注意:对于有多个实现类的接口,构造器注入是根据属性名来区分的,相当于byName,所以不要乱起属性名)

 

 

 ②@Autowired和@Resourece的区别

Ⅰ. @Autowired来自Spring框架,@Resource来自JDK;

Ⅱ. @Autowired支持属性、setter方法和构造器注入,@Resource只支持属性、setter方法;

Ⅲ. @Autowired默认采用byName的方式查找依赖,@Resource默认采用byType的方式查找依赖;

Ⅳ. 对于有多个实现类的接口的依赖注入,@Autowired可以通过@Qualifier注解的value属性来指定名称,@Resource可以通过其name属性来指定名称;