有两种方法:
- 创建Component实现ApplicationContextAware接口,SpringBoot会自动调用这个类的setApplicationConext()方法。鼓励使用这种方式。
SpringApplication.run(MyApplication.class, args)
这句话的返回值就是一个ConfigurableApplicationContext
对象,直接用静态变量把这个对象保存下来就可以了。
需要注意的是,SpringBoot只会扫描MyApplication.java所在包及其子包下的Component注解、Controller注解等。为了避免不必要的麻烦,一定要遵循“约定大于配置”原则,把MyApplication.java放在根包下。
使用ApplicationContextAware的方式代码如下:
@Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; // 非@import显式注入,@Component是必须的,且该类必须与main同包或子包 // 若非同包或子包,则需手动import 注入,有没有@Component都一样 // 可复制到Test同包测试 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringUtil.applicationContext == null){ SpringUtil.applicationContext = applicationContext; } System.out.println("---------------com.ilex.jiutou.util.Test.Main.SubPackage.SpringUtil---------------"); } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public staticT getBean(Class clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static T getBean(String name,Class clazz){ return getApplicationContext().getBean(name, clazz); } }