0.問題の背景
Webプログラムでは、通常、Springはすべてのインスタンス(Bean)を管理するために使用され、プログラムでインスタンス化されたBeanを使用するために、通常、次のようなコードが使用されます。
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext-common.xml");
AbcService abcService = (AbcService)appContext.getBean("abcService");
ただし、これには問題がapplicationContext-common.xml
あります。コンテキストBeanをリロードしてインスタンス化するため、一部のスレッド構成クラスもこの構成ファイルに含まれていると、同じ作業を行うスレッドが2回開始されます。1回は、Webコンテナが初期化されたとき、もう1回は、上記のコードで示されているようにインスタンス化されたときです。それはそれを再び初期化するようなものです!!!!これにより、冗長性が生まれます。
1.解決策
クラスがこのインターフェース(ApplicationContextAware)を実装する場合、このクラスはApplicationContext内のすべてのBeanを簡単に取得できます。つまり、このクラスは、 Spring構成ファイル内の参照されているすべてのBeanオブジェクトを直接取得できます。同時に、対応する値が「キー」に従って取得されます。
import lombok.Getter;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public final class SpringUtils implements ApplicationContextAware {
/**
*上下文对象
*/
@Getter
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtils.applicationContext == null) {
SpringUtils.applicationContext = applicationContext;
}
}
public static Object getBean(String name) {
return SpringUtils.applicationContext.getBean(name);
}
public static String getProperty(String key) {
//获取配置文件对象,根据key获取值
return SpringUtils.applicationContext.getEnvironment().getProperty(key);
}
}