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:
关注点代码写一次
开发者只需要关注核心业务
运行时,执行核心业务代码业务代码,动态植入关注点代码【代理】

原文地址:https://www.cnblogs.com/shangshen/p/12463182.html