不懂的可以看上一章博文,分别讲解了动态代理和静态代理具体代码示例
- 需求分析:针对Videoservice接口实现日志打印
- 三个核心包
- spring-aop:AOP核心功能,例如代理工厂
- aspectjweaver:简单理解,支持切入点表达式
- aspectjrt:简单理解,支持aop相关注解
引入相关包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
Step1:定义Service接口和实现类
/**
* 视频对象
*/
public class Video {
private int id;
private String title;
public Video(){}
}
public interface VideoService {
int save(Video video);
Video findById(int id);
}
public class VideoServiceImpl implements VideoService {
public int save(Video video) {
System.out.println("保存video");
return 1;
}
public Video findById(int id) {
System.out.println("根据id查询视频信息");
return new Video();
}
}
Step2:定义横切关注点
/**
* 横切关注点
*/
public class TimeHandler {
public void printBefore(){
System.out.println("printBefore 日志 time="+ LocalDateTime.now().toString());
}
public void printAfter(){
System.out.println("printAfter 日志 time="+ LocalDateTime.now().toString());
}
}
Step3:添加schema AOP约束配置
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"
xmlns:aop="http://www.springframework.org/schema/aop"
Step4:配置bean和aop
<bean id="timeHandler" class="net.jhclass.project.aop.TimeHandler"></bean>
<bean id="viedoService" class="net.jhclass.project.service.VideoServiceImpl"></bean>
<!--
定义aop
-->
<aop:config>
<!--
配置横切关注点
ref:引用横切关注点
-->
<aop:aspect id="timeAspect" ref="timeHandler">
<!--切入点 表达式所有方法-->
<aop:pointcut id="allMethodLogPointCut" expression="execution(* net.jhclass.project.service.VideoService.*(..))"/>
<!--通知 具体通知方法名称-->
<aop:before method="printBefore" pointcut-ref="allMethodLogPointCut"/>
<aop:after method="printAfter" pointcut-ref="allMethodLogPointCut"/>
</aop:aspect>
</aop:config>
可以点开看一下,切入点表达式有没有写错
这里的表达式是全部方法,如果需要指定某个方法,可以这样写
<aop:pointcut id="allMethodLogPointCut" expression="execution(* net.jhclass.project.service.VideoService.save*(..))"/>
Step5:测试
注释的地方没关系
以上的例子就是Spring的AOP配置例子,不复杂