SSM 利用SpringMVC的AOP来实现后台系统的操作日志记录(Controller)

一、

  1. 引入cglib.jar包
<dependency>
			    <groupId>cglib</groupId>
			    <artifactId>cglib</artifactId>
			    <version>3.2.8</version>
			</dependency>

 2、 dispatcherServlet-servlet.xml添加配置

<!-- 通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller -->
<aop:aspectj-autoproxy proxy-target-class="true" />


    <context:component-scan base-package="com.qding">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

3、applicationContext.xml

    <context:component-scan base-package="com.qding">           
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

 

二、问题描述

1、当使用Spring AOP对Controller层的Controller类的方法进行切面拦截,不起作用。AOP配置没有任何问题。

    AOP之所以有的人说拦截不到Controller,原因是该注解的Controller已被spring容器内部代理了。我们只要把它交给cglib代理就可以了。Spring MVC的配置文件dispatcherServlet-servlet.xml:

   dispatcherServlet-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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 
	    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!-- 登录拦截器 
    <mvc:interceptors>
       <bean >
       
       </bean>
    </mvc:interceptors>-->
     <context:annotation-config />
     
    <context:component-scan base-package="com.yc">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>
     
     <aop:aspectj-autoproxy proxy-target-class="true"/>
	 <bean class="com.yc.controller.aop.LogAspect" />
	 
	 
    
	<!--SpringMVC的配置文件,包含网站跳转逻辑的控制,配置  -->
	<context:component-scan base-package="com.yc.controller" use-default-filters="false">
		<!--只扫描控制器。  -->
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- Spring的配置文件,这里主要配置和业务逻辑有关的 -->
	<!--=================== 数据源,事务控制,xxx ================ -->
	<context:property-placeholder location="classpath:properties/*.properties" />	
	<!-- 静态资源解析 -->
	<mvc:resources location="/webframes/" mapping="/webframes/**"/>	
	<!--配置视图解析器,方便页面返回  -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!--两个标准配置  -->
	<!-- 将springmvc不能处理的请求交给tomcat -->
	<mvc:default-servlet-handler/>
	<!-- 能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求 -->
	<mvc:annotation-driven/>
</beans>

applicationContext.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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
	<context:component-scan base-package="com.yc">
		 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
	</context:component-scan>
		
	<!-- Spring的配置文件,这里主要配置和业务逻辑有关的 -->	
	<context:property-placeholder location="classpath:properties/*.properties" />
	<!--sql server 数据源配置 -->
	<!-- org.springframework.jdbc.datasource.DriverManagerDataSource -->
	<bean id="pooledDataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="filters" value="${filters}" />		
		<property name="maxActive" value="${maxActive}" />		
		<property name="initialSize" value="${initialSize}" />		
		<property name="maxWait" value="${maxWait}" />
		<property name="minIdle" value="${minIdle}" />		
		<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
		<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
		<property name="validationQuery" value="${validationQuery}" />
		<property name="testWhileIdle" value="${testWhileIdle}" />
		<property name="testOnBorrow" value="${testOnBorrow}" />
		<property name="testOnReturn" value="${testOnReturn}" />
		<property name="poolPreparedStatements" value="${poolPreparedStatements}" />
		<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
	</bean>

	<!--================== 配置和MyBatis的整合=============== -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 指定mybatis全局配置文件的位置 -->
		<property name="configLocation" value="classpath:spring/mybatis-config.xml"></property>
		<property name="dataSource" ref="pooledDataSource"></property>
		<!-- 指定mybatis,mapper文件的位置 -->
		<!-- <property name="mapperLocations" value="classpath:mapper/*.xml"></property> -->
	</bean>

	<!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!--扫描所有dao接口的实现,加入到ioc容器中 -->
		<property name="basePackage" value="com.yc.mapper"></property>
	</bean>

	<!-- 配置一个可以执行批量的sqlSession -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
		<constructor-arg name="executorType" value="SIMPLE"></constructor-arg>
	</bean>
	<!--============================================= -->

	<!-- ===============事务控制的配置 ================ -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!--控制住数据源 -->
		<property name="dataSource" ref="pooledDataSource"></property>
	</bean>
		
	<!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式) -->
	<aop:config>
		<!-- 切入点表达式 -->
		<aop:pointcut expression="execution(* com.yc.service..*(..))"
			id="txPoint" />
		<!-- 配置事务增强 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" />
	</aop:config>

	<!--配置事务增强,事务如何切入 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>			
			<tx:method name="insert*" propagation="REQUIRED" />  
            <tx:method name="update*" propagation="REQUIRED" />  
            <tx:method name="edit*" propagation="REQUIRED" />  
            <tx:method name="save*" propagation="REQUIRED" />  
            <tx:method name="add*" propagation="REQUIRED" />  
            <tx:method name="new*" propagation="REQUIRED" />  
            <tx:method name="set*" propagation="REQUIRED" />  
            <tx:method name="remove*" propagation="REQUIRED" />  
            <tx:method name="delete*" propagation="REQUIRED" />  
            <tx:method name="change*" propagation="REQUIRED" />  
            <tx:method name="check*" propagation="REQUIRED" />  
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="*" propagation="REQUIRED" read-only="true" /> 			
		</tx:attributes>
	</tx:advice>
	<!-- Spring配置文件的核心点(数据源、与mybatis的整合,事务控制) -->
			
	<!-- 国际化配置 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>properties/messages</value>
			</list>
		</property>
		<property name="defaultEncoding" value="utf-8" />
	</bean>
	
	
	
</beans>

 3/Spring Aop 执行两次原因(1)

切面bean重复定义
 类中使用了@Component的同时又在springmvc.xml中配置了<bean id="log**" class="com.demo.log.**Aspect"></bean>

方法: 删除两个定义之一

 

 

参考1

cglib

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我们可以使用Java语言和SSM框架来实现图书管理系统。我们可以使用Spring框架的IOC容器来解耦各组件,从而让系统的代码结构更加清晰,同时也可以使用Spring框架AOP技术来实现系统的权限控制和日志记录。此外,我们还可以使用Mybatis框架来实现数据库的操作,从而更加方便地实现图书管理系统的功能。 ### 回答2: 基于SSM(Spring+SpringMVC+MyBatis)框架实现图书管理系统需要以下步骤: 1. 环境搭建:安装Java开发环境、Maven项目管理工具、Tomcat服务器,引入SSM相关的依赖包。 2. 创建数据库:使用MySQL等数据库管理系统创建图书管理系统所需的数据库,包括图书、借阅记录等表。 3. 创建实体类:根据数据库表设计实体类,包括图书、借阅记录等。 4. 配置数据源:在Spring配置文件配置数据源,连接数据库。 5. 创建Dao层:使用MyBatis的注解或XML配置方式实现图书相关的数据库操作,包括图书的增删改查。 6. 创建Service层:编写图书相关的业务逻辑代码,封装对Dao层的调用。 7. 创建Controller层:编写图书相关的请求处理代码,接收请求参数并调用相应的Service方法。 8. 创建视图层:使用JSP、HTML等技术实现前端页面,展示图书列表、借阅记录等信息。 9. 配置SpringMVC:在Spring配置文件配置SpringMVC相关的视图解析器、控制器等。 10. 部署运行:将项目打包成war文件,部署到Tomcat服务器运行。 通过以上步骤,我们就可以基于SSM框架成功实现图书管理系统。用户可以在系统进行图书查询、借阅、归还等操作管理员可以进行图书的管理操作日志的查看。 ### 回答3: 基于SSM实现图书管理系统,可以分为以下几个步骤: 1. 设计数据库结构: 首先,需要设计数据库表的结构。可以创建几个表,如图书表、读者表、借阅记录表等。每个表都有相应的字段来存储不同的信息。 2. 搭建项目环境: 在Java开发工具,搭建基于SSM框架的项目环境。SSM框架由Spring、SpringMVC和MyBatis组成,分别负责实现控制反转、Web层和数据持久层的功能。 3. 编写实体类: 根据数据库表的结构,编写对应的实体类。每个实体类对应数据库表的字段,并且有相应的成员变量和访问方法。 4. 配置MyBatis: 在项目的配置文件,配置MyBatis的相关信息,如数据库连接、映射文件路径等。映射文件定义了SQL语句与实体类之间的映射关系。 5. 编写数据访问层: 利用MyBatis框架,编写数据访问层的代码。主要负责与数据库进行交互,执行SQL语句,并将查询结果封装到实体类。 6. 编写业务逻辑层: 在Spring框架的帮助下,编写业务逻辑层的代码。该层处理具体的业务逻辑,如图书的增删改查、读者的注册登录等功能。 7. 编写控制器: 利用SpringMVC框架,编写控制器的代码。该层负责接收前端请求,调用相应的业务逻辑处理,并返回结果给前端。 8. 编写前端页面: 使用HTML、CSS和JavaScript等技术,编写前端页面。可以根据需求设计图书借阅、读者管理等功能的界面,并与后端进行交互。 9. 测试和调试: 对整个系统进行测试和调试,验证功能的正确性和性能的优化。 10. 部署和上线: 将完成的系统部署到服务器上,并上线供用户使用。 以上就是基于SSM框架实现图书管理系统的大致步骤,通过这个系统,可以实现图书的增删改查、借阅归还等功能,方便用户管理图书馆的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值