我们在工作的是可能会遇到要将特定的bean 提前加载来满足其他bean对该bean 的依赖,那么该怎么做呢,可以使用@Order 的方法来进行排序加载,可是这种方法有局限性也是常踩的坑,@Order这个注解只能工资相同bean类型的bean加载的顺序
@Order(1)
@Component
class Bean1 implements BeanA{}
@Order(2)
@Component
class Bean2 implements BeanA{}
像是以上代码的这种Bean1是先于Bean2 加载的
但是!!!!!
一下代码就有问题了
@Order(1)
@Component
class Bean1 implements BeanA{}
@Order(2)
@Component
class Bean2 implements BeanB{}
他们两个bean根本就不是同一个类型的做不到加载顺序的排序
我们可以通过实现 BeanFactoryPostProcessor 该接口重写postProcessBeanFactory 方法来进行提前bean的加载
代码:
这是三个Bean
在Bean1中进行重写
package com.lagom.springboottest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
* Author: lagom
* DateTime: 2024/10/14 12:17
**/
@Component
public class Bean1 implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Bean2 bean = beanFactory.getBean(Bean2.class);
System.out.println(bean);
}
}
在Bean1中加载Bean2 也就是说Bean是提前加载的Bean
package com.lagom.springboottest;
import org.springframework.stereotype.Component;
/**
* Author: lagom
* DateTime: 2024/10/14 12:17
**/
@Component
public class Bean2 {
public Bean2(){
System.out.println("Bean2");
}
@Override
public String toString() {
return "Bean2 toString Method";
}
}
然后又写了一个Bean3来让系统加载
package com.lagom.springboottest;
import org.springframework.stereotype.Component;
/**
* Author: lagom
* DateTime: 2024/10/14 12:27
**/
@Component
public class Bean3 {
public Bean3()
{
System.out.println("Bean3");
}
}
按照逻辑应该是先加载Bean2 再加载Bean3 ,启动验证一下
少年辛苦终身事,莫向光阴惰寸功
ok,大家加油