网站导航仿站,最新一键自助建站程序源码,创建一个网页要钱吗,桃园街网站建设1、问题#xff1a;想要添加日志记录、性能监控、安全监测 2、最初解决方案2.1、最初解决方案#xff1a;在每个需要的类函数中重复写上面处理代。 缺点#xff1a;太多重复代码#xff0c;且紧耦合2.2、抽象类进行共性设计#xff0c;子类进行个性设计#xff0c;此处不… 1、问题想要添加日志记录、性能监控、安全监测 2、最初解决方案 2.1、最初解决方案在每个需要的类函数中重复写上面处理代。 缺点太多重复代码且紧耦合 2.2、抽象类进行共性设计子类进行个性设计此处不讲解缺点一荣俱荣一损俱损 2.3、使用装饰器模式/代理模式改进的解决方案 装饰器模式动态地给一个对象添加一些额外的职责。就增加功能来说 装饰器模式相比生成子类更为灵活。 代理模式为其他对象提供一种代理以控制对这个对象的访问。 缺点紧耦合每个业务逻辑需要一个装饰器实现或代理 2.4、JDK动态代理解决方案比较通用的解决方案 Java代码 1. public class MyInvocationHandler implements InvocationHandler { 2. private Object target; 3. public MyInvocationHandler(Object target) { 4. this.target target; 5. } 6. Override 7. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 8. //1.记录日志 2.时间统计开始 3.安全检查 9. Object retVal method.invoke(target, args); 10. //4.时间统计结束 11. return retVal; 12. } 13. public static Object proxy(Object target) { 14. return Proxy.newProxyInstance(target.getClass().getClassLoader(), 15. target.getClass().getInterfaces(), new MyInvocationHandler(target)); 16. } 17. } 编程模型 Java代码 1. //proxy 在其上调用方法的代理实例 2. //method 拦截的方法 3. //args 拦截的参数 4. Override 5. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 6. Object retValnull; 7. //预处理 8. //前置条件判断 9. boolean ok true; 10. if(!ok) {//不满足条件 11. throw new RuntimeException(你没有权限); 12. } 13. else {//反射调用目标对象的某个方法 14. retVal method.invoke(target, args); 15. } 16. //后处理 17. return retVal; 18. } 19. 缺点使用麻烦不能代理类只能代理接口 CGLIB动态代理解决方案比较通用的解决方案 Java代码 1. public class MyInterceptor implements MethodInterceptor { 2. private Object target; 3. public MyInterceptor(Object target) { 4. this.target target; 5. } 6. Override 7. public Object intercept(Object proxy, Method method, Object[] args, 8. MethodProxy invocation) throws Throwable { 9. //1.记录日志 2.时间统计开始 3.安全检查 10. Object retVal invocation.invoke(target, args); 11. //4.时间统计结束 12. return retVal; 13. } 14. public static Object proxy(Object target) { 15. return Enhancer.create(target.getClass(), new MyInterceptor(target)); 16. } 17. } 编程模型 Java代码 1. //proxy 在其上调用方法的代理实例 method拦截的方法 args 拦截的参数 2. //invocation 用来去调用被代理对象方法的 3. Override 4. public Object intercept(Object proxy, Method method, Object[] args, 5. MethodProxy invocation) throws Throwable { 6. //预处理 7. //前置条件判断 8. boolean ok true; 9. if(!ok) {//不满足条件 10. throw new RuntimeException(出错了); 11. } 12. else {//调用目标对象的某个方法 13. Object retVal invocation.invoke(target, args); 14. } 15. //后处理 16. return retVal; 17. } 优点能代理接口和类 缺点使用麻烦不能代理final类 动态代理本质 本质对目标对象增强 最终表现为类动态创建子类看手工生成子类还是自动生成子类 代理限制 只能在父类方法被调用之前或之后进行增强功能的修改不能在中间进行修改要想在方法调用中增强需要ASM(java 字节码生成库) 其他动态代理框架 jbossjavassist hibernate 3.3中默认为javassist hibernate 3.3之前中默认为cglib 2.5、AOP解决方案通用且简单的解决方案 Java代码 1. Aspect 2. public class PayEbiAspect { 3. Pointcut(valueexecution(* pay(..))) 4. public void pointcut() {} 5. Around(valuepointcut()) 6. public Object around(ProceedingJoinPoint pjp) throws Throwable { 7. //1.记录日志 8. //2.时间统计开始 9. //3.安全检查 10. Object retVal pjp.proceed();//调用目标对象的真正方法 11. //4.时间统计结束 12. return retVal; 13. } 14. } 编程模型 Java代码 1. //2 切入点 2. Pointcut(valueexecution(* *(..))) 3. public void pointcut() {} 4. //3 拦截器的interceptor 5. Around(valuepointcut()) 6. public Object around(ProceedingJoinPoint pjp) throws Throwable { 7. Object retValnull; 8. //预处理 9. //前置条件判断 10. boolean ok true; 11. if(!ok) {//不满足条件 12. throw new RuntimeException(你没有权限); 13. } 14. else {//调用目标对象的某个方法 15. retVal pjp.proceed(); 16. } 17. //后处理 18. return retVal; 19. } 缺点依赖AOP框架 AOP入门 概念 n关注点可以认为是所关注的任何东西比如上边的支付组件 n关注点分离将问题细化为单独部分即可以理解为不可再分割的组件如上边的日志组件和支付组件 n横切关注点会在多个模块中出现使用现有的编程方法横切关注点会横越多个模块结果是使系统难以设计、理解、实现和演进如日志组件横切于支付组件。 织入横切关注点分离后需要通过某种技术将横切关注点融合到系统中从而完成需要的功能因此需要织入织入可能在编译期、加载期、运行期等进行。 nAOP是什么(Aspect Oriented Programming) AOP是一种编程范式提供从另一个角度来考虑程序结构以完善面向对象编程OOP。 AOP为开发者提供了一种描述横切关注点的机制并能够自动将横切关注点织入到面向对象的软件系统中从而实现了横切关注点的模块化。 AOP能够将那些与业务无关却为业务模块所共同调用的逻辑或责任例如事务处理、日志管理、权限控制等封装起来便于减少系统的重复代码降低模块间的耦合度并有利于未来的可操作性和可维护性。 nAOP能干什么也是AOP带来的好处 1降低模块的耦合度 2使系统容易扩展 3设计决定的迟绑定使用AOP,设计师可以推迟为将来的需求作决定因为它 可以把这种需求作为独立的方面很容易的实现。 4更好的代码复用性 AOP基本概念 连接点Joinpoint 表示需要在程序中插入横切关注点的扩展点连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等Spring只支持方法执行连接点在AOP中表示为“在哪里做” 切入点Pointcut 选择一组相关连接点的模式即可以认为连接点的集合Spring支持perl5正则表达式和AspectJ切入点模式Spring默认使用AspectJ语法在AOP中表示为“在哪里做的集合” 增强Advice或称为增强 在连接点上执行的行为增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段包括前置增强before advice、后置增强 (after advice)、环绕增强 around advice在Spring中通过代理模式实现AOP并通过拦截器模式以环绕连接点的拦截器链织入增强 在AOP中表示为“做什么” 方面/切面Aspect 横切关注点的模块化比如上边提到的日志组件。可以认为是增强、引入和切入点的组合在Spring中可以使用Schema和AspectJ方式进行组织实现在AOP中表示为“在哪里做和做什么集合” 目标对象Target Object 需要被织入横切关注点的对象即该对象是切入点选择的对象需要被增强的对象从而也可称为“被增强对象”由于Spring AOP 通过代理模式实现从而这个对象永远是被代理对象在AOP中表示为“对谁做” AOP代理AOP Proxy AOP框架使用代理模式创建的对象从而实现在连接点处插入增强即应用切面就是通过代理来对目标对象应用切面。在Spring中AOP代理可以用JDK动态代理或CGLIB代理实现而通过拦截器模型应用切面。 织入Weaving 织入是一个过程是将切面应用到目标对象从而创建出AOP代理对象的过程织入可以在编译期、类装载期、运行期进行。 引入inter-type declaration 也称为内部类型声明为已有的类添加额外新的字段或方法Spring允许引入新的接口必须对应一个实现到所有被代理对象目标对象, 在AOP中表示为“做什么新增什么” AOP的Advice类型 前置增强Before advice 在某连接点之前执行的增强但这个增强不能阻止连接点前的执行除非它抛出一个异常。 后置返回增强After returning advice 在某连接点正常完成后执行的增强例如一个方法没有抛出任何异常正常返回。 后置异常增强After throwing advice 在方法抛出异常退出时执行的增强。 后置最终增强After (finally) advice 当某连接点退出的时候执行的增强不论是正常返回还是异常退出。 环绕增强Around Advice 包围一个连接点的增强如方法调用。这是最强大的一种增强类型。 环绕增强可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 横切关注点的表现有 ·代码纠结/混乱——当一个模块或代码段同时管理多个关注点时发生这种情况。如我既要实现业务、还要实现安全和事务。即有些关注点同时被多个不同的模块实现。实现了重复的功能。 ·代码分散——当一个关注点分布在许多模块中并且未能很好地局部化和模块化时发生这种情况 。如许多模块调用用户是否登录验证代码。调用了重复的功能。 AOP包括三个清晰的开发步骤 1功能横切找出横切关注点。 2实现分离各自独立的实现这些横切关注点所需要完成的功能。 3功能回贴在这一步里方面集成器通过创建一个模块单元—— 方面来指定重组的规则。重组过程——也叫织入或结合—— 则使用这些信息来构建最终系统。 来源http://jinnianshilongnian.iteye.com/blog/1474325 来自为知笔记(Wiz)