基于spring中的aop简单实例讲解

 更新时间:2017年07月12日 08:39:26   投稿:jingxian  
下面小编就为大家带来一篇基于spring中的aop简单实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生。那么骑士只需要关注怎么打仗就好了。而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了。所以可以把诗人当成一个切面,当骑士出征的前后诗人分别负责欢送和写诗歌颂(记录)。而且,这个切面可以对多个骑士或者明人使用,并不只局限于一个骑士。这样,既分离了关注点,也减低了代码的复杂程度。

代码示例如下:

骑士类:

package com.cjh.aop2;

/**
 * @author Caijh
 *
 * 2017年7月11日 下午3:53:19
 */
public class BraveKnight {
 public void saying(){
 System.out.println("我是骑士");
 }
}

诗人类:

package com.cjh.aop2;

/**
 * @author Caijh
 *
 * 2017年7月11日 下午3:47:04
 */
public class Minstrel {
 public void beforSay(){
 System.out.println("前置通知");
 }
 
 public void afterSay(){
 System.out.println("后置通知");
 }
}

spring配置文件:

<?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 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
 <!-- 目标对象 -->
 <bean id="knight" class="com.cjh.aop2.BraveKnight"/>
 <!-- 切面bean -->
 <bean id="mistrel" class="com.cjh.aop2.Minstrel"/>
 <!-- 面向切面编程 -->
 <aop:config>
 <aop:aspect ref="mistrel">
  <!-- 定义切点 -->
  <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
  <!-- 声明前置通知 (在切点方法被执行前调用)-->
  <aop:before method="beforSay" pointcut-ref="embark"/>
  <!-- 声明后置通知 (在切点方法被执行后调用)-->
  <aop:after method="afterSay" pointcut-ref="embark"/>
 </aop:aspect>
 </aop:config>
</beans>

测试代码:

package com.cjh.aop2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author Caijh
 *
 * 2017年7月11日 下午4:02:04
 */
public class Test {
 public static void main(String[] args) {
 ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");
 BraveKnight br = (BraveKnight) ac.getBean("knight");
 br.saying();
 }
}

执行结果如下:

前置通知
我是骑士
后置通知

=====================================================

aop(面向切面编程)的好处就是,当执行了我们主要关注的行为(骑士类对象),也就是切点,那么切面(诗人对象)就会自动为我们进行服务,无需过多关注。如上测试代码,我们只调用了BraveKnight类的saying()方法,它就自己在saying方法前执行了前置通知方法,在执行完saying之后就自动执行后置通知。通过这样我们可以做权限设置和日志处理。

补充:pointcut执行方法书写格式如下

工程目录结构:

如果运行过程中出现nofoundclass的错误,一般是少了:aspectjweaver.jar这个包,需要下载

以上这篇基于spring中的aop简单实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 教你如何正确了解java三大特性!!!!

    教你如何正确了解java三大特性!!!!

    所有的面向对象编程语言的思路都是差不多的,而这三大特性,则是思路中的支柱点,接下来我就重点讲解了一下java三大特性,感兴趣的朋友跟随脚本之家小编一起看看吧
    2021-07-07
  • SpringCloud Gateway加载断言predicates与过滤器filters的源码分析

    SpringCloud Gateway加载断言predicates与过滤器filters的源码分析

    这篇文章主要介绍了SpringCloud Gateway加载断言predicates与过滤器filters的详细过程,本文通过源码给大家解析的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • idea Maven 插件 docker-maven-plugin 打包docker镜像上传到远程仓库的过程详解

    idea Maven 插件 docker-maven-plugin 打包docker镜像上传到远程仓库的过程详解

    这篇文章主要介绍了idea Maven插件docker-maven-plugin打包docker镜像上传到远程仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • JVM代码缓存区CodeCache原理及用法解析

    JVM代码缓存区CodeCache原理及用法解析

    这篇文章主要介绍了JVM代码缓存区CodeCache原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • MyBatis拦截器的实现原理

    MyBatis拦截器的实现原理

    这篇文章主要介绍了MyBatis拦截器的实现原理,Mybatis拦截器并不是每个对象里面的方法都可以被拦截的,其具体内容感兴趣的小伙伴课题参考一下下面文章内容
    2022-08-08
  • 详解Java向服务端发送文件的方法

    详解Java向服务端发送文件的方法

    这篇文章主要为大家详细介绍了Java向服务端发送文件的方法,主要是IO流,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java中的synchronized重量级锁解析

    Java中的synchronized重量级锁解析

    这篇文章主要介绍了Java中的synchronized重量级锁解析,内核需要去申请这个互斥量,必须要进入内核态,也就是这里需要用户态,内核态的切换,状态的切换,开销是比较大的,这就是重型锁的一个弊端,需要的朋友可以参考下
    2024-01-01
  • Java 实现分布式服务的调用链跟踪

    Java 实现分布式服务的调用链跟踪

    分布式服务中完成某一个业务动作,需要服务之间的相互协作才能完成,在这一次动作引起的多服务的联动我们需要用1个唯一标识关联起来,关联起来就是调用链的跟踪。本文介绍了Java 实现分布式服务的调用链跟踪的步骤
    2021-06-06
  • Map映射LinkedHashSet与LinkedHashMap应用解析

    Map映射LinkedHashSet与LinkedHashMap应用解析

    这篇文章主要为大家介绍了Map映射LinkedHashSet与LinkedHashMap的应用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-03-03
  • springMVC不扫描controller中的方法问题

    springMVC不扫描controller中的方法问题

    这篇文章主要介绍了springMVC不扫描controller中的方法问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论