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

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,生成被代理对象的子类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值