• Spring AOP


    Spring Core Spring核心功能:IOC容器,解决对象的创建及依赖关系
    Spring WEB Spring对WEB模块的支持
    Spring AOP切面编程
    AOP的概述
    AOP的底层实现
    Spring AOP开发
    使用AspectJ实现AOP
    Spring JDBC Template使用

    AOP 编程基本概念
    AOP:aspect object programming 面向切面的编程,功能:让关注点代码与业务代码分离

    关注点:很多重复代码(方法)叫关注点

    切面:关注点形成的类,就叫切面,面向切面的编程,就是指很多功能重复的代码的抽象,再在 运行时向业务方法中动态的植入“切面类代码”

    切入点:通过切入点表达式,指定拦截哪些类的哪些方法,给指定的类在运行时植入切面类代码

    代理模式
    代理模式一种设计模式,提供了对目标对象的另外的访问方式即通过代理访问目标对象

    好处:可以在目标对象实现的基础上,增加额外的功能的操作。
    扩展目标对象的功能。

    1、静态代理

      保存数据到数据库
      Dao直接保存
      添加事务
      代理对象,要实现与目标对象一样的接口

      优点:可以做到不修改目标对象功能前提下,对目标对象扩展。
      缺点:1、因为代理对象需求实现与目标对象相同的接口,会有很多代理类
         2、一旦接口增加方法,目标对象与代理对象都需要维护

      解决方式:代理工厂?
      使用动态代理

    2、动态代理
      代理对象不需要实现接口
      代理对象生成,使用到JDKAPI,动态的在内存中创建代理对象
      动态代理,也叫JDK代理,接口代理

      API中
      Proxy
      public static Object newProxyInstance(
          ClassLoader loader,//指定当前目标对象的使用类的加载器
          Class<?>[] interfaces,//目标对象实现的接口类型
          InvocationHandler h)//时间处理器

      目标对象一定要实现接口,否则不能使用动态代理
      代理对象实现:Class $Proxy0 implements XXXX

    3、Cglib代理
      子类代理。在内存中构建一个子类对象从而实现对目标对象的扩展

      Cglib许多AOP框架使用

      步骤:
        引用.jar文件——Spring Core包中包含
        在内存中动态创建目标对象的子类
        目标对象不可以是final
        目标对象方法是final、static,则不会拦截

      示例:

      
    package com.ziv.cglib;
    
    import java.net.ProxySelector;
    
    public class Appcglib {
    
        public static void main(String[] args) {
            
            //目标对象
            UserDao target = new UserDao();
            //代理对象
            UserDao proxy = (UserDao) new ProxyFactory(target).getProxyFactory();
            
            
            try {
                proxy.save();
                proxy.update();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            System.out.println(proxy.getClass());
        }
    }
    Main
      
    package com.ziv.cglib;
    
    import java.lang.reflect.Method;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    /**
     * cblib子类代理工厂(对UserDao在内存中动态创建一个代理)
     * 
     * @author jzhong
     *
     */
    public class ProxyFactory implements MethodInterceptor {
    
        //目标对象
        private Object target;
    
        public ProxyFactory(Object target) {
            this.target = target;
        }
    
        //代理对象
        public Object getProxyFactory() {
            
            //1、工具类
            Enhancer en=new Enhancer();
            //2、设置父类
            en.setSuperclass(target.getClass());
            //3、设置回调方法
            en.setCallback(this);
            //4、创建代理
            return en.create();
            
        }
        @Override
        public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
            
            System.out.println("开始事务....");
            //执行目标对象方法
            Object result = method.invoke(target, arg2);
            System.out.println("结束事务....");
            return result;
        }
    
    }
    cglib
      
    package com.ziv.cglib;
    
    /**
     * 目标类
     * 
     * @author jzhong
     *
     */
    public class UserDao {
    
        public void save() throws Exception {
            // 开始事务
            // 目标方法
            System.out.println("----------数据已保存----");
            // 提交事务
        }
    
        public void update() throws Exception {
            // 目标方法
            System.out.println("----------数据已更新----");
        }
    
    }
    Method

      在Spring AOP编程中
      如果加入容器中的目标对象有实现接口,用JDK代理
      如果目标对象没有有实现接口,用cglib代理

    4、手动实现AOP编程
    AOP面向切面的编程
    AOP业务代码与关注点分离
    关注点
    重复代码(方法)叫关注点

    AOP:
    关注点代码写一次
    开发者只需要关注核心业务
    运行时,执行核心业务代码业务代码,动态植入关注点代码【代理】

  • 相关阅读:
    【JavaScript知识点一】JavaScript 数据类型
    grunt操作之Gruntfile.js
    js重定向后跳转到当前页面锚点
    Java-变量和方法
    Java-运算符
    Java-类型转化
    Java-数组
    Java-循环结构(for,while)
    Java-选择结构(if-else)
    Java-数据类型(引用类型)
  • 原文地址:https://www.cnblogs.com/shangshen/p/12463182.html
Copyright © 2020-2023  润新知