对象作用域分析 延迟加载 对象生命周期方法
1.可以先添加业务代码
package com.cy.pj.commom.pool;
import org.springframework.stereotype.Component;
/**
* 创建一个对象池,然后将此类型的对象交给spring管理
* @Compoent注解的对象可以交给spring管理,表示这个对象是一个一般组件
* 系统底层会通过反射技术创建Bean实例,并为Bean起一个名字
*
* spting底层通过反射去创建对象的实例
* 反射只是java中的一种高级特性,这组特性只是借助API,获取运行时的类及其类的成员并进行操作
* 最大的的优势个人理解不能预知未来但是可以驾驭未来
* 反射技术的起点是获取Class对象(字节码对象)只要获取了此对象就可以获取此类当中的方法,注解等等。。。。
*
*
*/
@Component//交给spring管理创建bean实例,给bean起一个默认的名字,根据业务决定
//@Lazy//描述对象类型表示延迟对象的创建,何时需要何时创建
public class ObjectPool {
public ObjectPool() {
System.out.println("Heloochuanj");
}
}//早期使用的时new
//此类配置在被加载到内存时,会将类的配置信息储存到Map<String,BeanDfinition>容器中
延迟加载
对于ObjectPool这个类,假如项目启动以后,暂时不会用到这个池对象,因为占用内存,借助Spring框架提供的延迟加载特性进行实现。例如,我们可以在需要延迟加载的类上使用@Lazy注解进行描述
package com.cy;
import com.cy.pj.commom.pool.ObjectPool;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ApplicationTests {
@Autowired
private ObjectPool objectPool;
@Autowired
private ObjectPool objectPool2;
@Test
void contextLoads() {
//true
System.out.println(objectPool == objectPool2);
//因为springboot工程中类型在定义的时候默认会设定作用域 @Scope默认为singleton
//相同名字的bean实例在内存中只能有一份 通常结合@lazy来使用
}
}
如果想要多列实例作用域修改修改@Scope("prototype"),每次从spring框架请求类的实例都会创建新的对象,同时也不用@lazy注解描述
小总结:我们使用了@Scope注解对类进行描述,用于指定类的实例作用域。不写@Scope默认就是单例(singleton)作用域,这个作用域会配合延迟加载(@Lazy)特性使用,表示此类的实例在需要时可以创建一份并且将其存储到spring的容器中(Bean池),需要的时候从池中取,以实现对象的可重用。假如一些对象应用次数非常少,可以考虑不放入池中,进而使用@Scope("prototype")作用域对类进行描述,让此类的对象何时需要何时创建,用完以后,当此对象不可达了,则可以直接被GC系统销毁。单列对象在使用是要注意线程安全(单列对象共享时)如果对象不需要重用和线程安全的可以使用prototype作用域
对象生命周期方法(一般在池中会有这样的方法)
package com.cy.pj.common.pool;
@Scope("singleton")
@Lazy
@Component
public class ObjectPool{
public ObjectPool(){
Systemd.out.println("ObjectPool()")
}
//生命周期方法(并不是每个类中都要写这样的方法)
@PostConstruct //此注解描述的方法为对象生命周期初始化方法,此方法会在构造方法之后执行
public void init(){
System.out.println("init()");
}
@PreDestroy//此注解描述的方法为对象生命周期销毁方法,此方法会在对象销毁之前执行
public void destory(){
System.out.println("destory()");
}
}
c3p0连接池中就会有配置init和close方法
以上内容最核心的问题以及总结