在开发中总是会遇到很多特殊情况,比如MQTT消息走到回调函数messageArrived的时候,想要将消息内容处理后存储到数据库中,但是这个时候业务的Bean还没有被注入,拿到的Bean是为NULL的,又或者解决循环依赖的问题,两个Bean之间的循环依赖可以使用@Lazy注解进行延迟加载,但是多个Bean呢?A依赖B,B依赖C,C依赖D,D又依赖A,我查到两个较好的方法,一是手动获取Bean,二是使用三级缓存,这里记录一下手动获取Bean的方法。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| /** * @author zllwsy * @Description * @Date 2021/4/16 10:17 * @Created by zllwsy */ @Component public class BeanUtil implements ApplicationContextAware { //Spring上下文 private static ApplicationContext applicationContext; @Override //获取applicationContext,也就是将Spring的ApplicationContext引用赋值给自定义的ApplicationContext public void setApplicationContext(ApplicationContext applicationContextParam) throws BeansException { applicationContext=applicationContextParam; } //通过id获取Bean public static Object getObject(String id) { Object object = null; object = applicationContext.getBean(id); return object; }
public static <T> T getObject(Class<T> tClass) { return applicationContext.getBean(tClass); }
public static Object getBean(String tClass) {a return applicationContext.getBean(tClass); }
public static <T> T getBean(Class<T> tClass) { return applicationContext.getBean(tClass); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext;
public SpringUtil() { }
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; }
}
public static ApplicationContext getApplicationContext() { return applicationContext; }
public static Object getBean(String name) { return getApplicationContext().getBean(name); }
public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); }
public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
|