2026/6/20 13:02:37
网站建设
项目流程
上海市建设市场管理信息平台网站,贵阳网站备案,杭州网站忧化,天津网站优化排名背景
有时我们需要在一些不属于Spring的类中#xff0c;去调用Spring的Service类的方法。
比如#xff0c;在Util类#xff0c;或者main()方法中#xff0c;去调用Service类的方法。
这时#xff0c;可以使用 ApplicationContextAware接口 和 ApplicationContext接口 .
A…背景有时我们需要在一些不属于Spring的类中去调用Spring的Service类的方法。比如在Util类或者main()方法中去调用Service类的方法。这时可以使用 ApplicationContextAware接口 和 ApplicationContext接口 .ApplicationContext 工具类import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; Component public class ApplicationContextUtil implements ApplicationContextAware { private static final Logger LOGGER LoggerFactory.getLogger(ApplicationContextUtil.class); private static ApplicationContext appContext; Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { appContext applicationContext; } public static T T getBean(ClassT clazz) { if (appContext null) { LOGGER.info(appContext is null); return null; } return appContext.getBean(clazz); } }示例比如Service名是 UserServiceImpl 那么初始化如下 UserServiceImpl userService ApplicationContextUtil.getBean(UserServiceImpl.class);ApplicationContextAware接口的源码public interface ApplicationContextAware extends Aware { void setApplicationContext(ApplicationContext var1) throws BeansException; }ApplicationContextAware 接口中只有一个方法 setApplicationContext()我们可以实现 ApplicationContextAware 接口来重写这个方法设置 ApplicationContext 。ApplicationContext接口的源码public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { String getId(); String getApplicationName(); String getDisplayName(); long getStartupDate(); ApplicationContext getParent(); AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException; }ApplicationContext 接口继承了 EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver。BeanFactoryApplicationContext里面这么多个类和接口我们可以用Idea看一下相关的UML图前面的示例代码 applicationContext 使用了 getBean(Class var); 而在ApplicationContext 中是没有getBean这个方法的。通过上面的UML图可以留意到 ApplicationContext 继承 ListableBeanFactory 而 ListableBeanFactory 继承 BeanFactory。BeanFactory类里面就有 getBean这个方法。getBean方法就可以从Spring容器中返回特定名称的Bean对象。也正因如此ApplicationContext才能够实例化Bean。