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);
}
}
}
运行测试类
目标方法的参数都有了。