Spring框架劣势
大家都晓得应用spring框架能够由其治理对象(Bean),实现其管制反转的特点,这一大特点会为咱们带来一下劣势:
解耦
首先第一点劣势就是解耦!
通过spring框架底层通过反射来创建对象而不是通过咱们本人来new对象,很大水平上就曾经升高了代码的耦合度.
耦合度就是对象之间的依赖关系,对象之间的依赖水平越高,保护老本也就越高,所以通过spring框架来治理对象而升高耦合度对咱们的我的项目来说是很有好处的.
提早加载
第二点劣势就是提早加载!
由spring治理对象,能够通过@Lazy注解标记,来使得对象的创立达到提早加载的成果,只有在应用时才会突破提早.
@Lazy能够用于形容类/办法
底层是通过value属性的true/false值,来示意是否提早.
默认value属性为true,示意要提早构建以及提早初始化-->@Lazy(true)
如果写false,和没写该注解雷同,示意不反对提早-->@Lazy(false)
利用场景:
大对象(例如池对象),稀少用(容器初始化创建对象也用不到)
通常配合单例作用域应用
指定作用域
第三点劣势就是能够指定作用域!
由spring治理对象,能够通过@Scope注解标记,指定类实例的作用域.
@Scope(" ")-" "中能够填入两个值:
singleton:单例作用域,类的实例在一个JVM内存中只有一份,spring负责创立负责销毁,还会存储到bean池中(默认)
prototype:多利作用域,类的实例何时须要何时创立,spring负责创立不负责销毁
个别可重用的对象设为单例;
个别不可重用对象或仅应用一次就不再应用对象设为多例.
形容生命周期
第四点劣势就是能够形容生命周期!
由spring治理对象,能够通过@PostConstruct/@PreDestroy注解标记,来形容生命周期的初始化/销毁办法.
@PostConstruct此注解形容的办法为生命周期初始化办法,此办法会在对象构造方法之后执行,在这样的办法中个别会为创立好的对象再次进行一些初始化.
@PreDestroy此注解形容的办法为生命周期销毁办法,此办法会在对象销毁之前执行,在这样的办法中能够实现一些资源销毁操作.
实例如下:
@Scope//@Scope("prototype")@Lazy@Component//将类交给spring治理public class ObjectPool { public int size; public ObjectPool() { System.out.println("ObjectPool()"); } @PostConstruct public void init() { System.out.println("init()"); } @PreDestroy public void destiry() { System.out.println("destiry()"); }}
@SpringBootTestpublic class ObjectPoolTests { @Autowired private ObjectPool objectPool1; @Autowired private ObjectPool objectPool2; @Test void testObjectPool() { System.out.println("objectPool1="+objectPool1); System.out.println(objectPool1==objectPool2);//比拟对象地址 objectPool1.size=10; System.out.println(objectPool2.size); }}
以上代码理论运行后,能够察看其办法打印程序,以及对象地址值的比拟,继而验证上述注解的作用.
@Autowired依赖注入
从下面代码块中的实例里能够看到在测试类中是通过@Autowired注解标记的形式将对象作为属性注入到另一个类中的.这也是应用spring框架时罕用到的一个形式.
@Autowired
@Autowired形容属性或办法时,零碎底层会先依据形容属性或办法参数的类型去spring容器中进行查找:
当有且只有一个雷同类型的对象时,会间接注入;
但若检测到多个类型都满足注入要求,还会依据@Autowired形容的属性或办法参数名查找是否有名字匹配的对象,若有会间接注入,没有则会抛出异样.
@Qualifier
如果咱们有明确的要求,心愿@Autowired注入的类型/名称都是指定类型/名字的对象,能够通过@Qualifier注解对其属性或参数进行形容.
@Qualifier注解必须配合@Autowired注解应用!
实例如下
@SpringBootTestpublic class CacheTests { //形容属性 @Autowired @Qualifier("weakCache") private Cache cache; @Test void testCache() { System.out.println("cache="+cache); }}
@Componentpublic class SearchService { private Cache cache; //形容办法 @Autowired public SearchService( @Qualifier("softCache") Cache cache) { this.cache=cache; System.out.println("SearchService.this.cache="+this.cache); }}