zoukankan      html  css  js  c++  java
  • 简单实现一个切面案例---spring aop

    案例之前,我们先了解一下spring的几个术语

    1、切面(aspect):切面类,里面包含通知方法。

    2、切点(pointcut):又名切点表达式,目标:找到符合条件的方法。

    3、目标(target):被织入的类,目标类。

    4、连接点(join point):目标方法。

    5、通知(advice):切面类的before或其它方法。

    6、aop代理(aopProxy):spring aop的实现就是靠代理来做到的,默认利用jdk代理和cglib代理。

    7、织入(weaving):动词:将切面类的方法和目标类的连接点糅合在一起的过程就叫织入。

    导入需要的依赖:pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>spring-test-taskFour</artifactId>
            <groupId>com.lw</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    <artifactId>mybatis-spring-aop2</artifactId>
    
    <dependencies>
        <!--切面需要的依赖-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!--spring依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
    </project>

    切面类:

    package com.aspect;
    
    public class LogImpl {
        //通知
        public void beforeInsert(){
            System.out.println("beforeInsert as LogImpl");
        }
    }

    目标类:

    package com.target;
    
    public class StudentDaoImpl {
        //此类没有实现接口,所以使用cglib代理的方法创建出aop代理
        //实现接口会使用jdk代理方法创建aop代理
        
        //连接点方法若是加了final修饰符的话,无法创建aop代理
        //连接点
        public void insert(){
            System.out.println("insert as StudentDaoImpl");
        }
    }

    applicationContext.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--先把bean创建出来-->
        <bean id="log" class="com.aspect.LogImpl"></bean>
        <bean id="studentDao" class="com.target.StudentDaoImpl"></bean>
        <!--以aop:config开始配置-->
        <aop:config>
            <!--配置目标类,expression是切点表达式,这里的意思是匹配com.target包
    的StudentDaoImpl类的所有方法,第一个*号的意思是所有方法返回值,包括void-->
            <aop:pointcut id="studentPointcut" expression="execution(* com.target.StudentDaoImpl.*())"/>
            <!--配置切点类-->
            <aop:aspect id="logAspect" ref="log">
                <!--配置连接点,和目标-->
                <aop:before method="beforeInsert" pointcut-ref="studentPointcut"/>
            </aop:aspect>
        </aop:config>
    </beans>

    测试类:

    package com.test;
    
    import com.target.StudentDaoImpl;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestAspect {
    
        @Test
        public void test_Aspect(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            StudentDaoImpl studentDao = context.getBean("studentDao",StudentDaoImpl.class);
            studentDao.insert();
        }
    }

    测试结果:

    BeforeInsert as LogImpl

    insert as StudentDaoImpl

    可以看到我们的连接点方法成功切入了目标类。

  • 相关阅读:
    面试中AOP这样说,面试官只有一个字:服!
    Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
    Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
    C#一些基础知识回顾
    关闭WiN10自动更新和后台程序。
    python脚本显示运行进程
    选择pyqt5理由
    anaconda3下64位python和32位python共存
    爬取百度搜索信息
    python尝试windows在用端口
  • 原文地址:https://www.cnblogs.com/liweixml/p/11789034.html
Copyright © 2011-2022 走看看