-
这两个接口在项目中的使用,主要是为了动态获取实例对象,两种场景
-
第一种:获取的实例对象都实现了相同的接口或者继承了相同的父类,这样就可以实现代码的整洁复用;
-
第二种:比如方法的调用,类里边的方法相互调用,如果想使用自定义注解的话,是不会生效的,但是如果借用ApplicationContextAware和BeanFactoryAware接口的方法实现,则可以让自定义注解生效,因为重新动态获取了一次实例;
-
使用说明:必须保证SpringContextUtil该类被Spring容器管理,不然不会生效,会报空指针异常;使用注解扫描或者定义bean标签注入;
<bean id="springContextUtil" class="com.yuan.SpringContextUtil"/>
-
SpringContextUtil.getBean(“aController”,AController.class)
-
SpringContextUtil类
public class SpringContextUtil implements ApplicationContextAware {
// Spring应用上下文环境
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*
* @param beanId
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static <T> T getBean(String beanId) throws BeansException {
return (T)applicationContext.getBean(beanId);
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*
* @param beanId
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException {
return (T)applicationContext.getBean(beanId,beanClass);
}
}
public class SpringContextUtil implements BeanFactoryAware {
private static BeanFactory beanFactory;
/**
* 实现BeanFactory接口的回调方法,设置上下文环境
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory=beanFactory;
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*
* @param beanId
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static <T> T getBean(String beanId) throws BeansException {
return (T)beanFactory.getBean(beanId);
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*
* @param beanId
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException {
return (T)beanFactory.getBean(beanId,beanClass);
}
}
以下方式也可以:
@Resource
private ApplicationContext applicationContext;
applicationContext.getBean()