spring mvc中配置aop

来源:互联网 发布:java图形化界面开发 编辑:程序博客网 时间:2024/05/21 11:16

简单的controller层切面

1pom文件

<properties><spring.version>4.1.8.RELEASE</spring.version></properties><dependencyManagement><dependencies><!-- spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency>                        <!-- spring 上下文,读取配置文件 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- spring aop --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency>        <!-- 注解 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency></dependencies></dependencyManagement>

2.配置文件中

2.1首先了解web.xml中的

<context-param><!-- spring相关配置 --><param-name>contextConfigLocation</param-name><param-value>classpath*:/root-context.xml</param-value></context-param><servlet><!-- spring mvc相关配置 --><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/web-context.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

2.2spring mvc相关配置

<?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:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd ">

<mvc:annotation-driven /><!-- 注解 --><context:component-scan base-package="com.dinfo.semanti.annotationInter" /> <!-- 相关类扫描 --><aop:aspectj-autoproxy expose-proxy="true"/> <!-- aop相关配置 -->

3.自定义注解,灵活的使用aop

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface ControllerPointcut {}
3.1注解简单说明

@Target:表示该注解可以用于什么地方,可能的ElementType参数:
CONSTRUCTOR:构造器的声明 
LOCAL_VARIABLE:局部变量声明 
METHOD:方法声明 
PACKAGE:包声明 PARAMETER:参数声明 
TYPE:类、接口(包括注解类型)或enum声明

@Retention:表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE:注解将被编译器丢弃 
CLASS:注解在class文件中可用,但会被VM丢弃 
RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。(常用)

@Document:将注解包含在Javadoc中
@Inherited:允许子类继承父类中的注解

注意:
注解可以设定初始值,使用default就可以实现。 
注解只有一个元素的时候,该元素名称必须是value,并且在使用该注解的时候可以省略”alue=”。 
注解的值必须是确定的,且不能使用null作为值。 
注解可能的类型:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。

4.controller相关的方法

@RequestMapping("/queryApp") @ResponseBody @ControllerPointcutpublic Integer queryApp(HttpServletRequest request){return 1;}
5.切面类

//描述切面类@Aspect@Componentpublic class TestAop {public TestAop(){}  /*   * 定义一个切入点   */  // @Pointcut("execution (* findById*(..))") @Pointcut("@annotation(com.dinfo.semanti.annotationInter.ControllerPointcut)") public void excudeService(){}/* * 配置前置通知,使用在方法aspect()上注册的切入点 * 同时接受JoinPoint切入点对象,可以没有该参数 */@Before("excudeService()")public void before(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("before " + joinPoint);}}//配置后置通知,使用在方法aspect()上注册的切入点@After("excudeService()")public void after(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("after " + joinPoint);}}//配置环绕通知,使用在方法aspect()上注册的切入点@Around("excudeService()")  public JsonResponse twiceAsOld(ProceedingJoinPoint thisJoinPoint){      System.out.println("执行切面");      try {          return (JsonResponse) thisJoinPoint.proceed();      } catch (Throwable e) {      return JsonResponse.notOk("访问失败");      }  }//配置后置返回通知,使用在方法aspect()上注册的切入点@AfterReturning("excudeService()")public void afterReturn(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("afterReturn " + joinPoint);}}//配置抛出异常后通知,使用在方法aspect()上注册的切入点@AfterThrowing(excudeService())public void afterThrow(JoinPoint joinPoint, Exception ex){if(log.isInfoEnabled()){log.info("afterThrow " + joinPoint + "\t" + ex.getMessage());}}}



你只看到我在不停的忙碌,却没看到我奋进的热情;
你有你的规则,我有我的选择;
你否定我的现在,我决定我的未来;
你嘲笑我只懂编码,不配享受,我可怜你被代码操纵,而不自知;
你可以轻视我的年轻,我会证明这是谁的时代!
Coding是注定痛苦的旅行,路上少不了Bug和Change,但那又怎样?哪怕通宵达旦,也要编的漂亮!
我是程序员,我为自己代言。
0 0
原创粉丝点击