SpringBoot手動でbeanを取得し、静的メソッドを呼び出してコンテナからオブジェクトを取得

9995 ワード

ApplicationContextAwareインタフェース内のsetApplicationContextメソッドを書き換える@component注記を使用して、通常のJavaBeanをspringコンテナにインスタンス化します.
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Content:     
 * @auther: wha
 * @Date: 2019/7/17 9:51
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

    /**
     *        
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     *   applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     *   name   Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     *   class  Bean.
     *
     * @param clazz
     * @param 
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     *   name,  Clazz     Bean
     *
     * @param name
     * @param clazz
     * @param 
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}


これにより、他の場所で静的メソッドを呼び出してコンテナからオブジェクトを取得します.
/**
 * Content:
 *
 * @auther: wha
 * @Date: 2019/11/7 10:27
 */
public class SendMessager {
    private static Logger logger= LoggerFactory.getLogger(SendMessager.class);

    private static RedisService redisService = SpringContextUtils.getBean(RedisServiceImpl.class);

    private static TemplateCodeConfigMapper codeConfigMapper = SpringContextUtils.getBean(TemplateCodeConfigMapper.class);

    private static TemplateCodeConfig getTemplateCodeConfig(Integer id) {
        TemplateCodeConfig templateCodeConfig = codeConfigMapper.selectByPrimaryKey(id);
        return templateCodeConfig;
    }
    public static ReturnData message(){  //    
		TemplateCodeConfig templateCodeConfig = getTemplateCodeConfig(type);
		return ReturnData.success(templateCodeConfig);
   }
}

Springコンテナは、コンテナ内のすべてのBeanを検出します.BeanがApplicationContextAwareインタフェースを実装していることが判明した場合、Springコンテナは、Beanを作成した後、BeanのsetApplicationContextAware()メソッドを自動的に呼び出します.このメソッドを呼び出すと、コンテナ自体がパラメータとしてメソッドに渡されます.このメソッドの実装部分はSpringが入力するパラメータ(コンテナ自体)クラスオブジェクトに割り当てられたアプリケーションContextインスタンス変数は、次にアプリケーションContextインスタンス変数からコンテナ自体にアクセスできます.