【spring】springBoot扩展

扩展顺序图

640.jpg

其余实现扩展

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
140
package com.zjasm.change.config;  

import com.zjasm.change.service.ChangeMainService;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

import java.lang.reflect.Constructor;

@Component
public class MyLoadTestConfig implements ApplicationContextInitializer, BeanDefinitionRegistryPostProcessor, BeanFactoryPostProcessor
, InstantiationAwareBeanPostProcessor, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
, BeanNameAware, InitializingBean, FactoryBean<MyLoadTestConfig.TestFactoryInnerBean>
, SmartInitializingSingleton, CommandLineRunner, DisposableBean {

/*
在容器刷新之前调用此类的initialize方法
*/ @Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("XFFF!=====ApplicationContextInitializer initialize!!!!!!!!");
}

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
System.out.println("XFFF!=====postProcessBeanDefinitionRegistry!!!!!!");
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("XFFF!=====postProcessBeanFactory!!!!!!");
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[TestInstantiationAwareBeanPostProcessor] ===BeforeInitialization========postProcessBeforeInitialization!!!!!!!!!!!" + beanName);
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[TestInstantiationAwareBeanPostProcessor] ===AfterInitialization=== after initialization " + beanName);
return bean;
}

@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("[TestInstantiationAwareBeanPostProcessor] ===BeforeInstantiation=== before instantiation " + beanName);
return null;
}

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println("[TestInstantiationAwareBeanPostProcessor] ===AfterInstantiation=== after instantiation " + beanName);
return true;
}

@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
System.out.println("[TestInstantiationAwareBeanPostProcessor] ===PROPERTY=== postProcessPropertyValues " + beanName);
return pvs;
}

@Override
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("[TestSmartInstantiationAwareBeanPostProcessor] determineCandidateConstructors " + beanName);
return null;
}

@Override
public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
System.out.println("[TestSmartInstantiationAwareBeanPostProcessor] getEarlyBeanReference " + beanName);
return bean;
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// beanFactory.getBean(ApplicationContextInitializer.class).getClass().getSimpleName()
System.out.println("[TestBeanFactoryAware] !!!!!setBeanFactory ");
}

@Override
public void setBeanName(String name) {
System.out.println("[setBeanName] !!!!!BEANNAME====== " + name);
}

@Override
public void afterPropertiesSet() throws Exception {
// 进行系统启动的时候一些业务指标的初始化工作
System.out.println("[afterPropertiesSet] ====== ");
}

@Override
public TestFactoryInnerBean getObject() throws Exception {
// 可定制实例化Bean的逻辑
System.out.println("初始化bean方式=====");
return new TestFactoryInnerBean();
}

@Override
public Class<?> getObjectType() {
return TestFactoryInnerBean.class;
}

@Override
public boolean isSingleton() {
return true;
}

public static class TestFactoryInnerBean{

}
@Override
public void afterSingletonsInstantiated() {
// 所有单例对象初始化完毕后,做一些后置的业务处理
System.out.println("[afterSingletonsInstantiated] !!!ALL BEAN AFTERInitialization@@@@@@@@@@");
}


@Override
public void run(String... args) throws Exception {
// CommandLineRunner 整个项目启动完毕后,自动执行
System.out.println("[CommandLineRunner] @@@@@@@AFTER Application Run");
}

@Override
public void destroy() throws Exception {
// 此对象销毁时触发
System.out.println("[DisposableBean] =====DESTROY=====");
}
}

启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.zjasm.change;  

import com.zjasm.change.config.MyLoadTestConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableAsync
@EnableScheduling
public class ChangeApplication {

public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ChangeApplication.class);
springApplication.addInitializers(new MyLoadTestConfig());
springApplication.run(args);
}

}

@PostConstruct

在某个bean的初始化阶段,如果某个方法标注了这个注解,会先执行该方法。可用于初始化某一属性
触发点是在postProcessBeforeInitialization之后,InitializingBean.afterPropertiesSet之前。