在使用AOP之前,首先我们先了解一下什么是AOP吧。在网上很多人将AOP翻译为“面向切面编程”,什么是面向切面?与面向对象有什么区别呢?

在回答这两个问题之前,我们先要明白切面的概念。

切面由切点与增强组成,它既包括了横切逻辑的定义,也包括了连接点的定义,springAOP就是负责实施切面的框架,它将切面定义的横切逻辑

织入到切面所指定的连接点中。

这时候就要问了:什么是切点?什么是增强?

先看个例子,在例子中再为大家一一解释。

例子:在服务行业,热情问好,带人礼貌是每一个成熟的服务员应有的规范。

建立一个接口  Water.java 方法:问好与服务,greetTo(),serviceTo()

package test.aop;
/**
*
* @author 作者: wcy
* @version 创建时间:Mar 3, 2015 4:27:12 PM
* @Description: TODO(一个服务生向顾客问候接待)
*/
public interface Waiter { public void greetTo(String name);
public void serviceTo(String name);
}

那么接下来一个生涩的,训练不足的服务员,他只会生硬的打招呼,这对客人的服务可不好。

建立一个类NativeWater.java

package test.aop.impl;

import test.aop.Waiter;

/**
*
* @author 作者: wcy
* @version 创建时间:Mar 3, 2015 4:29:53 PM
* @Description: TODO(一个训练不足的服务生)
*/
public class NativeWater implements Waiter{ public void greetTo(String name) {
System.out.println("greet to :"+name+"...."); } public void serviceTo(String name) {
System.out.println("service to :"+name+"...."); } }

这样子不好,我们必须对训练不足的服务员进行规范,在打招呼之前先热情问好

package test.aop.impl;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice; /**
*
* @author 作者: wcy
* @version 创建时间:Mar 3, 2015 4:32:39 PM
* @Description: TODO(服务生打招呼前,友好问候别人)
*/
public class GreetingBeforeAdvice implements MethodBeforeAdvice{ public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
String clientName = (String) arg1[0];
System.out.println("How are you ? Mr."+clientName+"~~~~~");
} }

好,已经对其进行规范了,我们就要测试一下:

package test.aop.impl;

import org.junit.Before;
import org.junit.Test;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory; import test.aop.Waiter; /**
*
* @author 作者: wcy
* @version 创建时间:Mar 3, 2015 4:40:14 PM
* @Description: TODO(强制服务生要热情问候顾客)
*/
public class BeforeAdviceTest { private Waiter waiter;
private BeforeAdvice advice;
private ProxyFactory pf; @Before
public void init(){
waiter = new NativeWater();
advice = new GreetingBeforeAdvice();
pf = new ProxyFactory();//Spring工厂提供的代理类
pf.setTarget(waiter); //设置代理目标
pf.addAdvice(advice);//为代理目标添加增强
} @Test
public void test01(){ Waiter proxy = (Waiter) pf.getProxy();
proxy.greetTo("xiaoyu");
proxy.serviceTo("xiaolian");
}
}

运行的结果如下:

How are you ? Mr.xiaoyu~~~~~
greet to :xiaoyu....
How are you ? Mr.xiaolian~~~~~
service to :xiaolian....

好了,这就是一个面向切面的简单例子,那我们就要总结一下了,面向切面需要什么东西。

1、目标类。也就是上文所说的NativeWater.java 该类是一个训练不足的服务生,需要我们对其进行规范,所以要有规范类。

2、增强类。需要实现AOP的前置增强(同样也有后置、环绕等增强),就是规范类,对服务生进行规范。

3、测试类。要为其进行代理,所以要有AOP的代理工厂。

详细的AOP资料,百度很多我就不一一介绍了。

先说一下AOP的执行流程吧。

当我们调用某个定义了AOP的目标类中某个方法时,spring容器会为目标类生成代理类,这生成的方法有2种,一是:jdk的动态代理,使用它必须要有接口;二是CGLib代理,

代理类融合了原类和增强类,它可能与原类具有同样的接口,也可能是原类的子类,所以当我们访问原类的方法的时候,会先访问增强类,再到原类。

好了,以上就说到这。

spring与springmvc整合出现AOP不起作用的原因:

1、spring与springmvc加载配置文件是不同步的,springmvc加载文件对注解进行扫描后,所有的注解都被扫到容器里面,当spring同样加载配置文件扫描注解时,因为容器中已经

存在Service类,那么CGLib代理或jdk动态代理就不对它进行代理了,直接导致了applicationContext.xml中的事务不起作用,出现异常,事务不会滚。

2、解决方法:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,Spring的applicationContext.xml文件中 配置扫描包时,不要包含controller的注解,如下所示:
SpringMVC的xml配置:

	<!--1、 注解探测器,对注解进行扫描 -->
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

同样的,spring的applicationContext.xml配置文件也一样,不要扫描@Controller注解

	 <!-- 注解扫描器 -->
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

工作完成。

Spring AOP实战例子与springmvc整合不起效果的解决办法的更多相关文章

  1. Spring AOP 实战运用

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  2. Spring AOP 学习例子

    http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example     工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大 ...

  3. 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法

    先来看问题    纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...

  4. Spring aop 小例子demo

    由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施.完成学习的小例子. 关于spring-Aop原理:http://m.oschina.net/blog ...

  5. springMVC数据验证出现404错误解决办法

    今天使用springMVC的数据验证的时候,看似很简单的东西,却有一个很大的陷阱:提交空表单的时候总是出现404错误,但是后台却不给你报任何错.遇到这个错误这个很苦恼,搞了几小时,今天记录并分享一下解 ...

  6. Spring MVC page render时jsp中元素相对路径的解决办法

    前段时间做了用Spring Security实现的登录和访问权限控制的功能,但是page render使用的是InternalResourceResolver,即在spring的servlet配置文件 ...

  7. springboot整合mybatis的多数据源解决办法

    最近项目有一个非解决不可的问题,我们的项目中的用户表是用的自己库的数据,但是这些数据都是从一个已有库中迁过来的,所以用户信息都是在那个项目里面维护,自然而然我们项目不提供用户注册功能,这就有个问题,如 ...

  8. Spring Boot 2下使用Feign找不到@EnableFeignClients的解决办法

    最近在实践Spring Boot 2+Spring Cloud(Finchley.M9),在用到Feign的时候发现@EnableFeignClients注解开不了,独立使用Feign是可以的,但就是 ...

  9. spring cloud 学习(9) - turbine stream无法在eureka注册的解决办法

    turbine是啥就不多解释了,初次接触的可以移步spring cloud 学习(4) - hystrix 服务熔断处理 拉到最后看一下,turbine stream默认情况下启动成功后,eureka ...

随机推荐

  1. shutil模块和os模块对比

    一.shutil -- 是一种高层次的文件操作工具类似于高级API,而且主要强大之处在于其对文件的复制与删除操作更是比较支持好. 1.shutil.copy(src,dst)复制一个文件到另一个目录下 ...

  2. CODEFORCES ROUND #740 ANALYSES BY TEAM:RED & BLACK

    A.Alyona and copybooks Problems: 给你一个数n和代价分别为a, b, c.数量不限的1, 2, 3,求将n凑成4的倍数的最小代价 Analysis: cj:取个模随便凑 ...

  3. window下github的学习心得

    准备工作: 安装git: 1.下载地址:http://msysgit.github.io/ 2.安装:本人是一路next的,现在没发现有什么问题.详细的安装过程参考:https://jingyan.b ...

  4. Dom事件流、冒泡、捕获

    Dom事件流 dom的结构是一个倒立的树状结构.当一个html元素触发事件时,事件会在dom的根节点和触发事件的元素节点之间传播,中间的节点都会收到该事件. 捕获:div元素触发事件时,事件先从根节点 ...

  5. 2019.03.28 bzoj3597: [Scoi2014]方伯伯运椰子(01分数规划)

    传送门 题意咕咕咕有点麻烦不想写 思路: 考虑加了多少一定要压缩多少,这样可以改造边. 于是可以通过分数规划+spfaspfaspfa解决. 代码: #include<bits/stdc++.h ...

  6. windowsSevice程序和topshelf程序创建服务对比

    文章原地址:http://www.80iter.com/blog/1451523192435464 Topshelf 创建.net服务整理和安装步骤 windowsService和topshelf服务 ...

  7. 如何理解Unity组件化开发模式

    Unity的开发模式核心:节点和组件,组件可以加载到任何节点上,每个组件都有 gameobject 属性,可以通过这个属性获取到该节点,即游戏物体. 也就是说游戏物体由节点和组件构成,每个组件表示物体 ...

  8. TensorFlow学习笔记1

    1.daocloud 拉取 docker镜像 docker pull daocloud.io/daocloud/tensorflow:latest 镜像位置: /Users/{YourUserName ...

  9. CentOS开启telnet服务

    原文地址:https://blog.csdn.net/zhujiangm/article/details/4540778 服务器:CentOS-5.1(192.168.1.87)客户机:FC6(192 ...

  10. 初见SDN

    软件定义网络(Software Defined Network, SDN ),是一种新型网络架构. SDN=OpenFlow:因为Openflow是大多数人唯一看得到的具体化的SDN的实现形式(实际上 ...