哈哈,能回答出来的可以说满大街都是,也可以说凤毛麟角,本人这几天正好在穿这座迷雾森林,ioc原理是bean定义和实例分离和缓存,aop是后置处理器
反射面向切面
IOC是通过解析配置,实现依赖注入。从而达到控制反转的目的。底层主要就是利用了工厂模式和反射技术来实现。而AOP则主要通过动态代理机制实现。
反射,动态代理,over
IOC:
java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像newobject()这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。
IOC是基于java的反射机制以及工厂模式实现的。具体可以看下这两篇文章,Eason-S/p/5851078.html和,cenyu/p/6289209.html这个讲代理的也挺好
AOP(面向切面编程)技术利用一种称为“横切”的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。
动态代理(被代理的类需要实现一个接口):中使用InvocationHandler接口和Proxy类来实现,在InvocationHandler中的invoke(Proxyproxy,Methodmethod,objectarg[])方法,中处理日志,认证,事务等操作
步骤:(1)构造InvocationHandler处理器,定义invoke()方法(2)获取Proxy代理类,并生成代理类对象,调用方法完成相关操作
Proxy.newProxyInstance()
publicstaticObjectnewProxyInstance(ClassLoaderloader,
Class<?&;[]interfaces,
InvocationHandlerh)
throwsIllegalArgumentException
newProxyInstance,方法有三个参数:
loader:用哪个类加载器去加载代理对象
interfaces:动态代理类需要实现的接口
h:动态代理方法在执行时,会调用h里面的invoke方法去执行,invoke(Proxyproxy,Methodmethod,objectarg[])
静态代理:实现了被代理类接口的类,其中保存了一个被代理类的实例。在接口的实现方法中,调用被代理对象对应的方法,同时添加需要的其他操作。缺点:代理类和委托类都实现了同样的接口,代码重复;当需要对对不同的委托类实现相同的处理时,需要定义多个代理类
无论是静态代理还是动态代理都需要委托类实现接口,如果要对不实现接口的类进行代理,就需要使用cglib库,使用Enhancer来创建代理类,使用MethodIntercepter接口,重写intercept()方法,实现具体操作。