springboot中普通类获取spring的bean对象

2022-06-26 13:15:47

之前的项目是控制台项目没有引入springboot相关的依赖,后续因为想更好提供接口给客户方进行调用,将控制台程序更改成springboot项目,引入springboot后,之前普通类中想调用spring ioc容器中的bean,因为普通类已经脱离了spring boot ioc范围,所有需要通过别的方式来解决。了解springboot ioc容器原理中,我们知道,在spring的整体框架中存在很多以Aware结尾的接口,Aware接口的含义是 “感知”,类似applicationcontextaware 就是感知applicationcontext,只要继承该接口就可以在该类中使用applicationcontext。

//加入component注解,让spring扫描到该bean
@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public SpringUtil() {
    }

    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        if (applicationContext == null) {
            applicationContext = arg0;
        }

    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static void setAppCtx(ApplicationContext webAppCtx) {
        if (webAppCtx != null) {
            applicationContext = webAppCtx;
        }
    }

    /**
     * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) throws ClassNotFoundException {
        return getApplicationContext().getBean(name, clazz);
    }

    public static final Object getBean(String beanName) {
        return getApplicationContext().getBean(beanName);
    }

    public static final Object getBean(String beanName, String className) throws ClassNotFoundException {
        Class clz = Class.forName(className);
        return getApplicationContext().getBean(beanName, clz.getClass());
    }

    public static boolean containsBean(String name) {
        return getApplicationContext().containsBean(name);
    }

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().isSingleton(name);
    }

    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().getType(name);
    }

    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return getApplicationContext().getAliases(name);
    }
}

通过下面的测试代码进行测试,可以确保普通类获取spring ioc中的bean对象。

 public static void main(String[] args){
        /**
         * springboot普通类获取spring容器中的bean
         *
         *User UserDao UserImpl,其中UserImpl中有一个获取User列表的方法getUserList
         * 测试方法:
         * 测试在springboot中根据UserImpl的Class对象调用getUserList方法获取用户列表数据
         */
        Map param = new HashMap<String,Object>();
        param.put("name","Tom");
        List<User> listUser=SpringUtil.getBean(UserImpl.class).getClass()
                .getDeclaredMethod("getUserList", Map.class)
                .invoke(UserImpl.class,param);
    }
  • 作者:小乌龟慢慢爬xhy
  • 原文链接:https://blog.csdn.net/dog123xuheyin/article/details/116272535
    更新时间:2022-06-26 13:15:47