实现ApplicationContextAware
接口的方式获取ApplicationContext
对象实例
创建一个实体类并实现ApplicationContextAware
接口,重写接口内的setApplicationContext
方法来完成获取ApplicationContext
实例的方法,代码如下所示:
一看到Aware就知道是干什么的了,就是属性注入的,但是这个ApplicationContextAware的不同地方在于,实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来:
@Component
public class SpringContext implements ApplicationContextAware
{
/**
* 上下文对象实例
*/
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 获取applicationContext
* @return
*/
public ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public Object getBean(String name){
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @param <T>
* @return
*/
public <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
如果你是想在非Spring
管理的实体内使用ApplicationContext
还不想采用注入SpringContext来完成实例化,这时我们可以修改ApplicationContext
实例对象为静态实例,方法改为静态方法,这样在外部同样是可以获取到指定Bean
的实例
@Component
@Lazy(false)
public class SpringContext implements ApplicationContextAware {
protected static Logger log = LoggerFactory.getLogger(SpringContext.class);
private static ApplicationContext applicationContext;
@Override
@Autowired
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringContext.applicationContext == null) {
SpringContext.applicationContext = applicationContext;
}
log.info("ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象");
}
/**
* 获取applicationContext
* @return applicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name 实例名称
* @return 实例
*/
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
* @param clazz 类
* @param <T> 类型
* @return 实例
*/
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name 实例名称
* @param clazz 类
* @param <T> 类型
* @return 实例
*/
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
声明了一个ApplicationContext类型的静态变量,但是由于静态变量是不能被Spring容器管理的,一开始用正常的getter和setter方法不能获取到特定的bean,实践证明,需要在此变量的setter方法上加上@Autowired注解,并且去除setter方法中的static关键字。才可实现特定bean的注入。
懒加载:对象使用的时候才去创建,节省资源,但是不利于提前发现错误。
非懒加载:容器启动的时候立刻创建对象。消耗资源。利于提前发现错误。
当scope=“prototype” (多例)时,默认以懒加载的方式产生对象。
当scope=“singleton” (单例)时,默认以非懒加载的方式产生对象。
获取实例为空时,需要检查:
SpringContext类(这个类要和springboot启动类放一起)