一、实现接口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. poj Corn Fields 状态压缩dp。

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5763   Accepted: 3052 Descr ...

  2. 三、Bean的初始化

    一.使用构造器实例化Bean:这是最简单的方式,Spring IOC容器既能使用默认空构造器也能使用有参构造器两种方式创建bean 空构造器 <bean name="bean1&quo ...

  3. 反汇编调试Android

    https://code.google.com/p/android/issues/detail?id=73076 http://my.unix-center.net/~Simon_fu/?p=527 ...

  4. IE8 td元素 width无效的bug;

    不经意间做项目发现IE的td在某种情况下好奇怪,自己设置的width不起作用: 后经google大法,发现解决方案:已验证过完美解决bug; <table style="width:  ...

  5. HDU4336:Card Collector(min-max容斥)

    题面 传送门 Sol 方法一 直接状压就好了 # include <bits/stdc++.h> # define RG register # define IL inline # def ...

  6. Swiper结合jQuery实现腾讯新闻首页

    今天我们来说一下,Swiper结合jQuery实现的腾讯新闻首页, 咱们先来看一下效果图: 这也是我把PC端缩成移动端来截的图,毕竟是PC端,要是不好看的话请见谅,,,,,,,,,,,,, 然后请允许 ...

  7. 参数化查询为什么能够防止SQL注入 (转)

    很多人都知道SQL注入,也知道SQL参数化查询可以防止SQL注入,可为什么能防止注入却并不是很多人都知道的. 本文主要讲述的是这个问题,也许你在部分文章中看到过这块内容,当然了看看也无妨. 首先:我们 ...

  8. unity3d代码优化标准

    转载自:https://blog.csdn.net/m0_37283423/article/details/84378384 代码优化 ● 尽可能使用for来代替foreach:每次foreach会产 ...

  9. python完全学习笔记

    dir(__builtins__) help(input) 'let\'s go'   #转义字符 \ r'c:\now'       #字符串前加r 自动转义 str= ''' shdiufhi s ...

  10. python wsgi PEP333 中文翻译

    PEP 333 中文翻译 首先说明一下,本人不是专门翻译的,英文水平也不敢拿来献丑.只是这是两年前用python的时候为了自己学习方便而翻译的,记录着笔记自己看看而已.最近翻出来看看觉得还是放出来吧. ...