当前位置:首页 > JAVA > 正文内容

Java对Springboot获取bean和判断bean是否存在的封装

高老师1年前 (2023-09-12)JAVA382

今天在项目中需要根据不同客户定制不同的代码逻辑,于是我在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);

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.5b1.cn/post/468.html

分享给朋友:

“Java对Springboot获取bean和判断bean是否存在的封装” 的相关文章

Java不用编译直接执行

Java不用编译直接执行

public class test {     public static void main(String[] args) {     &...

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问public synchronized void setOrderPay(){ }加上synchronized 修饰符即可...

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

(1).final 修饰符通常和 static 修饰符一起使用来创建类常量。(2).父类中的 final 方法可以被子类继承,但是不能被子类重写,声明 final 方法的主要目的是防止该方法的内容被修改。public class Member {   ...

java String 类 ,java 字符串类,java创建字符串,java获取字符串长度,java连接字符串,java格式化字符串

java String 类 ,java 字符串类,java创建字符串,java获取字符串长度,java连接字符串,java格式化字符串

在java中字符串属于对象,刚开始我就疑惑为什么int char等类型都是小写,结果String是大写,java太反人类,后来才知道String是对象。(1).java创建字符串String text = "net"; String tex...

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

(1).创建数组double[] myList = new double[size];  //推荐创建方式 double myList[] = new double[size];  ...

java日期和时间

java日期和时间

(1).java获取当前日期时间Date date = new Date();  System.out.println(date.toString());输出Fri Jul 02 10:29:55 CST 2021(2).java获取时间戳秒/毫秒D...