1.spring-ioc容器启动的三种方式
/**
* context:以注解的方式启动@Configuration
* context1:资源路径下以xml配置文件启动
* context2:系统路径下以xml配置文件启动
*/
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StartConfig.class);
ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("StartConfig.xml");
FileSystemXmlApplicationContext context2 = new FileSystemXmlApplicationContext("src/main/java/com/start/StartConfig.xml");
得到的context就是常说的:springioc容器 在org.springframework.beans.factory.support包下面的类DefaultListableBeanFactory
2.springBean的生命周期
易混淆名词:
BeanFactory (Bean工厂:管理bean的工厂)
FactoryBean (是个接口,通过getObject()方法可以对bean进一步操作;为Bean提供了更加灵活的方式)
Bean (指的就是springBean)
SpringBean (一个实体类交给spring管理经过实例化(new得到对象)--初始化(包括初始化前后一系列处理器)得到的实例对象)
生命周期:可以大致分为三阶段:实例化--初始化--销毁(只有单例才会经历销毁)
1.实例化:
交给spring管理的类(@Component)会默认调用构造方法为其初始化
@Component
public class Blue {
public Blue(){};
}
2.初始化:一般用于向框架注入数据源等。需要在销毁前关闭。
3.销毁:关闭特定资源
---------核心-------------
初始化和销毁一般成对存在,它们有三种实现方案:
方案一:@Bean
配置类通过@Bean指定initMethod;
/**
配置类
**/
@Configuration
@ComponentScan("com.entity")
public class StartConfig {
@Bean(initMethod = "initTest",destroyMethod = "destoryTest")
public Yello yello(){
return new Yello();
}
}
/**实体类**/
public class Yello {
public void initTest(){
}
public void destoryTest(){
}
}
方案二:在实体类中通过注解的形式@PostConstruct,@PreDestroy
/**
* description:
*@Component:交给spring管理
* @PostConstruct:实例化之后会调用被这个注解标注的方法
* @PreDestroy:销毁之前会调用被这个注解标注的方法
*/
@Component
public class Yello {
@PostConstruct
public void initTest(){
}
@PreDestroy
public void destoryTest(){
}
}
方案三:实现spring提供的接口InitializingBean,DisposableBean
@Component
public class Yello implements InitializingBean, DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("销毁");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
既然三种方法都能实现初始化和销毁,那么这三种方法的执行顺序是怎么样的呢?
/**
定义一个实体类Yello,定义三个初始化和销毁方法
**/
public class Yello implements InitializingBean, DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("销毁");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
@PostConstruct
public void initTest2(){
System.out.println("初始化2");
}
@PreDestroy
public void destoryTest2(){
System.out.println("销毁2");
}
@PostConstruct
public void initTest3(){
System.out.println("初始化3");
}
@PreDestroy
public void destoryTest3(){
System.out.println("销毁3");
}
}
定义启动配置类
/**
**/
@Configuration
@ComponentScan("com.entity")
public class StartConfig {
@Bean(initMethod = "initTest3",destroyMethod = "destoryTest3")
public Yello yello(){
return new Yello();
}
}
通过启动配置类初始化springioc容器
public class MyStart {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StartConfig.class);
context.close();
}
}
得到结果:
初始化3
初始化2
初始化
16:46:56.684 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@10dba097, started on Sat Oct 26 16:46:56 CST 2019
销毁3
销毁2
销毁