一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring與bean有關的生命周期示例詳解

Spring與bean有關的生命周期示例詳解

2020-07-27 12:55eaglelihh Java教程

這篇文章主要給大家介紹了關于Spring與bean有關的生命周期的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

記得以前的時候,每次提起Spring中的bean相關的生命周期時,內心都無比的恐懼,因為好像有很多,自己又理不清楚:什么beanFactory啊,aware接口啊,beanPostProcessor啊,afterPropertiesSet啊,initMethod啊等等。

今天終于理清這些關系了,并且又新增了對postConstruct和lifecycle的理解。

執行順序

- 首先是 BeanFactoryPostProcessor,它是針對所有bean的definition的,只執行一次

下面是針對每個bean的初始

  • - 實現了一系列aware接口的,比如BeanNameAware,ApplicationContextAware,調用其set方法
  • - 執行BeanPostProcessor的postProcessBeforeInitialization方法
  • - 帶有@PostConstruct注解的方法
  • - 實現InitializingBean接口的afterPropertiesSet方法
  • - 指定的initMethod方法
  • - 執行BeanPostProcessor的postProcessAfterInitialization方法
  • - 實現了SmartLifecycle接口的start方法(實現Lifecycle接口的不會自動調用,需要顯式的調用start方法)

下面是針對每個bean的銷毀

  • - 實現了SmartLifecycle接口的stop方法(實現Lifecycle接口的不會自動調用,需要顯式的調用stop方法)
  • - 帶有@PreDestroy注解的方法
  • - 實現DisposableBean接口的destroy方法
  • - 指定的destroyMethod方法

目前就想到這么多了,其他的麻煩在評論區留言呀~

代碼實例

bean實體類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/**
 * @date: 2020-07-22
 *
 * 一個簡單的枚舉類
 */
public enum BeanType {
  NORMAL, LIFECYCLE, SMART_LIFECYCLE;
}
 
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * @author: lihui
 * @date: 2020-07-22
 * 一個簡單的bean
 */
@Slf4j
public class NormalBean implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
  private BeanType beanType;
 
  public NormalBean() {
    this(BeanType.NORMAL);
  }
 
  public NormalBean(BeanType beanType) {
    this.beanType = beanType;
  }
 
  @PostConstruct
  public void postConstruct() {
    log.info("{}, postConstruct", beanType);
  }
 
  @Override
  public void afterPropertiesSet() throws Exception {
    log.info("{}, afterPropertiesSet", beanType);
  }
 
  public void initMethod() {
    log.info("{}, initMethod", beanType);
  }
 
  @PreDestroy
  public void preDestroy() {
    log.info("{}, preDestroy", beanType);
  }
 
  @Override
  public void destroy() throws Exception {
    log.info("{}, destroy", beanType);
  }
 
  public void destroyMethod() {
    log.info("{}, destroyMethod", beanType);
  }
 
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    log.info("setApplicationContext, applicationContext : {}", applicationContext);
  }
 
  @Override
  public void setBeanName(String name) {
    log.info("setBeanName, bean name : {}", name);
  }
}
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.Lifecycle;
/**
 * @author: lihui
 * @date: 2020-07-22
 * 實現了Lifecycle的一個bean
 */
@Slf4j
public class LifecycleBean extends NormalBean implements Lifecycle {
  private volatile boolean running = false;
 
  public LifecycleBean() {
    super(BeanType.LIFECYCLE);
  }
 
  @Override
  public void start() {
    log.info("start");
    running = true;
  }
 
  @Override
  public void stop() {
    log.info("stop");
    running = false;
  }
 
  @Override
  public boolean isRunning() {
    return running;
  }
}
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.SmartLifecycle;
/**
 * @author: lihui
 * @date: 2020-07-22
 * 實現了SmartLifecycle的一個bean
 */
@Slf4j
public class SmartLifecycleBean extends NormalBean implements SmartLifecycle {
  private volatile boolean running = false;
 
  public SmartLifecycleBean() {
    super(BeanType.SMART_LIFECYCLE);
  }
 
  @Override
  public void start() {
    log.info("start");
    running = true;
  }
 
  @Override
  public void stop() {
    log.info("stop");
    running = false;
  }
 
  @Override
  public boolean isRunning() {
    return running;
  }
}

配置類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
/**
 * @author: lihui
 * @date: 2020-07-25
 */
@Slf4j
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    log.info("postProcessBeanFactory, beanFactory:{}", beanFactory);
  }
}
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * @author: lihui
 * @date: 2020-07-25
 */
@Slf4j
public class MyBeanPostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    log.info("postProcessBeforeInitialization, bean:{}", beanName);
    return bean;
  }
 
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    log.info("postProcessAfterInitialization, bean:{}", beanName);
    return bean;
  }
}
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.SmartLifecycle;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author: lihui
 * @date: 2020-07-22
 */
@Configuration
@Slf4j
public class Config {
 
  @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
  public NormalBean normalBean() {
    return new NormalBean();
  }
 
  @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
  public LifecycleBean lifecycleBean() {
    return new LifecycleBean();
  }
 
  @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
  public SmartLifecycle smartLifecycle() {
    return new SmartLifecycleBean();
  }
 
  @Bean
  public static MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
    return new MyBeanFactoryPostProcessor();
  }
 
  @Bean
  public static MyBeanPostProcessor myBeanPostProcessor() {
    return new MyBeanPostProcessor();
  }
}

Main類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
/**
 * @author: lihui
 * @date: 2020-07-22
 */
@Slf4j
public class Main {
  public static void main(String[] args) throws InterruptedException {
    ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    ctx.registerShutdownHook();
    Thread.sleep(5000);
    log.info("line ----------------------------- line");
    ctx.start();
    ctx.stop();
    log.info("line ----------------------------- line");
  }
}

結果說明

結果正如前面所說的執行順序一致,主要注意的就是Lifecycle接口和SmartLifecycle接口,只有實現了SmartLifecycle接口的bean在初始化時才會被自動調用,而實現了Lifecycle接口的除非顯式調用start和stop方法才會被調用。

總結

到此這篇關于Spring與bean有關的生命周期的文章就介紹到這了,更多相關Spring與bean生命周期內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/eaglelihh/p/13383039.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 果冻传媒天美传媒在线小视频播放 | 午夜AV国产欧美亚洲高清在线 | 把女的下面扒开添视频 | 精品欧美一区二区三区四区 | 白丝校花掀起短裙呻吟小说 | 91精品免费观看老司机 | 国产欧美日韩高清专区ho | 精品日韩欧美一区二区三区 | 近亲乱中文字幕 | 亚洲第一男人网站 | 俄罗斯海滩厕所偷窥 | 久九九精品免费视频 | 青青久在线视频免费观看 | 女子校生下媚药在线观看 | 门房秦大爷在线阅读 | 秋霞一级黄色片 | 亚洲国产高清视频 | 国产好深好硬好爽我还要视频 | 国产福利片在线 易阳 | 亚洲精品一二三四区 | 日本人妖在线 | 热99re久久精品精品免费 | blackedhd 18sex| 草草影院免费 | 亚洲精品一区二区久久这里 | 视频二区 素人 制服 国产 | 国产精品免费观在线 | 亚洲国产精品综合福利专区 | 91麻豆精品 | 亚洲欧美日韩特级毛片 | 国产日韩一区二区 | 美国大片成人性网 | 国产精品久久久久久爽爽爽 | 亚洲欧美日韩久久一区 | 海角社区在线登录 | 日韩精品国产自在欧美 | 欧美四区| 加勒比成人 | 奇米影视7777久久精品 | 精品国产福利在线 | 国产精品自在线拍 |