在了解过一段时间源码后,深深的被折服,就那简简单单的ApplicationContext初始化那几条代码都够我研究很长一段时间了。Spring强大的地方很多,它留给了我们很多能够扩展的地方比如BeanFactoryPostProcessor,BeanPostProcessor等等,今天来说一个也是很牛的接口就是Aware接口。
由于一次我的特殊要求,Spring提供的功能并不能满足我的需求,那我就想起了这个接口了。
public interface Aware {
}
没有什么代码,很明显就是一个标签类(顶级父类,标志着这一项功能),它的子类们都可厉害了,如BeanFactoryAware,ApplicationContextAware,MessageSourceAware,今天用到的主角就是ApplicationContextAware
加入有一个需求:在Spring环境外部进行数据库的访问和修改,你该怎么做?
那么我们就可以利用这个接口制作一个SpringUtils工具类,供外部去访问Spring的环境
package com.wrial.checkdev.utils;
/*
* @Author Wrial
* @Date Created in 0:40 2019/8/27
* @Description
*/
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Created by
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
当然,如果就仅仅上面这一种需求的话,那使用BeanFactoryAware也是足够,动态从工厂中获取Bean,调用BeanFactory的getBean。
读Spring源码往往不是表面能力的提升,而是思考方式的提升