Spring核心知识
Ioc/Di
1、概念
容器反转资源的获取方向,主动地管理各个组件的生命周期以及组件之间的依赖关系。
2、实现
实际上容器主要使用了用反射技术。
Map<String,Object> beanMap = new ConcurrentHashMap<>();
beanMap.put(
beanDefinition.getId(),
Class.forName(beanDefinition.getClassName()).newInstance();
);
大体流程:
第一步:定位资源(Xml、Annotation),指的是BeanDefinition的资源定位。
第二步:载入BeanDefinition,将资源转换为容器内部数据结构(BeanDefinition)。
第三步:注册BeanDefinition,将载入过程中解析到的BeanDefinition向容器进行注册。实际上容器将BeanDefinition注入到了一个ConcurrentHashMap中去。
具体实现:
第一步>>>定位资源
由用户传入资源的路径,容器解析并设置解析后资源路径。这一步比较简单,大家可以看看源码。
第二部>>>载入BeanDefinition
找到XmlBeanDefinitionReader,发现具体的实现在父抽象类AbstractBeanDefinitionReader里面。
发现载入资源的代码实现。
第三步>>>注册BeanDefinition
找到BeanDefinitionRegistry,发现具体的实现在实现类DefaultListableBeanFactory里面。
发现容器的确是由一个ConcurrentHashMap存储BeanDefinition。
注入BeanDefinition的实现方法,业务比较复杂,可以忽略。
获取BeanDefinition的实现方法。
Aop
1、概念
静态代理:编译阶段生成代理类, 实现方式有:AspectJ 。
动态代理:运行时生成代理类,实现方式有:Proxy、Cglib。
而Spring使用的是Proxy和Cglib的动态代理实现Aop。
2、实现:
Proxy实现
Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
);
Cglib实现
Enhancer enhancer = new Enhancer();
enhancer.setSuperClass(object.getClass());
enhancer.setCallback(
new MethodInterceptor(){
public Object intercept(
Object proxy,
Method method,
Object[] args,
MethodProxy methodProxy
) throws Throwable {
return null;
}
}
);
enhancer.create();
3、区别:
Proxy:基于Jdk反射机制,生成Proxy的子类,并实现被代理对象的接口。
Cglib:基于字节码处理框架Asm,生成被代理对象的子类。