init调用
init和destroy对应,一个加载一个销毁
有时候有一种场景是:初始化一个对象(bean)后立即初始化(加载一些数据)
配置类
@Configuration
@ComponentScan("springTest2")
public class ConfigTest {
@Bean(initMethod = "init", destroyMethod = "destroy")
Test1 test1() {
return new Test1();
}
}
//调用
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigTest.class);
System.out.println("#################################");
context.close();
//@Configguration注解是告诉spring这个类是一个配置类
//@ComponentScan则是指定需要spring来扫描的包,相当于xml中的context:component-scan属性
//@Bean后边的initMethod和destroyMethod就是在声明这是一个baen的同时指定了init和destroy方法,方法名从功能实现上来说可以随意。
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="test2" class="com.luoyu.initTest.Test2">
</bean>
<bean id="initOrDestroyTest" class="com.luoyu.initTest.Test1" init-method="init" destroy-method="destroy">
</bean>
</beans>
// 调用
ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");
System.out.println("#################################");
context1.close();
总结:
使用配置文件xml的方式,可以理解为加载文件中每一个bean对象对应的构造函数,如果有对应的方法,如:init-method,那么也会进行执行
整理自【涂宗勋】:
init和clinit的区别
java在编译后会在字节码文件中生成<init>方法,称为实例构造器:变量初始化/语句块/构造函数
java在编译后会在字节码文件中生成<clinit>方法,称为类构造器:静态变量初始化/静态块
<clinit>方法是在类加载过程中执行的,而<init>是在对象实例化执行的,所以<clinit>一定比<init>先执行
整理自【Zackpard】: