@Service
public class A {
@Autowired
private B b;
public A() {
System.out.println("A construct");
}
@PostConstruct
public void init() {
initA();
}
private void initA() {
System.out.println("A init");
}
}
@Service
public class B {
@Autowired
private A a;
public B() {
System.out.println("B construct");
}
@PostConstruct
public void init() {
initB();
}
private void initB(){
System.out.println("B init");
}
}
@Service
public class A {
private static volatile boolean initialized;
@Autowired
private B b;
public A() {
System.out.println("A construct");
}
@PostConstruct
public void init() {
initA();
}
public boolean isInitialized() {
return initialized;
}
public void initA() {
if (!isInitialized()) {
System.out.println("A init");
}
initialized = true;
}
}
@Service
public class B {
@Autowired
private A a;
public B() {
System.out.println("B construct");
}
@PostConstruct
public void init() {
initB();
}
private void initB() {
if (!a.isInitialized()) {
a.initA();
}
System.out.println("B init");
}
// 代码位置:AbstractAutowireCapableBeanFactory.doCreateBean
// 填充 bean 的各个属性,包括依赖注入
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
// 调用初始化方法,如果是 InitializingBean 则先调用 afterPropertiesSet 然后调用自定义的init-method 方法
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
// 代码位置:AbstractBeanFactory.doGetBean
// Guarantee initialization of beans that the current bean depends on. 实例化依赖的 bean
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException(mbd.getResourceDescription(),
beanName, "Circular depends-on relationship between '"
+ beanName + "' and '" + dep + "'");
}
registerDependentBean(dep, beanName); // 缓存 bean 依赖的关系
getBean(dep);
}
}
@Component
public class ABeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
A.initA();
}
}
// 代码位置:AbstractApplicationEventMulticaster.ListenerRetriever.getApplicationListeners()
public Collection<ApplicationListener<?>> getApplicationListeners() {
LinkedList<ApplicationListener<?>> allListeners = new LinkedList<ApplicationListener<?>>();
for (ApplicationListener<?> listener : this.applicationListeners) {
allListeners.add(listener);
}
if (!this.applicationListenerBeans.isEmpty()) {
BeanFactory beanFactory = getBeanFactory();
for (String listenerBeanName : this.applicationListenerBeans) {
try {
ApplicationListener<?> listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
if (this.preFiltered || !allListeners.contains(listener)) {
allListeners.add(listener);
}
} catch (NoSuchBeanDefinitionException ex) {
// Singleton listener instance (without backing bean definition) disappeared -
// probably in the middle of the destruction phase
}
}
}
AnnotationAwareOrderComparator.sort(allListeners); // 排序
return allListeners;
}
@Component
public class ApplicationListenerA implements ApplicationListener<ApplicationContextEvent>, Ordered {
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
initA();
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE; // 比 ApplicationListenerB 优先级高
}
public static void initA() {
System.out.println("A init");
}
}
@Component
public class ApplicationListenerB implements ApplicationListener<ApplicationContextEvent>, Ordered{
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
initB();
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE -1;
}
private void initB() {
System.out.println("B init");
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有