美文网首页
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