• Spring aop的实现


    对于aop的相关概念的认识

      • 通知,新增处理:  已经定义好的与业务逻辑无关的一些东西,比如安全,日志,事务等。工作内容:通知定义了切面是什么以及什么时候使用。除了描述切面要完成的工 作,通知还解决何时执行这个工作,许多aop框架,包括spring都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链
      • 连接点:  在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。简单来说就是可以接入通知的地方就算是连接点
      • 切点(切入点):  在连接点的基础上定义切点,不一定所有的连接点都要接入通知,而接入通知的地方就叫切点
      • 切面:  切点和通知的组合,通知声明了什么时候干什么,而切点声明了在哪里干
      • 引入:  允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
      • 目标:  被通知的对象,也就是真正的业务逻辑。只专注于本身
      • 织入:  把切面应用到目标对象来创建新的代理对象的过程,有三种织入的方式
      • 目标对象:  项目原始的Java组件。
      • aop代理:  AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

    在spring中通过注解的形式来实现aop的一个小案例

    1. 首先在spring.xml中进行配置
    2. 然后创建一个切面的类
    3. 再创建一个目标类
    4. 最后创建一个测试类进行测试

     我们直接上代码

    1.首先在spring.xml中进行相关的配置

    <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
           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">
    <!--这个是扫描说在fish.aopTest下所有@Component注解的类-->
        <context:component-scan base-package="fish.aopTest" />
    <!--这个是重点,aop是使用JDK代理还是cglib代理-->
        <aop:aspectj-autoproxy proxy-target-class="true" />

    2.配置结束后我们进行编写切面类

    package fish.aopTest;
    //注意不要导错了包
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    //定义这是一个切面组件
    @Aspect
    //用来本spring扫描的,不能少
    @Component
    public class Agent {
    
        //定义一个切点,
        @Pointcut("execution(* fish.aopTest.TestAbc.*(..))")
        public void aTest() {
        }
        /**定义一个通知,在目标执行之后执行这个通知
             其中括号里面的“aTest()”就是上面定义好的切点的方法名,两者需要一致
        */
        @After("aTest()")
        public void after() {
            System.out.println("结束之后");
        }
    
        //定义一个通知,在目标执行之前执行这个通知
        @Before("aTest()")
        public void before() {
            System.out.println("开始之前");
        }
    }

    3.然后我们创建一个目标类

    package fish.aopTest;
    
    import org.springframework.stereotype.Component;
    //括号内的参数可以省略,省略的话就是这个类的类名(首字母小写)
    @Component("computer")
    public class Computer {
    
        public void save(){
            System.out.println("电脑,电脑,便宜的电脑!");
        }
    }

    4.最后我们写个测试类来测试下

    package fish.aopTest;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class ATest  {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext ct = new ClassPathXmlApplicationContext("spring.xml");//这里的spring.xml就是刚刚开始我们配置的xml的路径,不要把路径弄错了
            /*这里getBean()里面的参数就是目标类的@Component()里面的参数*/
            Computer computer= (Computer) ct.getBean("computer");
    computer.save();
    } }

    这样我们的小案例就完成了,然后我们运行看下效果。(就是这么简单)

    开始之前
    电脑,电脑,便宜的电脑!
    结束之后
  • 相关阅读:
    RedGlove 权限管理系统(1)权限概述
    SPQuery查询语法简要说明
    DataGridView使用技巧大全
    实战asp.net MVC+ADO.NET EntityFramework
    RedGlove 权限管理系统(2)功能模块设计
    C# 如果何从线程中操作控件
    PageHelper 类 和 ValidateHelper 类
    字符串帮助类
    XMLHelper 类
    Android中截取当前屏幕的功能
  • 原文地址:https://www.cnblogs.com/xzmr/p/6421140.html
Copyright © 2020-2023  润新知