spring-ioc的容器,和Bean的生命周期

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
销毁

总结:SpringBean生命周期
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值