对象作用域分析 延迟加载 对象生命周期方法

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

以上内容最核心的问题以及总结

springboot 反射怎么判断字段是否是类 springboot反射机制_延迟加载