声明一个ApplicationContextHelper组件,名字随意。它实现了ApplicationContextAware接口。并重写setApplicationContext方法。在该组件里可以通过名字获取某个bean.
一. 通过类名获取Bean
@Component
public class ApplicationContextGetBeanHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param className 类名
* @return
*/
public static Object getBean(String className) {
String beanName = getClassName(className);
return getApplicationContext() != null ? getApplicationContext().getBean(beanName) : null;
}
/**
* 通过class获取Bean.
* @param clazz 类
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return null != getApplicationContext()?getApplicationContext().getBean(clazz):null;
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String className, Class<T> clazz) {
String beanName = getClassName(className);
return null != getApplicationContext()?getApplicationContext().getBean(beanName, clazz):null;
}
/**
* 获取接口所有的实现类
* 注意:实现类必须已注入到容器
* @return 实现类名:对应的类
*/
public <T> Map<String, T> getMap(Class<T> classT) {
Map<String, T> map = null;
if(classT == null) {
throw new IllegalArgumentException("classT为空");
}
//根据接口类型返回相应的所有bean
map = applicationContext.getBeansOfType(classT);
return map;
}
/**
* 类名转成首字母小写
* @param className
* @return
*/
private static String getClassName(String className) {
if(ObjectUtils.isEmpty(className)) {
throw new IllegalArgumentException("className为空");
}
String beanName = null;
if(className.length() > 1) {
beanName = className.substring(0, 1).toLowerCase() + className.substring(1);
} else {
beanName = className.toLowerCase();
}
return beanName;
}
}
使用
@Slf4j
@RestController
@RequestMapping("/getbean")
public class GetBeanTestController {
@GetMapping("/retryService")
public String retryService(@RequestParam int num){
RetryService retryService = (RetryService) ApplicationContextGetBeanHelper.getBean("RetryService");
String ss = retryService.print();
return ss;
}
}
二. 获取接口所有的实现类
@Component
public class ServiceLocator implements ApplicationContextAware {
private ApplicationContext applicationContext;
/**
* 获取应用上下文并获取相应的接口实现类
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 用于保存接口实现类名及对应的类
* @return
*/
public <T> Map<String, T> getMap(Class<T> classT) {
Map<String, T> map = null;
if(classT==null) {
throw new IllegalArgumentException("classT为空");
}
//根据接口类型返回相应的所有bean
map = applicationContext.getBeansOfType(classT);
return map;
}
}
测试
public void testServiceLocator(){
Map<String, Test> map = serviceLocator.getMap(Test.class);
map.forEach((s, map1) -> {
System.out.println(map1.getClass().getTypeName());
});
}
网友评论