普通类获取Spring容器中的Bean
程序员文章站
2022-05-23 12:46:34
...
普通类获取Spring容器中的Bean
方式一
@Component
public class SpringApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringApplicationContextHolder.applicationContext = applicationContext;
}
/**
* 获取applicationContext对象
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 根据beanid获取spring中的bean对象
*
* @param beanId
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanId) {
return (T) applicationContext.getBean(beanId);
}
public static <T> T getBean(Class<T> calzz){
return applicationContext.getBean(calzz);
}
}
方式二
@Component
public final class SpringUtils implements BeanFactoryPostProcessor {
/**
* Spring应用上下文环境
*/
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtils.beanFactory = beanFactory;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws org.springframework.beans.BeansException
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) beanFactory.getBean(name);
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws org.springframework.beans.BeansException
*/
public static <T> T getBean(Class<T> clz) throws BeansException {
T result = beanFactory.getBean(clz);
return result;
}
}
注意不要忘了加@Component
或xml方式配置
两种方式使用哪个好呢
通过对比ApplicationContextAware
和BeanFactoryPostProcessor
文档发现
使用ApplicationContextAware
更好
因为BeanFactoryPostProcessor
获取的是ConfigurableListableBeanFactory
允许修改配置的属性,影响安全
ApplicationContextAware
是获取ApplicationContext
,对它有种亲切感
/**
* Allows for custom modification of an application context's bean definitions
*/
@FunctionalInterface
public interface BeanFactoryPostProcessor
**
* Interface to be implemented by any object that wishes to be notified
* of the {@link ApplicationContext} that it runs in.
*/
public interface ApplicationContextAware extends Aware
推荐阅读