spring mvc中配置aop

简单的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,但那又怎样?哪怕通宵达旦,也要编的漂亮!
我是程序员,我为自己代言。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值