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方法