美文网首页
Spring AOP 初识AOP

Spring AOP 初识AOP

作者: 帅气的阿斌 | 来源:发表于2020-04-15 12:24 被阅读0次
    通过Spring使用AOP

    必要条件:
    1、增强工具类(提供增强方法)
    2、被代理增强类(提供需要被增强的方法)

    ①接口类

    public interface ISpringAopInterface {
        public void add();
    
        public void delete();
    
        public void update();
    
        public void query();
    }
    

    ②被代理类

    public class SpringAopClass implements ISpringAopInterface {
    
        public SpringAopClass(){
            System.out.println("SpringAopClass 被创建了");
        }
    
        @Override
        public void add() {
            System.out.println("增加");
        }
    
        @Override
        public void delete() {
            System.out.println("删除");
        }
    
        @Override
        public void update() {
            System.out.println("改");
        }
    
        @Override
        public void query() {
            System.out.println("查");
        }
    
    }
    

    ③增强工具类

    package com.mobao.springaop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class Logger {
    
        public void before() {
            System.out.println("before");
        }
    
        public void after() {
            System.out.println("after");
        }
    
        public void afterreturning() {
            System.out.println("afterreturning");
        }
    
        public void afterthrowing() {
            System.out.println("afterthrowing");
        }
    
        public Object around(ProceedingJoinPoint pjp) {
    
            System.out.println("around");
    
            Object rvalue = null;
    
            try {
                Object[] paras = pjp.getArgs();
    
                System.out.println("拦截前");
    
                rvalue = pjp.proceed(paras);
    
                System.out.println("拦截后");
    
                return rvalue;
            }catch (Throwable t){
                throw new RuntimeException(t);
            }finally {
                System.out.println("最终");
            }
        }
    
    }
    
    
    xml文件配置
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <bean id="springAopClass" class="com.mobao.springaop.SpringAopClass"/>
    
        <bean id="logger" class="com.mobao.springaop.Logger"/>
    
    <!--    false 接口动态代理 生成的对象应用接口类型修饰 true 子类动态代理(此时需要cglib第三方库提供支持) 生成的对象应用子类类型修饰-->
        <aop:config proxy-target-class="false">
    
    <!--        配置表达式-->
            <aop:pointcut id="expression" expression="execution(public void com.mobao.springaop.ISpringAopInterface.add())"/>
    
            <aop:pointcut id="updateid" expression="execution(public void com.mobao.springaop.ISpringAopInterface.update())"/>
    
    <!--    <aop:config proxy-target-class="true">-->
    <!--        id 设置id名 ref增强工具类-->
            <aop:aspect id="logAdvice" ref="logger">
    
    <!--            直接使用pointcut 配置表达式-->
                <aop:before method="before" pointcut="execution(public void com.mobao.springaop.ISpringAopInterface.add())"></aop:before>
    
    <!--            使用设置好的表达式-->
                <aop:after-returning method="afterreturning" pointcut-ref="expression"></aop:after-returning>
                <aop:after method="after" pointcut-ref="expression"></aop:after>
    
    <!--            被增强的方法执行报错抛出异常时 会被执行-->
                <aop:after-throwing method="afterthrowing" pointcut-ref="expression"></aop:after-throwing>
    
    <!--            环绕通知 通过环绕通知可细化到具体的方法拦截 详细配置到 增强工具类 around方法查看-->
    <!--            update方法被调用时,logger类的around方法会拦截到该方法-->
                <aop:around method="around" pointcut-ref="updateid"></aop:around>
    
            </aop:aspect>
    
        </aop:config>
    
    </beans>
    
    程序运行代码
    public class SpringAop {
        public static void main(String[] args) {
    //        SpringAopClass springAopClass = new SpringAopClass();
    //        springAopClass.add();
    //        springAopClass.delete();
    //        springAopClass.update();
    //        springAopClass.query();
    
            ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
            Object obj = ac.getBean("springAopClass");
    
    //        <aop:config proxy-target-class="false"> false表示接口动态代理,则生成的对象应用接口类型修饰
            ISpringAopInterface iSpringAopInterface = (ISpringAopInterface)obj;
            iSpringAopInterface.add();
    
            iSpringAopInterface.update();
    
    ////        <aop:config proxy-target-class="true"> true,则生成的对象应用对象类型修饰
    //        SpringAopClass springAopClass = (SpringAopClass)obj;
    //        springAopClass.add();
        }
    }
    
    注解形式的AOP

    1、增强工具类添加注解

    //bean注解
    @Component
    //表示当前类是一个注解类
    @Aspect
    public class Logger {
    
    //    表达式 表示要拦截的方法
        @Pointcut("execution(public void com.mobao.springaop.SpringAopClass.add())")
    //    配置一个方法,在注解后写入
        public void pt(){
    
        }
    
    //    注解拦截方法时,执行方法
        @Before("pt()")
        public void before() {
            System.out.println("before");
        }
    
    //    注解拦截方法时,执行方法
        @After("pt()")
        public void after() {
            System.out.println("after");
        }
    
    //    注解拦截方法时,执行方法
        @AfterReturning("pt()")
        public void afterreturning() {
            System.out.println("afterreturning");
        }
    
    //    注解拦截方法时,执行方法
        @AfterThrowing("pt()")
        public void afterthrowing() {
            System.out.println("afterthrowing");
        }
    
    //    注解拦截方法时,执行方法
    //    @Around("pt()")
        public Object around(ProceedingJoinPoint pjp) {
    
            System.out.println("around环绕通知拦截的方法");
    
            Object rvalue = null;
    
            try {
    //            获取参数
                Object[] paras = pjp.getArgs();
    
                System.out.println("拦截前");
    
    //            执行原方法
                rvalue = pjp.proceed(paras);
    
                System.out.println("拦截后");
    
                return rvalue;
            }catch (Throwable t){
                throw new RuntimeException(t);
            }finally {
                System.out.println("最终");
            }
        }
    
    }
    
    

    2、①xml少许配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <context:component-scan base-package="com.mobao.springaop"></context:component-scan>
    
        <aop:config proxy-target-class="false">
    
        </aop:config>
    <!--    开启spring aop注解支持 如果不用xml文件也可使用配置类表示-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    </beans>
    

    ②配置类

    @Configuration
    @ComponentScan("com.mobao")
    @EnableAspectJAutoProxy
    public class BeanConfigClass {
    }
    

    主要调用方法

            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfigClass.class);
            ISpringAopInterface iSpringAopInterface = (ISpringAopInterface) ac.getBean("springAopClass");
            iSpringAopInterface.add();
    

    相关文章

      网友评论

          本文标题:Spring AOP 初识AOP

          本文链接:https://www.haomeiwen.com/subject/afcegctx.html