1_Spring Aop 面向切面+路径问题
Springboot如何使用Aspectj实现AOP面向切面编程
Springboot如何使⽤Aspectj实现AOP⾯向切⾯编程⽬录要在 Springboot中声明 AspectJ 切⾯引⼊jar包⽹上也有说要在application.properties中添加最后补充⼀点⼩知识AspectJ ⽀持 5 种类型的通知注解下⾯是我写的⼀些通知的实例⼤家可以参考⼀下要在 Springboot中声明 AspectJ 切⾯需在 IOC 容器中将切⾯声明为 Bean 实例即加⼊@Component 注解;当在 Spring IOC 容器中初始化 AspectJ 切⾯之后, Spring IOC 容器就会为那些与 AspectJ 切⾯相匹配的 Bean 创建代理.在 AspectJ 注解中, 切⾯只是⼀个带有 @Aspect 注解的 Java 类.引⼊jar包⽹上都是说springboot使⽤Aspectj做⾯向切⾯编程的时候,只需要引⼊下⾯jar包依赖即可<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>但是我去编写的时候,单单引⼊ spring-boot-starter-aop 的jar依赖的时候,像@Component、@Aspect等這些註解都不能使⽤,後來發現缺少aspectjweaver 这么个jar包,最后引⼊了下⾯的jar才解決問題<dependency><groupId>aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.3</version></dependency>⽹上也有说要在application.properties中添加spring.aop.auto=true这个配置,才能开启Aspectj注解的扫⾯,但是我去查询了springboot全局配置⽂件,⾥⾯默认配置为true(spring.aop.auto=true # Add @EnableAspectJAutoProxy),所以我没有去做添加,功能没有问题,切⾯能正常实现。
Spring之注解实现aop(面向切面编程)
Spring之注解实现aop(⾯向切⾯编程)1:Aop(aspect object programming)⾯向切⾯编程,名词解释:1.1:功能:让关注点代码与业务逻辑代码分离1.2:关注点重复代码就叫做关注点1.3:切⾯关注点形成的类,就叫做切⾯(类)⾯向切⾯编程,就是指对很多功能都有的重复代码抽取,再在运⾏的时候往业务⽅法上动态植⼊"切⾯类代码";1.4:切⼊点执⾏⽬标对象⽅法,动态植⼊切⾯代码可以通过切⼊点表达式,指定拦截那些类的那些⽅法,给指定的类在运⾏的时候植⼊切⾯类代码;2:注解⽅式实现aop编程2.1:开发步骤(1):先引⼊aop相关的jar⽂件spring-aop-3.2.5.RELEASE.jar【去spring3.2源码⾥⾯找】aopalliance.jar【去spring2.5源码/lib/aopalliance⽂件⾥⾯找】aspectjweaver.jar【去spring2.5源码/lib/aspectj⽂件⾥⾯找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】aspectjrt.jar【去spring2.5源码/lib/aspectj⽂件⾥⾯找】或者【aspectj-1.8.2/lib/aspectjrt.jar】 《注意:⽤到的spring2.5版本的jar本舰,如果⽤jd1.7版本可能会出现问题,需要升级以下aspectj组件,即使⽤aspectj-1.8.2版本中提供的jar⽂件aspectjweaver.jar和aspectjrt.jar》(2)bean.xml中引⼊aop名称空间 技巧:找到⽂件spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle 打开index.html搜索xmlns:aop然后找到下⾯红⾊三句话,分别拷贝到bean.xml中 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/aop /schema/aop/spring-aop.xsd"> 拷贝之后的bean.xml如下所⽰:1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:p="/schema/p"5 xmlns:context="/schema/context"6 xmlns:aop="/schema/aop"7 xsi:schemaLocation="8 /schema/beans9 /schema/beans/spring-beans.xsd10 /schema/context11 /schema/context/spring-context.xsd12 /schema/aop13 /schema/aop/spring-aop.xsd">1415</beans> (3):bean.xml中开启aop注解扫描,如下配置所⽰:1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:p="/schema/p"5 xmlns:context="/schema/context"6 xmlns:aop="/schema/aop"7 xsi:schemaLocation="8 /schema/beans9 /schema/beans/spring-beans.xsd10 /schema/context11 /schema/context/spring-context.xsd12 /schema/aop13 /schema/aop/spring-aop.xsd">1415<!-- 开启注解扫描 -->16<context:component-scan base-package="com.bie.aop"></context:component-scan>1718<!-- 开启aop注解⽅式,默认为false -->19<aop:aspectj-autoproxy></aop:aspectj-autoproxy>2021</beans> (4):开始写⼀个切⾯类,源码如下所⽰:1package com.bie.aop;23import ng.annotation.After;4import ng.annotation.Aspect;5import ng.annotation.Before;6import ng.annotation.Pointcut;7import ponent;8910/**11* @author BieHongLi12* @version创建时间:2017年3⽉28⽇下午9:10:4313* @Aspect:指定当前类为切⾯类14*/15 @Component //加⼊到IoC容器16 @Aspect //指定当前类为切⾯类17public class Aop {1819//指定切⼊点表达式,拦截那些⽅法,即为那些类⽣成代理对象20//@Pointcut("execution(* erDao.save(..))") ..代表所有参数21//@Pointcut("execution(* erDao.*())") 指定所有的⽅法22//@Pointcut("execution(* erDao.save())") 指定save⽅法2324 @Pointcut("execution(* erDao.*(..))")25public void pointCut(){2627 }2829 @Before("pointCut()")30public void begin(){31 System.out.println("开启事务");32 }3334 @After("pointCut()")35public void close(){36 System.out.println("关闭事务");37 }3839 } (5):写好切⾯类就可以写执⾏⽬标对象⽅法,接⼝和实现类如下所⽰: 1package com.bie.aop;23/**4* @author BieHongLi5* @version创建时间:2017年3⽉28⽇下午9:09:296*7*/89public interface IUserDao {1011public void save();12 }1package com.bie.aop;234import ponent;56/**7* @author BieHongLi8* @version创建时间:2017年3⽉28⽇下午9:09:539* ⽬标对象10*/11 @Component12public class UserDao implements IUserDao{1314 @Override15public void save() {16 System.out.println("..核⼼业务--核⼼业务..");17 }181920 } (6):最后就可以进⾏进⾏测试了,源码如下所⽰:1package com.bie.aop;23import org.junit.Test;4import org.springframework.context.ApplicationContext;5import org.springframework.context.support.ClassPathXmlApplicationContext;67/**8* @author BieHongLi9* @version创建时间:2017年3⽉28⽇下午9:13:1810*11*/12public class AopTest {1314 ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");1516//⽬标对象有实现接⼝,spring会⾃动选择"jdk代理【动态代理】"17//动态代理的标识:class com.sun.proxy.$Proxy1018 @Test19public void test01(){20 IUserDao dao = (IUserDao) ac.getBean("userDao");21 System.out.println(dao.getClass());22 dao.save();23 }242526//class com.bie.aop.OrderDao$$EnhancerByCGLIB$$4952a60a27//⽬标对象没有实现接⼝,spring会⽤"cglib代理哦"28 @Test29public void testCglib(){30 OrderDao dao = (OrderDao) ac.getBean("orderDao");31 System.out.println(dao.getClass());32 dao.save();33 }34 } 3:⼼得体会和报错解决: 3.1:虽然案例很简单很简单,但是我花了三四个⼩时,为什么呢!我⽤junit测试spring写的注解实现aop(⾯向切⾯编程)。
aop切面 类注解
aop切面类注解AOP(Aspect Oriented Programming)是一种编程范式,用于解决传统面向对象编程中的一些难题,比如横切关注点(cross-cutting concerns)的复用和统一管理。
AOP的核心思想是将程序的功能划分为核心业务逻辑和横切关注点两部分,通过对横切关注点的抽象和封装,实现对核心业务逻辑的解耦和复用。
在Spring框架中,AOP是一个重要的组成部分,通过切面(Aspect)和通知(Advice)两个核心概念,实现面向切面编程(Aspect Oriented Programming)。
切面定义了横切关注点的逻辑,通知定义了在何时、何地执行切面的逻辑。
通过在Spring容器中声明切面和通知的关系,可以实现在程序运行过程中动态地将横切关注点织入到核心业务逻辑中。
除了使用XML配置文件外,Spring还提供了基于注解的AOP支持,其中最常用的是@Aspect注解。
通过在切面类上添加@Aspect注解,再结合@Pointcut、@Before、@After、@Around等注解,可以实现对横切关注点的定义和精确控制。
相比XML配置文件,基于注解的AOP配置更加简洁和直观,易于理解和维护。
使用AOP切面类注解的方式,可以有效提高代码的可维护性和扩展性。
通过将横切关注点的逻辑抽象为切面类,实现对核心业务逻辑的解耦,提高了代码的模块化程度。
同时,AOP还可以实现一些通用的功能,比如日志记录、性能监控、事务管理等,从而减少了重复代码的编写,提高了开发效率。
然而,需要注意的是,在使用AOP切面类注解时,应该遵循一些原则和规范。
首先,切面类的命名应该具有描述性,能够清晰地表达其功能和作用。
其次,切面类的方法应该遵循一定的命名规范,以便其他开发人员能够快速理解其用途。
最后,切面类的通知方法应该尽量保持简洁和高效,避免引入过多的业务逻辑,以免影响程序的性能和可维护性。
总的来说,AOP切面类注解是一种强大的编程技朧,能够有效地解决传统面向对象编程中的一些难题。
spring aop 原理
spring aop 原理Spring AOP(面向切面编程)是Spring框架的一个核心模块,用于提供在方法执行前、后、抛出异常等关键节点进行拦截的能力。
它通过使用动态代理机制,在运行时将切面逻辑织入到目标对象的方法中,从而实现对目标方法的增强。
Spring AOP的实现原理主要基于Java的动态代理机制。
当我们在配置文件中定义了一个切面时,Spring容器会根据该配置信息生成一个代理对象,该代理对象包装了目标对象,并且在目标对象的相应方法执行前、后等关键节点执行切面的逻辑。
这样一来,我们就可以通过配置的方式将切面逻辑与目标对象进行解耦,从而实现对目标方法的增强。
具体而言,Spring AOP主要通过以下几个步骤实现:1. 定义切面:切面是对一系列连接点和切点的描述,用于定义切面逻辑。
通常,我们可以通过使用注解或XML配置来定义切面。
2. 定义通知(Advice):通知是切面逻辑的具体实现,包括方法执行前、方法执行后等不同的拦截点。
Spring AOP提供了以下几种类型的通知:前置通知(Before Advice)、后置通知(After Advice)、返回通知(After Returning Advice)、抛出异常通知(After Throwing Advice)以及环绕通知(Around Advice)。
3. 定义切点:切点是我们希望在目标方法中执行切面逻辑的特定位置。
我们可以通过使用注解或XML配置来定义切点,将切点与具体的目标方法关联起来。
4. 生成代理对象:当Spring容器启动时,会根据配置信息自动在运行时生成代理对象。
该代理对象将切面逻辑织入到目标对象的方法中,从而实现对目标方法的增强。
5. 执行增强逻辑:在目标方法被调用时,代理对象会根据切点的定义,执行相应的切面逻辑。
例如,在方法执行前,代理对象会首先执行前置通知,然后执行目标方法,最后执行后置通知等等。
总之,Spring AOP的原理是基于动态代理机制,通过生成代理对象并将切面逻辑织入到目标方法中,实现对目标方法的增强。
spring面试题 对di , aop概念的理解
什么是AOP?面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring 中主要表现为两个方面1.面向切面编程提供声明式事务管理2.spring支持用户自定义的切面面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:1.各个步骤之间的良好隔离性2.源代码无关性什么是DI机制?依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。
但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。
创建被调用者的工作由spring来完成,然后注入调用者因此也称为依赖注入。
spring以动态灵活的方式来管理对象,注入的两种方式,设置注入和构造注入。
设置注入的优点:直观,自然构造注入的优点:可以在构造器中决定依赖关系的顺序。
spring 的优点都有哪些?1.降低了组件之间的耦合性,实现了软件各层之间的解耦2.可以使用容易提供的众多服务,如事务管理,消息服务等3.容器提供单例模式支持4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能5.容器提供了众多的辅助类,能加快应用的开发6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等7.spring属于低侵入式设计,代码的污染极低8.独立于各种应用服务器9.spring的DI机制降低了业务对象替换的复杂性10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部。
aop切面不符合条件返回结果
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在提高软件的模块性和可维护性。
通过将横切关注点(cross-cutting concerns)从核心业务逻辑中分离出来,AOP允许开发人员专注于关键的业务逻辑,同时将共同的关注点(比如日志、性能监控等)模块化处理。
然而,有时候AOP切面可能会不符合条件返回结果。
这种情况可能源自于切面编程的不严谨,也可能是由于业务逻辑的复杂性导致的边界情况。
在本文中,我们将从简单到复杂,由浅入深地探讨AOP切面不符合条件返回结果的原因和解决方案。
1. 切面编程基础我们需要了解AOP切面编程的基础知识。
AOP主要通过切面、连接点和通知来实现对横切关注点的处理。
切面是一组连接点和通知的集合,连接点是在应用执行过程中可以插入切面的点,而通知则是切面在特定连接点执行的动作。
AOP允许我们在不改变原有代码的情况下,通过切面处理特定的关注点。
2. 切面不符合条件返回结果的原因当我们使用AOP切面处理特定关注点时,有时会遇到切面不符合条件返回结果的情况。
这可能是由于切面逻辑本身的问题,比如条件判断不够严谨、业务场景覆盖不够全面等。
另外,业务逻辑的复杂性可能会导致一些边界情况被忽略,从而使得切面无法正确返回预期结果。
3. 解决方案针对切面不符合条件返回结果的问题,我们可以采取一些解决方案来解决。
我们需要仔细审视切面的逻辑,确保条件判断和业务场景覆盖的全面性。
如果可能,可以通过单元测试等手段来验证切面在各种情况下的表现。
另外,对于复杂的业务逻辑,我们可以尝试将切面的作用范围缩小,以减少意外情况的发生。
4. 个人观点和理解就我个人而言,AOP切面不符合条件返回结果的情况并不罕见。
在实际开发中,由于业务逻辑的复杂性和多变性,很容易出现一些边界情况被忽略或者条件判断不够严谨的情况。
我认为在使用AOP切面时,我们需要更加谨慎和严谨,确保切面能够在各种情况下正确返回预期结果。
Spring:SpringAop配合自定义注解实现切面编程
Spring:SpringAop配合⾃定义注解实现切⾯编程此⽂章只作为笔记记录,不作为讲解⽂章。
1. SpringAop简介传统的OOP开发中的代码逻辑是⾃上⽽下的,⽽这些过程会产⽣⼀些横切性问题,这些横切性的问题和我们的主业务逻辑关系不⼤,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。
AOP是处理⼀些横切性问题,AOP的编程思想就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的⽬的。
SpringAop的应⽤场景⽇志记录权限验证效率检查事务管理exception2. 依赖包引⼊//SpringBoot项⽬引⼊Aop依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.1.5.RELEASE</version></dependency>//Spring项⽬引⼊Aop依赖<!-- springAop依赖包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.4.RELEASE</version></dependency><!-- springAop依赖Aspect的语法标准包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.7.RELEASE</version></dependency>3. Aop实现⽰例项⽬结构3.1 定义依赖注⼊扫描器AppConfig配置类package com.java.study.config;import ponentScan;import org.springframework.context.annotation.EnableAspectJAutoProxy;//扫描注解@ComponentScan("com.java.study")//开启Aop,默认为false(JDK代理模式) true(Cglib模式)// (this) JDK代理时,指向接⼝和代理类proxy,cglib代理时指向接⼝和⼦类(不使⽤proxy)@EnableAspectJAutoProxy(proxyTargetClass = true)public class AppConfig {}3.2 ⾃定义service⽅法TestService测试⽅法类package com.java.study.service;import ponent;@Component("testService")public class TestService {public void Test1(){System.out.println("这是测试⽅法 test1 ......");}}3.3 定义切⾯类TestAdvice切⾯类package com.java.study.aspect;import com.java.study.custom.KthLog;import ng.JoinPoint;import ng.ProceedingJoinPoint;import ng.annotation.*;import ponent;import java.util.logging.Logger;@Component@Aspectpublic class TestAdvice {private final static Logger logger = Logger.getLogger("TestAdvice.class");// @annotation匹配的是⾃定义注解所标注的⽅法@Pointcut("@annotation(com.java.study.custom.KthLog)")public void loggerMother(){}@Pointcut("execution(* com.java.study..*())")public void loggerMother2(){}@Pointcut("execution(* com.java.study.*(ng.String))")public void loggerMother3(){}@Before("loggerMother() && @within(log)")public void Before(JoinPoint pointcut, KthLog log){System.out.println(" ⽅法名:"+ pointcut.getSignature().getName() +"⽇志输出:"+log.value());}@After("loggerMother2()")public void Before(){System.out.println(" 测试增强⽅法。
Spring框架——AOP(面向切面编程)详解
Spring框架——AOP(⾯向切⾯编程)详解1 AOP概述●AOP(Aspect-Oriented Programming,⾯向切⾯编程):是⼀种新的⽅法论,是对传统 OOP(Object-Oriented Programming,⾯向对象编程)的补充。
●AOP编程操作的主要对象是切⾯(aspect),⽽切⾯模块化横切关注点。
●在应⽤AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应⽤在哪⾥,以什么⽅式应⽤,并且不必修改受影响的类。
这样⼀来横切关注点就被模块化到特殊的类⾥——这样的类我们通常称之为“切⾯”。
●AOP的好处:○每个事物逻辑位于⼀个位置,代码不分散,便于维护和升级○业务模块更简洁,只包含核⼼业务代码2 AOP术语2.1 横切关注点 从每个⽅法中抽取出来的同⼀类⾮核⼼业务。
(抽离到⽅法中处理⾮核⼼业务)2.2 切⾯(Aspect) 封装横切关注点信息的类,每个关注点体现为⼀个通知⽅法。
2.3 通知(Advice) 切⾯必须要完成的各个具体⼯作2.4 ⽬标(Target) 被通知的对象2.5 代理(Proxy) 向⽬标对象应⽤通知之后创建的代理对象2.6 连接点(Joinpoint) 横切关注点在程序代码中的具体体现,对应程序执⾏的某个特定位置。
例如:类某个⽅法调⽤前、调⽤后、⽅法捕获到异常后等。
在应⽤程序中可以使⽤横纵两个坐标来定位⼀个具体的连接点:2.7 切⼊点(pointcut): 定位连接点的⽅式。
每个类的⽅法中都包含多个连接点,所以连接点是类中客观存在的事物。
如果把连接点看作数据库中的记录,那么切⼊点就是查询条件——AOP可以通过切⼊点定位到特定的连接点。
切点通过org.springframework.aop.Pointcut 接⼝进⾏描述,它使⽤类和⽅法作为连接点的查询条件。
3 AspectJ3.1 简介AspectJ:Java社区⾥最完整最流⾏的AOP框架。
PHP之AOP面向切面编程原理(1)
PHP之AOP面向切面编程原理(1)PHP之AOP面向切面编程原理(1)AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它的主要目的是提供一种机制来解耦系统中的横切关注点(Cross-cutting Concerns),例如日志、安全和事务管理等。
AOP通过在关注点和核心业务逻辑之间插入特定的代码来实现这种解耦。
在AOP中,系统被模块化为各个功能单元,每个单元称为一个切面(Aspect)。
切面定义了一个关注点的横切规则,它描述了在何处和何时插入代码来处理特定关注点的动作。
例如,在日志切面中,我们可以定义在每个方法执行之前或之后记录日志的行为。
AOP的实现依赖于一种称为切面织入(Aspect Weaving)的技术。
切面织入通过将切面的代码插入到应用程序中的特定位置,来实现关注点的解耦。
切面织入可以在编译时、加载时或运行时进行。
在AOP中,切面织入的主要方式有以下几种:无论是哪种织入方式,都需要一个切点(Pointcut)来指定在何处插入切面代码。
切点是一种表达式,它定义了在应用程序中匹配特定连接点(Join Point)的规则。
连接点是在应用程序执行过程中可能被切面织入的位置,例如方法调用、方法返回或异常抛出等。
一旦切面代码被织入到应用程序中,它们可以被称为通知(Advice)。
通知定义了在连接点上执行的动作,例如在方法调用之前记录日志、在方法返回之后清理资源等。
1. 前置通知(Before Advice):在连接点之前执行的通知。
2. 后置通知(After Advice):在连接点之后执行的通知。
3. 返回通知(After Returning Advice):在连接点返回结果之后执行的通知。
4. 异常通知(After Throwing Advice):在连接点抛出异常之后执行的通知。
5. 环绕通知(Around Advice):在连接点之前和之后执行的通知,可以完全控制连接点的执行。
使用Spring进行面向切面编程(AOP)
使用Spring进行面向切面编程(AOP)6.1. 简介面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
除了类(classes)以外,AOP提供了切面。
切面对关注点进行模块化,例如横切多个类型和对象的事务管理。
(这些关注点术语通常称作横切(crosscutting)关注点。
)Spring的一个关键的组件就是AOP框架。
尽管如此,Spring IoC容器并不依赖于AOP,这意味着你可以自由选择是否使用AOP,AOP提供强大的中间件解决方案,这使得Spring IoC容器更加完善。
Spring 2.0 AOPSpring 2.0 引入了一种更加简单并且更强大的方式来自定义切面,用户可以选择使用基于模式(schema-based)的方式或者使用@AspectJ注解。
这两种风格都完全支持通知(Advice)类型和AspectJ的切入点语言,虽然实际上仍然使用Spring AOP进行织入(Weaving)。
本章主要讨论Spring 2.0对基于模式和基于@AspectJ的AOP支持。
请查阅"AOP声明风格的选择"一节获取为你的应用选择适当的声明风格的建议。
Spring 2.0完全保留了对Spring 1.2的向下兼容性,下一章将讨论Spring 1.2 API所提供的底层的AOP支持。
Spring中所使用的AOP:提供声明式企业服务,特别是为了替代EJB声明式服务。
最重要的服务是声明性事务管理(declarative transaction management),这个服务建立在Spring的抽象事务管理(transaction abstraction)之上。
允许用户实现自定义的切面,用AOP来完善OOP的使用。
这样你可以把Spring AOP看作是对Spring的一种增强,它使得Spring可以不需要EJB就能提供声明式事务管理;或者也可以使用Spring AOP框架的全部功能来实现自定义的切面。
Spring中的面向切面编程
1 / 5一.为什么要面向切面编程(Aspect Oriented Programming ),或者说为什么要用切面?想象这样一个场景:一个项目起初开发的时候没有考虑日志功能,而是在最后想为每个业务方法加上记录日志的功能。
如果遇到这样的情况,是不是真的要重新编写每一个业务方法,给它们加上日志功能呢?如果这样还不能说明面向切面编程的必要性,那么在考虑一个场景:一个项目由两个项目组完成,A 组负责的是业务方法,B 组负责的是加一些日志、安全、事务、缓存等额外功能,B 组拿到的是A 组已经编译好了的类文件,这时再想修改源代码很显然是不显示的了。
而面向切面编程就可以解决这样的问题。
面向切面编程(简称AOP )的目标:1.把横切关注点从业务逻辑中分离,独立模块化2.在不改变现有代码的前提下,动态的添加功能二.Spring 框架中如何使用AOP ?方法一:Spring 经典的AOP 实现1.实现MethodInceptor接口,在其invoke()方法中定义行为(Advice )2.使用ProxyFactoryBean生成代理<bean id=factoryBeanclass=org.springframework.aop.framework.ProxyFactoryBean><property name=target ref=”目标对象”></property><property name=interceptorNames>2 / 5<list>切面列表</list> </property> </bean> 方法二:利用Spring 提供的自动代理生成器自动代理生成器其实是在方法一的基础上再次封装,为我们提供了更强大的功能,同时操作也更方便。
特点:完全基于XML 配置;能够使用AspectJ的切点表达式。
示例:1.配置文件中添加aop命名空间,完整的根节点定义如下:<beans xmlns=http: xmlns: aop=http: xmlns: xsi=http: xsi: schemaLocation=http:http:3 / 5</beans> 2.添加如下配置:<aop: config> <aop:pointcut id=pcexpression=within(选择要切的类)/> <aop:aspect ref=切面> <aop:beforepointcut-ref=pc method=切面中的方法/> </aop: aspect></aop: config> 除了aop:before外,还有多种Advicebefore 表示切面在切点之前;after-returning 表示切点方法执行完毕成功返回后执行切面方法;after-throwing 表示切点方法抛出异常时执行切面方法;4 / 5after 表示无论切点方法是否成功返回,都执行切面方法;around 表示切点方法执行期间执行切面方法,也就是自定义执行顺序。
SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决
SpringMVC记录我遇到的坑_AOP注解⽆效,切⾯不执⾏的解决AOP注解⽆效,切⾯不执⾏的解决想做⼀个api请求⽇志,想到使⽤aop,配置过程中遇到了⼀个坑,aop不起作⽤,我的aop是这样的:package com.ljwm.ibei.aspact;import ng.ProceedingJoinPoint;import ng.annotation.Around;import ng.annotation.Aspect;import ng.annotation.Before;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Configuration;import ponent;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/*** Created by user on 2017/9/8.*/@Aspect@Configurationpublic class ApiRequestLog {private Logger _log = LoggerFactory.getLogger(ApiRequestLog.class);@Around("execution(* com.ljwm.ibei.controller.*.*(..))")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {RequestAttributes ra = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra = (ServletRequestAttributes) ra;HttpServletRequest request = sra.getRequest();String url = request.getRequestURL().toString();String method = request.getMethod();String uri = request.getRequestURI();String queryString = request.getQueryString();_log.debug("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);Object result = pjp.proceed();return result;}}配置⽂件分成applicationContext.xml、applicationContext-mvc.xml还有mybatis和shiro的web.xml配置:<web-app xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>spring-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring-dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext*.xml</param-value></context-param><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener><listener><listener-class>com.ljwm.ibei.listener.ContextFinalizer</listener-class></listener></web-app>我把<aop:aspectj-autoproxy proxy-target-class="true"/>写在applicationContext中,把<context:component-scan> 和<mvc:annotation-driven>写在applicationContext-mvc中,发现aop没有执⾏,后来经过尝试发现,因为在初始化DispatchServlet的时候加载了mvc的配置,但是aop的代理却没有加载,导致其不能执⾏,我猜测是因为spring默认bean是单例的,对已经初始化的bean容器不在做后续处理,由于是先加载的mvc所以是aop失效,我把aop代理的那个放到mvc中,aop就能执⾏了,不知道我的猜测对不对,还望⼤神赐教另⼀个问题:springmvc在controller层使⽤aop切⾯不成功解决需要在配置⽂件中加⼊<aop:aspectj-autoproxy proxy-target-class="true" />以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Spring框架中的AOP编程与切面设计规范
Spring框架中的AOP编程与切面设计规范在Spring框架中,AOP(面向切面编程)是一个重要的概念,能够有效地实现横切关注点的功能,并且提高了代码的复用性和可维护性。
在AOP编程中,切面起着至关重要的作用,它定义了在何时、何地执行代码,以及在执行前后需要做哪些操作。
因此,在设计切面时,需要遵循一定的规范和最佳实践,以确保系统的稳定性和可扩展性。
首先,切面的设计应该符合单一职责原则。
每个切面应该只关注一个横切关注点,而不要试图将多个不同的功能混合在一个切面中。
这样可以使得切面的功能更加清晰明了,易于维护和拓展。
同时,避免在切面中引入过多的业务逻辑和复杂的业务流程,保持切面简洁高效。
其次,切面的设计应该遵循开闭原则。
即切面应该对修改封闭,对扩展开放。
当需求发生变化时,可以通过新增新的切面来实现新的功能,而不是修改现有的切面。
这样可以保持系统的稳定性,避免引入不必要的风险。
另外,需要注意切面的优先级和执行顺序。
在Spring框架中,切面可以通过@Order注解来指定优先级,数值越小,优先级越高。
如果多个切面存在执行顺序冲突的情况,可以通过@Order注解来明确执行顺序,确保切面按照设计要求顺序执行。
此外,切面的切入点也是设计切面时需要考虑的重要因素。
切入点定义了切面将在何处执行代码,可以是某个类的所有方法,也可以是某个特定方法。
合理定义切入点可以提高切面的精确性和效率,避免不必要的性能开销。
最后,切面的异常处理也是切面设计中需要重点关注的问题。
在AOP编程中,可能会遇到各种异常情况,如空指针异常、数据库连接异常等。
因此,需要在切面中进行异常处理,合理捕获和处理异常,确保系统的稳定性和可靠性。
总的来说,在Spring框架中设计AOP切面时,需要遵循单一职责原则,开闭原则,注意切面的优先级和执行顺序,合理定义切入点,以及重点关注异常处理。
只有遵循这些规范和最佳实践,才能设计出高效,稳定,可维护的AOP切面,提升系统的性能和可扩展性。
aop切面指定方法
AOP切面指定方法什么是AOP(Aspect-Oriented Programming)切面编程AOP(Aspect-Oriented Programming)切面编程是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从主业务逻辑中分离出来,以提高代码的可维护性和可重用性。
传统的面向对象编程(OOP)强调将功能划分为对象,而AOP则将功能划分为切面。
在AOP中,切面是一个模块化的单元,用于将横切关注点(如日志记录、事务管理、权限控制等)与主业务逻辑分开。
通过将这些横切关注点从主业务逻辑中分离出来,可以提高代码的可读性和可维护性,并降低代码的重复性。
AOP切面的作用AOP切面可以在目标方法的执行前、执行后或抛出异常时执行一些额外的逻辑。
例如,可以在方法执行前记录日志,方法执行后进行性能监控,或在方法抛出异常时进行异常处理。
AOP切面可以用于以下场景:1.日志记录:可以在方法执行前后记录方法的输入参数、输出结果和执行时间,以便进行调试和性能优化。
2.事务管理:可以在方法执行前开启事务,在方法执行后提交或回滚事务,以确保数据的一致性和完整性。
3.权限控制:可以在方法执行前进行权限校验,以确保只有具有相应权限的用户可以执行该方法。
4.异常处理:可以在方法抛出异常时进行统一的异常处理,例如记录异常日志、发送警报或返回友好的错误信息。
AOP切面的实现方式在Java中,AOP切面可以通过以下几种方式来实现:1.基于代理的AOP:基于代理的AOP是通过创建目标对象的代理对象来实现的。
代理对象在调用目标方法之前或之后执行切面逻辑。
常见的基于代理的AOP框架有Spring AOP和AspectJ(可以与Spring集成)。
2.基于字节码增强的AOP:基于字节码增强的AOP是通过在目标类的字节码中插入切面逻辑来实现的。
这种方式通常需要使用特定的字节码增强工具,如AspectJ或Javassist。
springaop的原理及常见应用
Spring AOP的原理及常见应用概述Spring AOP(Aspect-Oriented Programming)是一种面向切面编程的技术,可以在应用的不同层次上定义和管理软件系统的横切关注点。
它通过在不修改原有代码的情况下,向往常的业务流程中插入额外的行为逻辑,从而达到对系统进行功能增强或横切逻辑的复用。
原理Spring AOP的原理基于动态代理技术和反射机制。
它通过运行时创建代理对象,将切面逻辑织入到目标对象中,在目标对象的方法执行前、后或异常时执行切面代码,实现额外的行为。
Spring AOP主要通过以下两种方式来实现切面逻辑的织入:1. 基于动态代理:使用JDK动态代理或CGLIB来生成代理对象,并将切面逻辑织入到代理对象中。
2. 基于字节码提前增强:通过继承或重写目标方法的方式,在目标类加载时,通过工具将切面逻辑编织入字节码中。
常见应用Spring AOP提供了一种简洁灵活的方式来应用切面逻辑,常见的应用包括:1. 日志记录通过切面逻辑,在方法执行前后记录日志信息,可以帮助我们追踪应用的执行流程,以及定位潜在的问题。
2. 安全校验在方法执行前进行身份认证和权限校验,确保只有授权用户才能访问敏感操作或受限资源。
3. 事务管理通过在方法执行前后进行事务开启、提交、回滚操作,可以保证数据库操作的一致性和可靠性。
4. 缓存处理在方法执行前先查询缓存,如果有缓存则直接返回结果,避免了不必要的数据库查询,提高系统性能。
5. 异常处理通过捕获方法执行过程中的异常,并进行统一处理,可以实现全局的异常日志记录、错误信息转换等。
6. 性能监控在方法执行前后记录方法的执行时间,并统计次数,从而对系统的性能进行监控和分析。
7. 限流熔断通过在方法执行前进行限流计数和熔断措施,可以保护系统免受恶意攻击或突发高并发请求的影响。
8. 动态路由通过切面逻辑实现动态的路由策略,可以根据业务需要将请求转发到不同的服务实例或集群。
Spring-aop实现切面的四种方式上篇
Spring-aop实现切面的四种方式上篇Spring实现AOP的4种方式先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用。
描述了切面要完成的工作和何时需要执行这个工作。
2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,spring中允许我们方便的用正则表达式来指定4.切面(Aspect)通知和切入点共同组成了切面:时间、地点和要发生的“故事”5.引入(Introduction)引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)6.目标(Target)即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事(AOP让他做爱做的事)7.代理(proxy)应用通知的对象,详细内容参见设计模式里面的代理模式8.织入(Weaving)把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:(1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术Spring提供了4种实现AOP的方式:1.经典的基于代理的AOP2.@AspectJ注解驱动的切面3.纯POJO切面4.注入式AspectJ切面首先看经典的基于代理的AOP:Spring支持五种类型的通知:Before(前) org.apringframework.aop.MethodBeforeAdvice After-returning(返回后) org.springframework.aop.AfterReturningAdviceAfter-throwing(抛出后) org.springframework.aop.ThrowsAdviceArround(周围) org.aopaliance.intercept.MethodInterceptor Introduction(引入) org.springframework.aop.IntroductionInterceptor值的说明的是周围通知,他是由AOP Alliance中的接口定义的而非Spring,周围通知相当于前通知、返回后通知、抛出后通知的结合(传说中的完全体?好吧,我看日和看多了)还有引入通知怎么玩我还没搞清楚,等心无杂念的时候玩玩这东西怎么玩?这么几个步骤:1.创建通知:实现这几个接口,把其中的方法实现了2.定义切点和通知者:在Spring配制文件中配置这些信息3.使用ProxyFactoryBean来生成代理具体做法。
面向切面的编程原理
面向切面的编程原理嘿,朋友!今天咱们来聊聊一个超酷的编程概念——面向切面的编程(AOP)。
这就像是给编程世界打开了一扇新的大门,一旦你走进去,就会发现一个全新的奇妙天地。
我有个朋友小李,他刚开始接触编程的时候,写代码就像盖房子,一块砖一块砖地垒。
功能简单的时候还好,可是一旦项目变得复杂起来,他就开始头疼了。
比如说,他要给一个大型系统添加日志功能。
这意味着他得在系统的好多地方都插入记录日志的代码。
就像你在一个已经织好的毛衣上到处找地方缝补丁一样,既麻烦又容易出错。
那面向切面的编程是怎么来解决这个问题的呢?想象一下,我们的程序就像一个大蛋糕。
以前我们想要在蛋糕里加点巧克力豆(新功能,比如日志功能),我们就得在做蛋糕的每一层(程序的各个模块)的时候都单独去加。
而AOP就像是一个神奇的蛋糕模具,我们可以把巧克力豆直接放在模具的特定位置(切面),然后蛋糕做出来的时候,就自动在需要的地方有巧克力豆了。
在面向切面的编程里,有几个关键的概念。
其中一个就是“切面”。
这个切面啊,就像是一把锋利的刀。
这把刀把我们的程序按照功能或者关注点切成了不同的部分。
比如说,安全验证就是一个切面。
在一个电商系统里,不管是用户登录、下单还是查看订单,都需要进行安全验证。
如果没有AOP,我们就得在每个相关的功能模块里都写安全验证的代码。
这多麻烦啊!就好像你每次出门都要重新检查一遍家里的门窗有没有关好,而不是有一个专门的保安(切面)在门口统一检查。
还有一个概念叫“通知”。
通知就像是给切面这个“刀”加上的特殊指令。
它告诉这个切面在什么时候该做什么事。
有“前置通知”,就像在你进电影院之前,门口的工作人员会先检查你的票(在进入某个功能模块之前进行操作,比如安全验证);有“后置通知”,就像你看完电影出来,工作人员会说“欢迎下次再来”(在功能模块执行完之后进行操作,比如记录操作日志);还有“环绕通知”,这就更厉害了,就像是你在看电影的过程中,工作人员时不时进来检查一下环境(在功能模块执行的前后都可以进行操作)。
Spring AOP--Spring中面向切面编程详解
一、AOP——另一种编程思想1.1什么是AOPAOP(Aspect Orient Programming),直译过来就是面向切面编程。
AOP是一种编程思想,是面向对象编程(OOP)的一种补充。
面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
从《Spring实战(第4版)》图书中扒了一张图:从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
1.2为什么需要AOP想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。
在传统的面向过程编程中,我们也会将这段代码,抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们只需要改变这个方法就可以了。
然而需求总是变化的,有一天,新增了一个需求,需要再多出做修改,我们需要再抽象出一个方法,然后再在需要的地方分别调用这个方法,又或者我们不需要这个方法了,我们还是得删除掉每一处调用该方法的地方。
实际上涉及到多个地方具有相同的修改的问题我们都可以通过AOP来解决。
1.3AOP实现分类AOP要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。
AOP的本质是由AOP框架修改业务组件的多个方法的源代码,看到这其实应该明白了,AOP其实就是前面一篇文章讲的代理模式的典型应用。
按照AOP框架修改源代码的时机,可以将其分为两类:∙静态AOP实现,AOP框架在编译阶段对程序源代码进行修改,生成了静态的AOP代理类(生成的*.class文件已经被改掉了,需要使用特定的编译器),比如AspectJ。
∙动态AOP实现,AOP框架在运行阶段对动态生成代理对象(在内存中以JDK动态代理,或CGlib动态地生成AOP代理类),如SpringA OP。
下面给出常用AOP实现比较如不清楚动态代理的,可参考我前面的一篇文章,有讲解静态代理、JDK动态代理和CGlib动态代理。
1_SpringAop面向切面+路径问题
1_SpringAop面向切面+路径问题1, 知识点:项目中的路径问题404-问题1.1,跳转路径问题404-当前JSP所在的目录为(WEB-INF/ccc)会调到当前页面所在的目录底下的例如(WEB-INF(项目包)/ccc)点击之后会跳到= ccc/console/register.jsp1.2,遇到跳转错误的解决方式首先区分两个路径的区别1),2),斜线的意思是根目录加了斜线之后,会直接从localhost:8080/之下开始所以解决的方法是更改为根路径设置1.3 , 在JSP页面中使用EL表达式获取当前项目名字的方法2, Spring Aop 面向切面实现在不修改源代码的情况下给程序动态统一添加功能的一种技术2.1 , 要插入的代码必须明确给出编写Aop类2.2 , 如何区分什么时间插入什么代码被切面切入的方法2.3 , 如何控制只在指定类的指定方法中插入2.3.1("execution(* com..*.*(..))")execution[,eksi'kju:??n] (execute['eksikju:t] ) n.实行, 完成, 执行, 死刑[计]执行2.3.2,第一个*为项目名2.3.3,com为包名com..说明包含com包之下的所有子文件2.3.4,第二个*类名2.3.5,第三个*方法名2.3.6, ()为参数列表2.4 , 知识点1,切面:我们管切入到指定类指定方法的代码片段称为2,切入点:而切入到哪些类、哪些方法。
3,通知:分为前置通知,后置通知,异常通知,最终通知,环绕通知:拦截到joinpoint之后所要做的事情就是通知.4, Spring提供了两种切面声明方式,实际工作中我们可以选用其中一种:基于XML配置方式声明切面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1, 知识点:项目中的路径问题
404-问题
1.1,跳转路径问题404-
当前JSP所在的目录为(WEB-INF/ccc)<a href=”console/register.jsp”>会调到当前页面所在的目录底下的
例如(WEB-INF(项目包)/ccc)<a href=”console/register.jsp”>
点击之后会跳到= ccc/console/register.jsp
1.2,遇到跳转错误的解决方式
首先区分两个路径的区别
1), <a href=”console/register.jsp”>
2), <a href=”/console/register.jsp”>
斜线的意思是根目录
加了斜线之后,会直接从localhost:8080/之下开始
所以解决的方法是更改为
<a href=”/项目名/console/register.jsp”>
根路径设置
1.3 , 在JSP页面中使用EL表达式获取当前项目名字的方法
2, Spring Aop 面向切面
实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
2.1 , 要插入的代码必须明确给出
编写Aop类
2.2 , 如何区分什么时间插入什么代码
被切面切入的方法
2.3 , 如何控制只在指定类的指定方法中插入
2.3.1("execution(* com..*.*(..))")
execution[,eksi'kju:ʃәn] (execute['eksikju:t] ) n.实行, 完成, 执行, 死刑[计]执行
2.3.2,第一个*为项目名
2.3.3,com为包名com..说明包含com包之下的所有子文件
2.3.4,第二个*类名
2.3.5,第三个*方法名
2.3.6, ()为参数列表
2.4 , 知识点
1,切面:
我们管切入到指定类指定方法的代码片段称为
2,切入点:
而切入到哪些类、哪些方法。
3,通知:
分为前置通知,后置通知,异常通知,最终通知,环绕通知:拦截到joinpoint之后所要做的事情就是通知.
4, Spring提供了两种切面声明方式
,实际工作中我们可以选用其中一种:
基于XML配置方式声明切面。
<!-- 使用配置文件方式 -->
<bean id="abc" class="com.xingxue.Abc"/>
<aop:config>
<aop:aspect ref="abc">
<aop:pointcut id="mycut" expression="execution(*
com.xingxue..*.*(..))" />
<aop:before pointcut-ref="mycut" method="before" />
<aop:after pointcut-ref="mycut" method="after" />
</aop:aspect>
</aop:config>
基于注解方式声明切面。
<aop:aspectj-autoproxy />
@Aspect\@Pointcut("execution(* com..*.*(..))")\@Before("cutPoint()")
\@After("cutPoint()")
2.5, 测试类
3, 使用注解的方式
3.1 , @Transactional
//Aop
3.2 , 需要注意的是扫描冲突的问题
Spring中需要直接扫描到他
而SpringMVC则不需要再次扫描了
SpringMVC的扫描配置需要修改一下。