Spring核心知识(IOC/DI、AOP)

来源:互联网 发布:力鼎软件 编辑:程序博客网 时间:2024/05/17 17:16
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,生成被代理对象的子类。

原创粉丝点击