Spring Boot中获取通过@Bean注入Spring容器的对象实体

一、前言

    最近在项目中想获取Spring容器中的注册好的Bean对象,但是因为项目是使用Spring Boot中的,不能用ClassPathXmlApplicationContext来获取指定Bean,然后去学习别人的方法,并且成功测试过确实可行,就想总结一下这个Bean获取的方法的实现。

二、实现步骤

1、设置BeanConfig类,添加指定Bean到Spring容器中。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 添加bean到Spring容器中
 * @Author czd
 * @Date:createed in 2019/10/18
 * @Version: V1.0
 */
@Configuration
public class BeanConfig {
    //创建线程池的数量
    private static final Integer THREAD_POOL_NUMBER = 10;
    /**
     * 创建线程池对象,将其注入到Spring容器中
     * @return
     */
    @Bean("ExecutorService")
    public ExecutorService getExecutorPool(){
        System.out.println("=====已经注入Spring容器中=====");
        return Executors.newFixedThreadPool(THREAD_POOL_NUMBER);
    }
}

2、实现获取注入到Spring容器中Bean的SpringUtil工具类(SpringUtil实现了ApplicationContextAware接口)。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * @Author czd
 * @Date:createed in 2018/10/18
 * @Version: V1.0
 */
@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;
    private static Logger logger = LoggerFactory.getLogger(SpringUtil.class);

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //创建一个新的ApplicationContext对象
        if (SpringUtil.applicationContext == null){
           SpringUtil.applicationContext = applicationContext;
        }

        logger.info("ApplicationContext配置成功,applicationContext对象:"+SpringUtil.applicationContext);
    }

    public static ApplicationContext getApplicationContext(){
        return applicationContext;
    }

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

    public static <T> T getBean(Class<T> tClass){
        return getApplicationContext().getBean(tClass);

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

3、测试是否获取已经注入到Spring容器的Bean

import com.ants.antsbackground.util.SpringUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.ExecutorService;
/**
 * @Author czd
 * @Date:createed in
 * @Version: V1.0
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {
    @GetMapping(value = "/abcd")
    public void test(){
        ExecutorService executorService = (ExecutorService)SpringUtil.getBean("ExecutorService");
        System.out.println("线程池对象: " + executorService.toString());
    }
}

4、结果如下所示

线程池对象: java.util.concurrent.ThreadPoolExecutor@6a2ee88a[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]

三、总结

希望有用,好好学习,天天向上!

发布了185 篇原创文章 · 获赞 457 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42146366/article/details/102633076
今日推荐