AOP概念及使用(1)

AOP概念及使用

spring的核心思想是ioc和aop,本文将讲解AOP的部概念及使用

AOP是个啥?

AOP是面向切面编程,是基于动态代理技术的,将动态代理进行了规范升华。
AOP支持jdk的动态代理,也支持cglib动态代理
分解一下:
切面:要增强的功能
连接点:业务方法
切入点:0或多个连接点
通知:也叫增强,即切面的执行时间

一个切面执行需要切入点和通知!

AOP的实现

本文先使用aspectj框架,是单独的做AOP的框架,在spring中也对它进行了集成,我们可以在spring中进行使用

Aspectj有两中方法实现AOP,分为基于注解和xml的方法
我们先介绍使用注解的方法。

我们首先在maven 的pom.xml文件中将aspectj的依赖写入

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>

新建目标方法

public class SomeserviceImpl implements Someservice {
    @Override
    public void doSome() {
        System.out.println("someservice的doSome方法!");
    }
}

新建切面方法

/**
 * 切面类
 */
@Aspect
public class MyAspect {

    @Before(value = "execution(* com.yuyi.serviec.SomeserviceImpl.doSome())")
    public void myBefore(){

        System.out.println("前置通知,在方法执行之前");
    }
}

在切面方法中,我们使用@Apsect标签表示这是切面类,使用@Before表示前置通知,通知方法执行的时间在目标方法之前,本例中在before的value中的切入点表达式为

execution(* com.yuyi.serviec.SomeserviceImpl.doSome())

此切入点表达式必须有返回值类型和和方法名

配置xml文件,将目标类和切面类写出spring依赖

扫描二维码关注公众号,回复: 11245321 查看本文章
<!--    声明目标类-->
    <bean id="someservice" class="com.yuyi.serviec.SomeserviceImpl"/>
<!--    声明切面类-->
    <bean id="myaspect" class="com.yuyi.aspect.MyAspect"/>

<!--    声明自动代理生成器,受用aspectj把spring容器中的目标类对象生成代理-->
    <aop:aspectj-autoproxy/>

运行测试类
在这里插入图片描述
如果目标方法有参数怎么办,我们可修改切入点表达式,将参数类型写入目标方法中,不过需要注意的是引用数据类型,必须使用全限定的类名。

如果我们需要在切面方法中使用目标方法的参数,我们可以这么做
修改之后的目标方法

public class SomeserviceImpl implements Someservice {
    @Override
    public void doSome(String name,int age) {
        System.out.println("someservice的doSome方法!");
    }
}

修改之后的切面方法

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * 切面类
 */
@Aspect
public class MyAspect {

    @Before(value = "execution(* com.yuyi.serviec.SomeserviceImpl.doSome(String,int))")
    public void myBefore(JoinPoint jp){
        System.out.println("前置通知,在方法执行之前");
        System.out.println("连接点方法的定义"+jp.getSignature());
        System.out.println("连接点的方法名称"+jp.getSignature().getName());
        Object obj [] =jp.getArgs();
        for(Object arg:obj){
            System.out.println(arg);
        }
    }
}

运行测试类
在这里插入图片描述
目标方法的参数都有了。

猜你喜欢

转载自blog.csdn.net/qq_39428182/article/details/105771273
今日推荐