一、前言
最近在项目中想获取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]
三、总结
希望有用,好好学习,天天向上!