一、实现接口MethodBeforeAdvice该拦截器会在调用方法前执行

            实现接口   AfterReturningAdvice该拦截器会在调用方法后执行

            实现接口  MethodInterceptor该拦截器会在调用方法前后都执行,实现环绕结果。

  1. package com.ly.model;
  2. import java.lang.reflect.Method;
  3. import org.aopalliance.intercept.MethodInterceptor;
  4. import org.aopalliance.intercept.MethodInvocation;
  5. import org.springframework.aop.AfterReturningAdvice;
  6. import org.springframework.aop.MethodBeforeAdvice;
  7. public class Advice implements MethodBeforeAdvice,AfterReturningAdvice,MethodInterceptor{
  8. @Override
  9. public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
  10. saveBeforeMessage();
  11. }
  12. @Override
  13. public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
  14. saveAfterMessage();
  15. }
  16. public void saveBeforeMessage(){
  17. System.out.println("调用BeforeAdvice成功");
  18. }
  19. public void saveAfterMessage(){
  20. System.out.println("调用AfterAdvice成功");
  21. }
  22. @Override
  23. public Object invoke(MethodInvocation arg0) throws Throwable {
  24. System.out.println("调用RoundService之前成功");
  25. Object result=arg0.proceed();
  26. System.out.println("调用RoundService之后成功");
  27. return result;
  28. }
  29. }

以下为AOPservice的实现

  1. package com.ly.service.impl;
  2. import com.ly.service.AOPService;
  3. public class AOPServiceImpl implements AOPService{
  4. @Override
  5. public void print(String message) {
  6. System.out.println(message);
  7. }
  8. @Override
  9. public void save() {
  10. System.out.println("保存信息成功");
  11. }
  12. }

以下为配置文件信息

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context.xsd">
  8. <!--目标对象 -->
  9. <bean id="AOPservice" class="com.ly.service.impl.AOPServiceImpl">
  10. </bean>
  11. <!-- advice通知 -->
  12. <bean id="adviceMessage" class="com.ly.model.Advice"></bean>
  13. <!-- 切入点adviser -->
  14. <bean id="adviser" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  15. <property name="advice" ref="adviceMessage"></property>
  16. <!-- pattern的值使用正则表达式精确指定切入点 ,将print方法设为切入点 -->
  17. <property name="pattern"
  18. value="com\.ly\.service\.impl\.AOPServiceImpl\.print"></property>
  19. </bean>
  20. <!-- 代理对象 返回实例是目标对象 target属性指定的AOPservice对象-->
  21. <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
  22. <!-- 设置目标(target)bean为 AOPservice,
  23. 多个bean可以设置list集合如
  24. <property name="interceptorNames">
  25. <list>
  26. <value>advisor</value>
  27. <value>advisor1</value>
  28. </list>
  29. </property>-->
  30. <property name="target">
  31. <ref bean="AOPservice" />
  32. </property>
  33. <!--源码内固定的属性private String[] interceptorNames;  -->
  34. <property name="interceptorNames">
  35. <value>adviser</value>
  36. </property>
  37. </bean>
  38. </beans>

以下为测试类

  1. package com.ly.control;
  2. import java.io.IOException;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import org.springframework.core.io.ClassPathResource;
  6. import org.springframework.core.io.FileSystemResource;
  7. import org.springframework.core.io.Resource;
  8. import org.springframework.core.io.UrlResource;
  9. import com.ly.service.AOPService;
  10. public class SpringTest {
  11. public static void main(String[] args) throws IOException {
  12. ApplicationContext applicationContext=new ClassPathXmlApplicationContext(new String[]{"springBeans.xml"});
  13. AOPService aopservice=  (AOPService) applicationContext.getBean("proxyService");
  14. //由于在springBeans.xml中只配置了 value="com\.ly\.service\.impl\.AOPServiceImpl\.print"适配print方法,没有适配save方法,故只有调用print方法时才会执行advice通知
  15. aopservice.print("调用print成功==========》");
  16. aopservice.save();
  17. }
  18. }

二、在web应用中调用时需要用WebApplicationContext这个来得到Spring配置中的bean类

    1. public class UserAction extends ActionSupport {
    2. private static final Logger log = Logger.getLogger(UserAction.class);
    3. private UserService userService;
    4. public UserService getUserService(){
    5. if(userService == null){
    6. WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getRequest().getServletContext());
    7. userService = (UserService) applicationContext.getBean("proxyService");
    8. //          userService = new UserServiceImpl();
    9. }
    10. return userService;
    11. }

AOP切点切面内容的更多相关文章

  1. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  2. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  3. AOP 日志切面

    AOP把软件的功能模块分为两个部分:核心关注点和横切关注点.业务处理的主要功能为核心关注点,而非核心.需要拓展的功能为横切关注点.AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点进行分 ...

  4. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  5. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  6. Spring AOP 创建切面

        增强被织入到目标类的所有方法中,但是如果需要有选择性的织入到目标类某些特定的方法中时,就需要使用切点进行目标连接点的定位.增强提供了连接点方位信息:如织入到方法前面.后面等,而切点进一步描述织 ...

  7. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  8. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  9. Spring AOP 切点(pointcut)表达式

    这遍文章将介绍Spring AOP切点表达式(下称表达式)语言,首先介绍两个面向切面编程中使用到的术语. 连接点(Joint Point):广义上来讲,方法.异常处理块.字段这些程序调用过程中可以抽像 ...

随机推荐

  1. docker 容器中设置 mysql lampp php软链接

    在容器中安装xampp后,进入到终端,直接输入mysql php 发现报错,命令未被发现.如果输入/opt/lampp/bin/mysql   就可以进入了,所以我们要找到在容器中安装的位置,然后将他 ...

  2. python之from 和import执行过程分析

    原文链接:http://blog.csdn.net/lis_12/article/details/52883729 问题1 同一个目录下,有两个Python文件,A.py,B.py #A.py fro ...

  3. ugui之圆角矩形头像实现

    这个是参考大神的修改了一下渲染方式实现的,可以去查看原帖的,原贴是圆形头像,原理讲的非常详细 点击这里 我写的这个只支持正方形图片,效果是酱紫的~ 一共三个代码,还需要两个代码,原帖里都有的,我只是修 ...

  4. 建造者(生成器)模式C++、Java实现

    1.建造者模式UML 图1. 建造者模式UML 2.C++实现 C++实现类视图: 图2. 建造者模式C++实现的类视图 其中,Product的实现代码是(ProductA和ProductB的代码不再 ...

  5. Error running Tomcat8: Address localhost:1099 is already in use 错误解决

    摘要: 有时候运行web项目的时候会遇到 Error running Tomcat8: Address localhost:1099 is already in use 的错误,导致web项目无法运行 ...

  6. mybatis向数据库插入数据 (传入的是一个实体类)

    /** * 插入用户信息 user为实体类 * @param user */ public int insert( User user); //实体类不用@param标注 //mybatis的xml文 ...

  7. js 两个小括号 ()() 的用法

    实现一个函数fn, 使fn(1)(2)的结果为两个参数的和,刚开始没反应过来,其实细细一想第二个括号就是函数再调用的问题,废话不多说,代码奉上: var fn = function(n) { func ...

  8. 您需要售后返修管理软件的N个理由

    一.减少人工成本. 二.提高工作效率. 三.其他管理成本降低. ▲传统采用人工登记或电子表格Excel管理 售后人员,他们日常的工作就是接件.维修.送修.记录.统计.跟件.寄送件.电话客户沟通.电话厂 ...

  9. 怎么区分odd和even

    odd [ɒd] 和even ['iːv(ə)n] 一个表示奇数.一个表示偶数 经常混淆. 一个记住的好方法: odd是3个字母,单数,所以表示奇数 even是4个字母,所以表示偶数

  10. 如何在 Linux 虚拟机上扩展根文件系统

    问题描述 通过 Azure 平台部署的 Linux 虚拟机默认的根文件系统容量有限,需要进行扩展. 问题分析 由于 Azure 平台部署的 Linux 虚拟机默认根文件系统容量比较小,客户在使用过程中 ...