Spring中IOC和AOP的实现原理

IOC

java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,在使用其他的合作对象时,均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。

IOC是基于java的反射机制以及工厂模式实现的。具体可以看下这两篇文章,https://www.cnblogs.com/Eason-S/p/5851078.html和http://blog.csdn.net/liushuijinger/article/details/35978965,写的都很好

工场:各类都实现了某一接口,并提供一个工场类,根据传入参数的不同来创建不同的对象

反射:可以根据类名获取该类实例, Class.forName(ClassName).newInstance()

在使用spring的时候会将每一个service定义为一个bean,这些bean的名字肯定是不同的,spring会维护一个xml文件,文件中各条记录的id是bean的名字,value是对应的完整类名(包括路径),在项目启动时将该文件中的id和value获取,通过反射的方式将value即类名所对应的实例创建,然后将id即bean的名字与实例以类似键值对的方式存储在spring容器中,当需要使用时直接利用getBean(String beanName)从容器中获取对应的实例。

AOP主要是使用动态代理实现 https://www.cnblogs.com/lcngu/p/5339555.html,https://www.cnblogs.com/cenyu/p/6289209.html这个讲代理的也挺好

AOP(面向切面编程)技术利用一种称为“横切”的技术,解剖封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。

动态代理(被代理的类需要实现一个接口):中使用InvocationHandler接口和Proxy类来实现,在InvocationHandler中的invoke(Proxy proxy,Method method, object arg[])方法,中处理日志,认证,事务等操作

步骤:(1)构造InvocationHandler处理器,定义invoke()方法(2)获取Proxy代理类,并生成代理类对象,调用方法完成相关操作

Proxy.newProxyInstance()

 public static Object newProxyInstance(ClassLoader loader,
                                          Class[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException
newProxyInstance,方法有三个参数:

loader: 用哪个类加载器去加载代理对象

interfaces:动态代理类需要实现的接口

h:动态代理方法在执行时,会调用h里面的invoke方法去执行,invoke(Proxy proxy,Method method, object arg[])

静态代理:实现了被代理类接口的类,其中保存了一个被代理类的实例。在接口的实现方法中,调用被代理对象对应的方法,同时添加需要的其他操作。缺点:代理类和委托类都实现了同样的接口,代码重复;当需要对对不同的委托类实现相同的处理时,需要定义多个代理类

无论是静态代理还是动态代理都需要委托类实现接口,如果要对不实现接口的类进行代理,就需要使用cglib库,使用Enhancer来创建代理类,使用MethodIntercepter接口,重写intercept()方法,实现具体操作

https://blog.csdn.net/zizila/article/details/83169005

你可能感兴趣的:(java)