ApplicationContext
ApplicationContext是什么?
ApplicationContext是一個大哥,手下有很多小弟,自己基本上不實作功能,干活的都是小弟,- 具體從下面的代碼可以看出
ApplicationContext繼承了Environment、MessageSource、Resource…也就擁有了他們的功能
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
- 那么如何來獲取
ApplicationContext呢?
方式一 ApplicationContextInitializer
- 通過實作
ApplicationContextInitializer介面來引入ApplicationContext - 直接上代碼
public class SpringBeanUtil1 implements ApplicationContextInitializer {
private static ApplicationContext applicationContext;
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
if (null == applicationContext) {
applicationContext = configurableApplicationContext;
}
}
/**
* @param clazz
* @param <T>
* @return 獲取bean
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}
// 在Application類中啟動方式如下
@SpringBootApplication
public class SpringUtilApplication {
public static void main(String[] args) {
// 方式1,通過ApplicationContextInitializer
// 也可以通過spring.factories來加載 org.springframework.context.ApplicationContextInitializer=xxx 初始化的
SpringApplication springApplication = new SpringApplication(SpringUtilApplication.class);
springApplication.addInitializers(new SpringBeanUtil1());
springApplication.run(args);
ServiceDemo bean = SpringBeanUtil1.getBean(ServiceDemo.class);
System.out.println(bean.toString());
}
}
方式二 ApplicationListener
- 通過背景關系初始化的時候會處理監聽介面
- 直接上代碼
@Component
public class SpringBeanUtil2 implements ApplicationListener<ApplicationContextEvent> {
private static ApplicationContext applicationContext;
/**
* @param clazz
* @param <T>
* @return 獲取bean
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
/**
* 監聽重繪事件
* @param event
*/
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
if (null == applicationContext) {
applicationContext = event.getApplicationContext();
}
}
}
// 啟動類
@SpringBootApplication
public class SpringUtilApplication {
public static void main(String[] args) {
// 方式2,通過ApplicationListener
SpringApplication.run(SpringUtilApplication.class);
ServiceDemo bean = SpringBeanUtil2.getBean(ServiceDemo.class);
System.out.println(bean.toString());
}
}
方式三 ApplicationContextAware
- 通過Spring的通知介面來注入背景關系配置
- 直接上代碼
@Component
public class SpringBeanUtil3 implements ApplicationContextAware {
private static ApplicationContext context;
/**
* @param clazz
* @param <T>
* @return 獲取bean
*/
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (null == context) {
context = applicationContext;
}
}
}
// 啟動類配置
@SpringBootApplication
public class SpringUtilApplication {
public static void main(String[] args) {
// 方式3,通過ApplicationContextAware來獲取
SpringApplication.run(SpringUtilApplication.class);
ServiceDemo bean = SpringBeanUtil3.getBean(ServiceDemo.class);
System.out.println(bean.toString());
}
}
方式四 SpringApplication
- SpringBoot啟動Application的時候可以獲取到
ApplicationContext,這個時候可以把ApplicationContext注入到SpringBeanUtil中去 - 直接上代碼
@Component
public class SpringBeanUtil4 {
private static ApplicationContext context;
/**
* @param clazz
* @param <T>
* @return 獲取bean
*/
public static <T> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (null == context) {
context = applicationContext;
}
}
}
// main方法
@SpringBootApplication
public class SpringUtilApplication {
public static void main(String[] args) {
// 直接通過main方法設定值
ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringUtilApplication.class);
SpringBeanUtil4.setApplicationContext(applicationContext);
ServiceDemo bean = SpringBeanUtil4.getBean(ServiceDemo.class);
System.out.println(bean.toString());
}
}
總結
- 以上就是獲取
ApplicationContext的四種方式,可以通過上面的任意一種方式來實作自己的SpringBeanUtil類,方便獲取Bean實體,同時也可以在自己的類中通過@Autowired的方式直接引入ApplicationContext,
大家也可以關注spring-cloud系列
1-openfeign
2-hystrix
你們的點贊和關注是我創作的最大動力,有什么不足和錯誤的地方歡迎留言!可以微信搜索關注【小二說碼】
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261714.html
標籤:java
下一篇:連續兩次遞回程序詳解
