Spring核心技术
IOC容器概述
Spring容器高级主题
Spring容器技术内幕
Spring的 AbstractApplicationContext 是 AppliactionContext 抽象实现类, refresh()内部的逻辑是
//初始化BeanFactory, getBeanFactory由子类实现,只是把信息装入容器
configurableListableBeanFactory beanFactory = getBeanFactory();
//调用工厂后处理器:根据反射从 BeanDefinitionRegistry 中找出所有 BeanFactoryPostProcessor 类型的Bean,注册到容器Bean 后处理器的注册表中
invokeBeanFactoryPostProcessors();
//初始化信息源, 国际化信息资源
initMessageSource();
//初始化应用上下文事件广播器
initApplicationEventMulticaster();
//初始化特殊Bean,钩子方法,子类用来初始化特殊操作
onRefresh();
//注册事件监听器
registerListeners();
//初始化singleton的Bean
beanFactory.preInstantiateSingletons();
//发布上下问刷新事件,创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中
publishEvent(new ContextrefreshedEvent(this));
SpringAOP基础
CGLib动态代理
CGLib采用非常低层的字节码技术,可以为一个类创建子类。以下是一个动态切入性能监控的例子
public class CglibProxy implements MethodInteceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object interept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{
PerformanceMonitor.begin(obj.getClass().getName()+"."+method.getName());
Object result = proxy.invokeSuper(obj, args);
PerformanceMonitor.end();
return result;
}
}
我们来测试一下
CglibProxy proxy = new CglibProxy();
ForumServiceImpl impl = (ForumServiceImpl)proxy.getProxy(ForumServiceImpl.class);
forumService.removeForum(10);
//输出
//begin monitor...
//模拟删除Forum记录:10
//end monitor...