今天在项目中需要根据不同客户定制不同的代码逻辑,于是我在Enum中定义客户代码和执行的bean,查阅资料了解到获取Bean和判断Bean是否存在的方式如下:
// 获取bean
applicationContext.getBean(beanClass);
//判断bean
applicationContext.containsBean(beanClass);
但是我不想在代码中加一堆注解,例如下面的代码:
@Autowired
private ApplicationContext applicationContext;
于是封装一个bean的工具类:
/**
* @author gaojiufeng
* @Description
* @date 2023-09-12
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 判断bean是否存在
*
* @param name-bean名称
* @return 返回bean实体
*/
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
}
ApplicationContextAware是一个接口,它可以用于在Spring Boot应用程序中获取并使用ApplicationContext对象。当一个类实现了ApplicationContextAware接口并实现了对应的方法时,Spring容器会自动将当前应用程序的ApplicationContext对象注入到该类中。
具体而言,ApplicationContextAware接口定义了一个方法:
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
当Spring容器实例化一个实现了ApplicationContextAware接口的bean时,会调用该bean的setApplicationContext()方法,并将ApplicationContext对象作为参数传递进去。
通过实现ApplicationContextAware接口并重写setApplicationContext()方法,我们可以在Spring容器初始化bean时获得应用程序的ApplicationContext实例,从而在需要的地方使用它。现在我们可以愉快的进行下面操作:
// 检查bean
String name = "gaojiufeng";
if (!SpringUtil.containsBean(name)) {
throw new BusinessException("Bean不存在");
}
// 获取bean
String name = "liyanru";
return (ILogService) SpringUtil.getBean(name);