您的位置:首页 > 编程语言 > Java开发

spring mvc中配置aop

2016-12-05 22:02 141 查看
简单的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.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://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
@ControllerPointcut
public Integer queryApp(HttpServletRequest request){
return 1;
}
5.切面类

//描述切面类
@Aspect
@Component
public 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,但那又怎样?哪怕通宵达旦,也要编的漂亮!

我是程序员,我为自己代言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  aop