首页  编辑  

SpringBoot动态创建Bean组件Component而不是@Autowired

Tags: /Java/   Date Created:
正常情况下,我们使用 @Autowired 就可以自动注入 @Component 的Bean,但是如果想自己手动创建对应的 Bean 对象,类似 X = new X() 这种做法,SpringBoot中如何实现呢?因为简单直接去 new 相应的组件,如果这个组件有注入其他的内部变量等,new 之后是不会自动注入内部变量的。

如果要动态创建 Bean 对象,请利用 ApplicationContext 来实现:
@Autowired
private ApplicationContext applicationContext;
DemoComponent demoComponent = applicationContext.getBean(DemoComponent.class);
封装一下:
package com.ourlang.dataextract.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 动态获取spring管理的bean实例对象
 * spring上下文工具类
 * https://github.com/ourlang
 * @author ourlang
 */
@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware {

    /**
     * Spring应用上下文环境
     */
    private static ApplicationContext applicationContext;

    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 获得spring上下文
     *
     * @return ApplicationContext spring上下文
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取bean
     *
     * @param name service注解方式name为小驼峰格式
     * @return Object bean的实例对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

    /**
     * 获取bean
     *
     * @param clz service对应的类
     * @return Object bean的实例对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<?> clz) throws BeansException {
        return (T) applicationContext.getBean(clz);
    }
}