`
kanpiaoxue
  • 浏览: 1781558 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring MVC controller 的AOP应用

 
阅读更多

在使用Spring MVC的时候,一般会有至少2个Spring的XML。一个用来配置一般的Spring的Bean(如:spring-ctx-application.xml),一个用来声明Spring Controller对于的view的内容(如:spring-mvc-servlet.xml)。

很多人发现在spring-ctx-application.xml里面声明AOP对Controller不起作用,这是为什么呢?因为Spring MVC里面的一般性配置spring-ctx-application.xml是一个上下文,而管理Spring MVC的spring-mvc-servlet.xml又是一个上下文。对Controller的配置都在spring-mvc-servlet.xml这个里面。也就是说存在2个不同的Spring上下文。你配置在spring-ctx-application.xml的堆Controller的AOP当然不起作用了。如何修改呢?在spring-mvc-servlet.xml里面再添加一份AOP的配置即可。同样的道理,在Controller里面配置@Value,也需要在spring-mvc-servlet.xml里面指定.properties的配置文件,才能正确的读取内容。

spring-mvc-servlet.xml如下:

 

 

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:jms="http://www.springframework.org/schema/jms" xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:sec="http://www.springframework.org/schema/security"
	xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx"

	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
		http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
		http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:console-configure.properties</value>
			</list>
		</property>
	</bean>

	<mvc:annotation-driven />

	<context:component-scan base-package="com.kanpiaoxue.rigel.dmap.console.controller" />
	
	
	<aop:aspectj-autoproxy />
		<bean id="performanceCalculate" class="com.kanpiaoxue.rigel.dmap.console.utils.PerformanceCalculateController">
		<property name="order" value="100" />
	</bean>
	
	<bean class="com.kanpiaoxue.rigel.dmap.console.utils.DmapExceptionResolver" />
    
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
        <property name="messageConverters">
            <list>  
                <ref bean="mappingJacksonHttpMessageConverter"/>  
            </list>  
        </property>
    </bean>
    
    <bean id="mappingJacksonHttpMessageConverter" 
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>text/javascript;charset=UTF-8</value>
            </list>
        </property>  
    </bean>
    
	<bean
		class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="mediaTypes">
			<map>
				<entry key="html" value="text/html" />
				<entry key="json" value="application/json" />
				<entry key="xml" value="application/xml" />
			</map>
		</property>
		<property name="viewResolvers">
			<list>
				<bean
					class="org.springframework.web.servlet.view.InternalResourceViewResolver">
					<property name="viewClass"
						value="org.springframework.web.servlet.view.JstlView" />
					<property name="prefix" value="/WEB-INF/views/" />
					<property name="suffix" value=".jsp" />
				</bean>
			</list>
		</property>
<!-- 		<property name="defaultViews">
			<list>
				<bean
					class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
			</list>
		</property> -->
	</bean>


	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
		p:defaultEncoding="UTF-8">
		<property name="resolveLazily" value="true" />
		<property name="maxUploadSize" value="${file.upload.max.size}" />
		<property name="maxInMemorySize" value="${file.upload.max.in.memory.size}" />
	</bean>

	<!-- cache start -->
	<!-- <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
		p:cache-manager-ref="ehcache" />

	EhCache library setup
	<bean id="ehcache"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation" value="classpath:${dmap.console.cache.file}" />
	</bean> -->
	<!-- cache end -->
	
</beans>

 

 

AOP范例类如下:

 

package com.kanpiaoxue.rigel.dmap.console.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;

import com.google.common.base.Stopwatch;

/**
 * <pre>
 * PerformanceCalculateController .java

 

 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年8月29日 下午3:47:10<br>
 * Description : AOP性能切面类
 * </pre>
 */
@Aspect
public class PerformanceCalculateController implements Ordered {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(PerformanceCalculate.class);

    private int order = 1;

    /**
     * <pre>
     * 统计指定切面的方法的耗时,单位:毫秒
     *  @param point
     *  @return
     *  @throws Throwable
     * </pre>
     */
    @Around("execution(* com.kanpiaoxue.rigel.dmap.console.controller.*.*(..))")
    public Object calculateConsume(ProceedingJoinPoint point) throws Throwable {

        Object[] args = point.getArgs();
        Stopwatch watch = Stopwatch.createStarted();
        Object rs = null;
        if (null != args) {
            rs = point.proceed(args);
        } else {
            rs = point.proceed();
        }
        String className = point.getTarget().getClass().getName();
        String methodName = point.getSignature().getName();
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug(String.format("%s.%s consumes %s.", className,
                    methodName, watch.toString()));
        }
        return rs;
    }

    @Override
    public int getOrder() {
        return this.order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

}

 

分享到:
评论

相关推荐

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现跨切面的关注点,如日志管理。本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志...

    spring MVC AOP注解方式如何拦截controller 例子

    本文将详细介绍如何使用AspectJ注解在Spring MVC中实现AOP拦截Controller方法,并提供一个具体的例子。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面包含了业务逻辑中横切关注点的...

    Spring MVC jar包

    - **AOP集成**:Spring MVC与Spring的面向切面编程(AOP)无缝集成,可以方便地实现事务管理和其他切面功能。 2. **Hibernate 3.6.8**: - **ORM框架**:Hibernate是一个强大的ORM工具,它将Java对象映射到数据库...

    《Spring MVC MYBatis企业应用实战+源码》

    Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的MVC(Model-View-Controller)架构。它提供了一个分层的结构,使得开发者可以将业务逻辑、数据访问和用户界面有效地分离,从而实现松耦合和模块化的开发...

    Spring-MVC-aop.zip

    在本文中,我们将深入探讨如何使用Spring MVC框架中的AOP(面向切面编程)特性,结合注解方式来实现对Controller层的拦截,以便进行日志管理。这是一项非常实用的技术,可以帮助开发者追踪和记录应用程序的关键操作...

    最全最经典spring-mvc教程

    另外,Spring MVC与Spring框架的其他组件无缝集成,如Spring AOP(面向切面编程)用于实现日志、事务管理等功能,Spring JDBC和MyBatis等持久层框架用于数据库操作,以及Spring Data JPA、Hibernate等ORM工具,使得...

    Spring MVC AOP通过注解方式拦截Controller等实现日志管理demo版本2

    本项目"Spring MVC AOP通过注解方式拦截Controller等实现日志管理demo版本2"是基于注解的AOP实践,旨在帮助开发者了解如何利用AOP来记录应用程序中的关键操作日志。以下是关于这个主题的详细解释: 1. **Spring AOP...

    spring_aop1.rar_java aop_spring mvc 例子

    5. **Spring MVC集成**:AOP可以与Spring MVC协同工作,比如在Controller层的方法调用中添加事务管理和日志记录。 6. **Spring MVC基础知识**:虽然主要讲解AOP,但实例可能也会涵盖Spring MVC的基础,如...

    spring mvc jar包

    3. `org.springframework.web.servlet-3.0.2.RELEASE.jar`:这是 Spring MVC 的核心模块,提供了控制器(Controller)、模型视图(ModelAndView)以及调度器Servlet(DispatcherServlet)等关键组件。...

    Spring MVC+ Spring+ Mybatis 框架搭建

    Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的Model-View-Controller(MVC)架构。它提供了处理HTTP请求、模型数据绑定、视图渲染等功能。Spring MVC通过DispatcherServlet作为前端控制器,接收请求并...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    - Spring MVC是基于Model-View-Controller(MVC)设计模式的Web应用框架,提供了一种组织和处理请求的机制。 - 它的核心组件包括DispatcherServlet、HandlerMapping、HandlerAdapter、ModelAndView和ViewResolver...

    Java EE企业级应用开发教程 Spring+Spring MVC+MyBatis 第2版 Jav 第2版源码

    《Java EE企业级应用开发教程》第二版,结合Spring、Spring MVC和MyBatis三大框架,为读者提供了全面深入的Java后端开发学习路径。这本书的源码资源旨在帮助开发者通过实践来理解并掌握企业级应用开发的核心技术。 ...

    基于Spring MVC的web应用

    Spring MVC 是 Spring 框架的一个模块,它为构建 Web 应用程序提供了一种模型-视图-控制器(MVC)架构。这个框架使得开发者可以将业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和可测试性。在基于Spring ...

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》是一本深入探讨Java企业级应用程序开发的书籍,源代码包含多个章节的实例,旨在帮助读者理解和掌握使用Spring、Spring MVC和MyBatis框架进行实际开发的关键...

    spring MVC_快速入门

    Spring MVC 是一个强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种MVC(Model-View-Controller)架构模式的实现,帮助开发者处理HTTP请求、数据绑定、...

    Spring mvc整合mybatis例子

    在IT行业中,Spring MVC 和 MyBatis 是两个非常重要的框架,它们分别负责Web应用程序的控制器层和数据访问层。Spring MVC 提供了模型-视图-控制器架构模式的实现,而MyBatis则是一个轻量级的SQL映射框架,用于简化...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    Spring框架则是一个全面的企业级应用开发平台,它不仅包含Spring MVC,还提供了依赖注入(DI)、AOP(面向切面编程)、事务管理、JDBC抽象、缓存、任务调度等多个核心功能。在全注解开发中,我们可以使用@Autowired...

    Spring IOC AOP MVC 简单例子

    Spring框架是Java开发中不可或缺的一部分,它以模块化的方式提供了许多功能,如依赖注入(IOC)、面向切面编程(AOP)以及Model-View-Controller(MVC)架构模式。在本实例中,我们将深入探讨这三个核心概念以及它们...

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)所有实验及实验报告.zip

    Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的Model-View-Controller(MVC)架构。它提供了一个灵活的模型绑定机制,可以将HTTP请求参数与Java对象字段对应起来,同时支持多种视图技术,如JSP、...

Global site tag (gtag.js) - Google Analytics