Spring5中Aop的底层原理及注解实现

Aop概述

面向切面编程,就是不改变源码的情况下来增强代码的功能!

Aop的专业术语

连接点:就是类中的可以增强的方法

切入点:实际增强的方法

通知(增强):实际增强的类容 前置,后置,环绕,异常,最终。

切面:把通知实际应用

Aop的底层原理(JDK的动态代理) 

package com.atchengdu.Dao;public interface UserDao {    public   int add(int a,int b);    public  String  updete(String id);}//接口package com.atchengdu.Dao;public class UserDaoimpl implements UserDao{    @Override    public int add(int a, int b) {        return a+b;    }    @Override    public String updete(String id) {         return id;    }}//实现类

 

package com.atchengdu.Dao;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//JDK动态代理public class Jdkproxy {    public static void main(String[] args) {        //创建接口的动态代理        Class[] interfaces = {UserDao.class};        UserDao userDao =(UserDao)Proxy.newProxyInstance(Jdkproxy.class.getClassLoader(), interfaces, new UserDaoimplProxy(new UserDaoimpl()));        System.out.println(userDao.updete("123456"));    }}class UserDaoimplProxy implements  InvocationHandler{    //第一步:获取代理的对象    private  Object obj;    public  UserDaoimplProxy(Object obj){        this.obj=obj;    }    //增强逻辑    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        String mname=method.getName();        if("Add".equalsIgnoreCase(mname)){            //方法执行之前            System.out.println("方法"+method.getName()+"执行前");            //执行方法            Object invoke = method.invoke(obj, args);            //执行方法后            System.out.println("方法"+method.getName()+"执行后");            return invoke;        }        if("updete".equalsIgnoreCase(mname)){            //方法执行之前            System.out.println("方法"+method.getName()+"执行前");            //执行方法            Object invoke = method.invoke(obj, args);            //执行方法后            System.out.println("方法"+method.getName()+"执行后");            return invoke;        }        return null;    }}

Aop注解方式实现 

   1.xml准备工作

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">    <!--开启注解扫描-->    <context:component-scan base-package="com.java.Aop"></context:component-scan>    <!--开启Aspect生成代理对象-->    <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

写增强类和被增强类

package com.java.Aop;import org.springframework.stereotype.Component;//创建类基于Aop增强方法逻辑@Componentpublic class User {    public  void  add(){        System.out.println("add.....");    }}
package com.java.Aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;//增强user类的类@Component@Aspect   //生成增强类代理对象//@Order(数字值) 如果多个类同时增强一个类 可以设置优先级public class UserProxy {    //切入点抽取    @Pointcut(value ="execution(* com.java.Aop.User.add(..))")    public void poincut(){    }    //前置通知    @Before(value ="poincut()")    public void before(){        System.out.println("before...");    }    //最终通知    @After(value ="execution(* com.java.Aop.User.add(..))")    public void after(){        System.out.println("after...");    }    //异常通知    @AfterThrowing(value ="execution(* com.java.Aop.User.add(..))")    public void AfterThrowing(){        System.out.println("AfterThrowing...");    }    //后置通知    @AfterReturning(value ="execution(* com.java.Aop.User.add(..))")    public void AfterReturning(){        System.out.println("AfterReturning...");    }    @Around(value ="execution(* com.java.Aop.User.add(..))")    public void AfterReturning(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        System.out.println("环绕前");        proceedingJoinPoint.proceed();//执行被增强类的方法        System.out.println("环绕后");    }}

 

package com.java.Aop;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testspring {    @Test    public void Test1(){        ApplicationContext context=new ClassPathXmlApplicationContext("Bean.xml");        User user = context.getBean("user", User.class);        user.add();    }}

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5Lmf5LiN5Lya5pWy5Luj56CB5ZGA,size_10,color_FFFFFF,t_70,g_se,x_16

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值