SpringBoot项目中的依赖注入过程分析

2 篇文章 0 订阅
1 篇文章 0 订阅

1.可以根据API设计图进行编码和分析

 具体代码以及注解如下

2.1定义一个接口

package com.cy.pj.common.cache;


public interface Cache {
}

2.2把实现类交给spring管理

package com.cy.pj.common.cache;

import org.springframework.stereotype.Component;

@Component
public class SoftCache implements Cache {

}
package com.cy.pj.common.cache;

import org.springframework.stereotype.Component;

@Component
public class WeakCache implements Cache {
}

2.3再创建一个测试类进行测试 

package com.cy.pj.commom.cache;

import com.cy.pj.common.cache.Cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class CacheTest {

    //  @Qualifier("softCache") spring会去查找此类型对应的对象由于有两个需要指定
    //假如只有一个则直接注入 属性类型对应的对象有多个,则基于属性名进行查找 否则注入失败
    //或者为bean取名字 @Component("xxxx") 不取名字则为首字母小写
    //@Qualifier必须搭配@Autowired注解一起使用
    //底层使用反射技术进行赋值
    @Autowired
    @Qualifier("softCache")
    private Cache cache;//DL(依赖查找)---》DI(依赖注入)

//    @Autowired
//    private WeakCache weakCache;

    @Test
    void eat(){
        System.out.println(cache);
    }

//    @Test
//    void eat2(){
//        System.out.println(weakCache);
//        //System.out.println(softCache);
//    }




}

总结:就是测试类代码注解里这里列出来

@Autowired由spring框架定义,用于描述类中属性或相关方法(例如构造方法)。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。这部分总结在思否上看到的比我自己语言更好

下面代码就是自己赋值利用@Autowired描述类中属性或相关方法(例如构造方法)进行set和构造方法赋值

代码设计 CacheServiceTest ------CacheService  ---------Cache(interface)  ----------implements SoftCache WeakCache (画图太麻烦了谅解)

构造方法注入如下

package com.cy.pj.common.service;

import com.cy.pj.common.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class CacheService {

    private Cache cache;

    @Autowired//可以描述构造方法,有一个构造方法则可以省略因为构造方法需要传实参            
    public void  CacheService(@Qualifier("softCache") Cache cache){ //此处依然是查找是否有名字匹配的对象由于有多个需要指定
        this.cache=cache;

    }

set方法注入

package com.cy.pj.common.service;

import com.cy.pj.common.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class CacheService {

    private Cache cache;

//    @Autowired//可以描述构造方法
//    public void  CacheService(@Qualifier("softCache") Cache cache){ //此处依然是查找是否有名字匹配的对象由于有多个需要指定
//        this.cache=cache;
//
//    }

    @Autowired
    public void setCache(@Qualifier("softCache") Cache cache){
        this.cache=cache;
    }
//此处不用写get方法
    public Cache getCache(){
        return cache;
    }
}

不管set还是构造方法不用我们自己调用,set和构造方法其实也是靠反射进行调用的

总结

1在我们实际的项目当中不会将所有业务都写到一个对象中 每个对象都有自己的职责

2实际项目当中对象会通过协同方式完成一个,这种协同需要对象之间中存在依赖

3当对象存在依赖时(这种现象也就是耦合)我们应该降低耦合需要耦合与抽象而不是特定的一个类 同时需要耦合与工厂因为工厂是帮助我们创建对象 工厂就是BeanFactory

4当对象存在耦合关系时 值的注入最好是由对象管理方完成对象注入列如spring

5Spring中为对象类型属性赋值推荐使用自动依赖注入 列如由spring来扫描属性扫描对应的方法其底层技术用到反射

6Spring中为对象类型属性赋值注入策略是(直接为属性赋值,构造方法赋值,set方法赋值)

7把对象交给Spring管理的原因是:程序中对象的运行有一个目标第一解决业务问题,第二要高效低耗的优化业务的执行为了达成这样的目标 我们需要充分分析业务将业务分析成API  在Spring框架中不会帮我们解决业务问题,但可以从对象运行时的性能方面给予一定的设计和帮助。列如Spring为我们的对象赋予了很多个更加科学的特性,列如延迟加载作用域,生命周期方法以及运行时的自动依赖注入(降低耦合,提高程序的可维护性)

8Spring框架中通过反射的方式帮我们创建Bean对象 获取类的字节码对象Class类型加载到内存时就可以获取 第二步获取类中的构造方法对象Constructor类型,基于此类型的对象创建对应类的实例 Constructor是反射包中的类 底层则是用newInstance方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值