陕西营销型手机网站,ppt怎么制作流程图,做数据分析的网站,wordpress本地 域名情况说明#xff1a; 在一个抽象类中使用PostConstruct注解方法init用于初始化操作。然后每个实现类在初始化时都会调用PostConstruct注解的init方法执行初始化操作。如下代码#xff1a;
public abstract class AbstractClass {/*** 存放各实例.*/public static final Map 在一个抽象类中使用PostConstruct注解方法init用于初始化操作。然后每个实现类在初始化时都会调用PostConstruct注解的init方法执行初始化操作。如下代码
public abstract class AbstractClass {/*** 存放各实例.*/public static final MapInteger, AbstractClass INSTANCES new ConcurrentHashMap();protected abstract void doSomething();/*** 初始化操作.*/PostConstructvoid init() {INSTANCES.put(getCostSoc(), this);}
}Service
public abstract class Class1 extends AbstractClass {protected abstract void doSomething() {// do something}
}Service
public abstract class Class2 extends AbstractClass {protected abstract void doSomething() {// do something}
}遇到问题 本来好好地但是在另外一个环境却发现程序启动时不执行PostConstruct注解的init方法了导致在使用INSTANCES获取实例时获取到的是null。进而导致后面业务走不下去。
原因分析 经过分析最终得出的结论是这个环境不知道怎么配了默认懒加载 而懒加载情况下在程序启动时是不会执行PostConstruct注解的方法的。
解决问题 经过尝试有两种方式可以解决这种问题。 1. 配置Lazy(false)取消懒加载如下
Service
Lazy(false)
public abstract class Class1 extends AbstractClass Service
Lazy(false)
public abstract class Class2 extends AbstractClass2. 在另一个bean BizService中依赖AbstractClass这样在BizService实例化时需要先实例化依赖的bean,进而触发AbstractClass的实例化进而执行PostConstruct注解的方法。如下
Service
public class BizService {AutowiredQualifier(class1)private AbstractClass class1;AutowiredQualifier(class2)private AbstractClass class2;}