Javaee Spring的AOP简介

.SpringAOP简介

1.1 什么是AOP

   AOP Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容。利用 AOP 可以对业务 逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低 ,提高程序的可重用性,同时提高了开发的效率。

1.2 AOP的作用及其优势

作用:在程序运行期间,在不修改源码的情况下对方法进行 增强
优势:减少重复代码,提高开发效率,并且便于维护

1.3 AOP的底层实现

      实际上, AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间, Spring 通过动态代理技术 动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能 的增强。

1.4 AOP的动态代理技术

常用的动态代理技术
JDK 代理:基于接口的动态代理技术
cglib 代理:基于父类的动态代理技术

 1.5 JDK的动态代理

1.5.1 代理模式概述
    为什么要有 '' 代理 ''? 生活中就有很多代理的例子,例如,我现在需要出国,但是我不愿意自己去办签证、预定 机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。 代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事, 这个人就是代理者, 所以代理模式包含了 3 个角色 : 被代理角色 代理角色 抽象角色 ( 协议 )
1.5.2 静态代理
项目结构:
package wwx.test02;
public interface Sing {
    public void sing();
}
-------------------------------------------
package wwx.test02;

public class JinLian implements Sing {

    @Override
    public void sing() {
        System.out.println("jinlian在唱歌");
    }
}
-------------------------------------------
package wwx.test02;

public class WangPo implements Sing{

    JinLian jinLian;

    public WangPo(JinLian jinLian) {
        this.jinLian = jinLian;
    }

    @Override
    public void sing() {
        jinLian.sing();
    }
}
-------------------------------------------
package wwx.test02;

public class XiMen {

    public static void main(String[] args) {
       JinLian jl=new JinLian();
       WangPo wp=new WangPo(jl);
       wp.sing();
//被代理者没有能力或者不愿意去完成某件事情,
//那么就需要找个人代替自己去完成这件事,这个人就是代理者
//静态代理模式:代理类是实际存在的,根据代理类生成一个代理对象
//动态代理模式:代理类是不存在的,直接动态生成一个代理对象
//实现了静态代理
    }
}
------------------------------------------

 

1.5.3 动态代理
    概述 : 动态代理就是直接通过反射生成一个代理对象 , 代理对象所属的类是不需要存在的 动态代理的获取: jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象
参数 1:ClassLoader loader 被代理对象的类加载器
参数 2:Class<?>[] interfaces 被代理对象的要实现的接口
参数 3:InvocationHandler h ( 接口 ) 执行处理接口
返回值 : 代理对象
2 个参数是为了帮助在 jvm 内部生成被代理对象的代理对象 , 3 个参数 , 用来监听代理对象调用方
, 帮助我们调用方法
回调方法 : 当代理对象调用了方法 , 就会来执行该 invoke 方法 , 在该方法中就可以增强
被代理类的方法
参数 1: 生成的代理对象 这里就是 p 这个代理对象 ( 慎用 )
参数 2: 当前代理对象执行的方法 这里 method 就是 happy() 方法对象
参数 3: 当前代理对象执行的方法 , 传入的实际参数
返回值 : 当前代理对象执行的方法的返回值
参数 1: 生成的代理对象 这里就是 p 这个代理对象 ( 慎用 )的原因: 
package wwx.test03;

public class JianLian implements Sing{

    @Override
    public void sing() {
        System.out.println("金莲在唱歌");
    }
}

------------------------------------------------------------------------------------
------------------------
package wwx.test03;

public interface Sing {

    public void sing();
}

------------------------------------------------------------------------------------
------------------------

package wwx.test03;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

public class DemoTest {

//    参数1:ClassLoader loader 被代理对象的类加载器
//    参数2:Class<?>[] interfaces 被代理对象的要实现的接口
//1.6 AOP相关概念
//    在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
//    Target(目标对象):代理的目标对象
//    Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
//    参数3:InvocationHandler h (接口)执行处理接口
//    返回值: 代理对象
//            前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方
//    法,帮助我们调用方法
    public static void main(String[] args) {
        JianLian jianLian=new JianLian();
        Sing p = (Sing) Proxy.newProxyInstance(JianLian.class.getClassLoader(),
                JianLian.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Date date=new Date();
                        System.out.println(date);
                       method.invoke(jianLian,args);
                        return null;
                    }
                });

       p.sing();
    }
}

 

1.6 AOP相关概念

   在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
Target (目标对象):代理的目标对象
Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Joinpoint (连接点):类里面哪些方法可以被增强,这些方法称为连接点, spring 只支持方法类型的连接点
Pointcut (切入点):实际被真正增强的方法,称为切入点
Advice (通知 / 增强):实际增强的逻辑部分称为通知(增强),通知有多种类型:
前置通知:指定增强的方法在切入点方法之前执行
后置通知:指定增强的方法在切入点方法之后执行
异常通知:指定增强的方法在出现异常时执行
最终通知:无论增强方式执行是否有异常都会执行
环绕通知:指定增强的方法在切入点方法之前和之后都执行
Aspect (切面):是切入点和通知(引介)的结合
Weaving (织入):是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而AspectJ 采用编译期织入和类装载期织入

1.7 AOP 开发明确的事项

1.7.1 需要编写的内容
编写核心业务代码(目标类的目标方法)
编写切面类,切面类中有通知 ( 增强功能方法 )
在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
1.7.2 AOP 技术实现的内容
Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代 理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
1.7.3 AOP 底层使用哪种代理方式
spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

.基于XMLAOP开发

2.1 快速入门
1. 导入 AOP 相关坐标
2. 创建目标接口和目标类(内部有切点)
3. 创建切面类(内部有增强方法)
4. 将目标类和切面类的对象创建权交给 spring
5. applicationContext.xml 中配置织入关系
6. 测试代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值