大型运输行业实战_day11_1_aop理论与aop实际业务操作
1.aop概述
Spring的AOP:
什么叫做AOP:Aspect oritention programming(面向切面编程)
什么是切面:看图,业务方法 执行前后.
AOP的目的:
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,
便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
AOP的优势:
降低模块的耦合度、使系统容易扩展、更好的横切面代码复用性.
AOP当中的概念:
1、切入点(Pointcut):在哪些类,哪些方法上切入增强(where);
2、增强(Advice):早期翻译为通知,在方法执行的什么时机(when:方法前/方法后/方法前后/出现异常)做什么(what:增强的功能);
3、切面(Aspect):切面=切入点+通知,通俗点就是:什么时机,什么地点,做什么!
4、织入(Weaving):把切面加入到对象,并创建出代理对象的过程。(该过程由Spring来完成)。
Spring AOP开发依赖的jar:
spring-aop-4.1.2.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2.aop中的各种增强
各种不同的增强的时机:
aop:before(前置增强):在方法执行之前执行增强;
aop:after-returning(后置增强):在方法正常执行完成之后执行增强;
aop:throwing(异常增强):在方法抛出异常退出时执行增强;
aop:after(最终增强):在方法执行之后执行,相当于在finally里面执行;可以通过配置throwing来获得拦截到的异常信息
aop:around(环绕增强):最强大的一种增强类型。 环绕增强可以在方法调用前后完成自定义的行为,
要求:方法必须要返回一个Object(返回的结果)
3.aop的实际应用
3.1配置事务管理器
一步搞定:
<!-- 事务管理-->
<!-- 做什么 where-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 什么时候做 when -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice> <!-- 什么地点做 where -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* com.day02.sation.service.impl.*Service.*(..))"/>
<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
</aop:config>
3.2做日志系统
需求:在进入控制层前输出请求参数\请求时间等信息
在执行完成后输出执行结果与请求时间
a.编写打印日志类
package com.day02.sation.aop; import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Enumeration; /**
* Created by Administrator on 1/9.
*/
public class WebAspectLog {
private static final Logger logger = LoggerFactory.getLogger(WebAspectLog.class); /**
* 方法执行前输出
*/
public void beforeLog() {
logger.info("-----------beforeLog----------------");
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String key = parameterNames.nextElement();
String value = request.getParameter(key);
//输出 参数信息
logger.info(key + " = " + value);
}
Date date = new Date();
String requestURI = request.getRequestURI();
logger.info("[==> date=" + date + ", requestURI=" + requestURI +"]");
} /**
* 方法执行后输出
* @param returnObj
*/
public void afterLog(Object returnObj) {
logger.info("-----afterLog----");
String s = JSON.toJSONString(returnObj);
logger.info(" returnObj =" + s);
}
}
b.编写spring_aop.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--引入日志管理类-->
<bean id="webAspectLog" class="com.day02.sation.aop.WebAspectLog"/>
<!--配置切面-->
<aop:config>
<aop:aspect ref="webAspectLog">
<aop:pointcut id="pointcut" expression="execution(* com.day02.sation.controller.*Controller.*(..))"/>
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
<!-- 注意如果要获取执行后的结果 必须配置参数 returning="对象为afterLog方法的参数对象名称"-->
<aop:after-returning method="afterLog" pointcut-ref="pointcut" returning="returnObj"/>
</aop:aspect>
</aop:config>
</beans>
c.日志配置文件 log4j.properties
日志配置将在后面详细讲解
#获取日志 INFO:表示获取日志的等级 A1:表示日志存器,可以自定义名称
log4j.rootLogger=INFO,A1 ########################控制台日志####################################
#sql日志
log4j.logger.com.day02.sation.dao=DEBUG
#定义日志A1存放器 log4j.appender.A1=org.apache.log4j.ConsoleAppender #输出到控制台 System.err System.out log4j.appender.A1.Target=System.out #配置日志输出格式 log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C][%L] - %m%n
日志系统主要逻辑完成,当然这里只是构建结构如果你要打印更多日志信息或者记录数据库在打印日志类中添加即可!
大型运输行业实战_day11_1_aop理论与aop实际业务操作的更多相关文章
- 大型运输行业实战_day11_2_事务理论与实际生产配置事务管理
1.什么是事务(Transaction:tx) 数据库的某些需要分步完成,看做是一个整体(独立的工作单元),不能分割,要么整体成功,要么整体生效.“一荣俱荣,一损俱损”,最能体现事务的思想.案例:银行 ...
- 大型运输行业实战_day12_1_权限管理实现
1.业务分析 权限说的是不同的用户对同一个系统有不同访问权限,其设计的本质是:给先给用户分配好URL,然后在访问的时候判断该用户是否有当前访问的URL. 2.实现 2.1数据库设计标准5表权限结构 2 ...
- 大型运输行业实战_day10_1_自定义事务管理类
1.创建事务管理类 TransactionManager.java package com.day02.sation.transaction; import com.day02.sation.uti ...
- 大型运输行业实战_day15_1_全文检索之Lucene
1.引入 全文检索简介: 非结构化数据又一种叫法叫全文数据.从全文数据(文本)中进行检索就叫全文检索. 2.数据库搜索的弊端 案例 : select * from product whe ...
- 大型运输行业实战_day14_1_webserivce简单入门
1.简单使用 1.1.服务端 1.编写接口 package com.day02.sation.ws; /** * Created by Administrator on 1/12. */ public ...
- 大型运输行业实战_day13_1_定时任务spring-quartz
1.jar包 拷贝quartz-2.2.3.jar包到项目 2.编写定时任务类TicketQuart.java package com.day02.sation.task; import com.da ...
- 大型运输行业实战_day01_2_需求文档
1.文档格式 (见模板文件) 2.Axure简单使用 2.1安装Axure傻瓜式安装 2.2简单使用axure 3.总结 需求文件完成后应该包括三种文件: 1.axure文件 2.axure生成的ht ...
- 大型运输行业实战_day01_1_业务分析
1.业务分析 发展历史: 上车收费-->车站买票(相当于先收钱后上车)-->站务系统--->联网售票 2.项目结构 3.开发流程分析 1.业务分析 图文并茂 ...
- 大型运输行业实战_day09_2_站间互售实现
1.添加站间互售入口 对应的html代码 <button onclick="otherStation()">站间互售</button> 对应的js发送函数 ...
随机推荐
- 关于basler线阵相机和Mtrox采集卡的安装
说明: 本系列博文是我自己研究生课题,采用做一步记录一步,在论文答辩结束或者机器设计结束之后才会附上源代码! 以前都是用opencv,直接拿个照片去处理,基本都是软件的使用,这次做课题要用到Matro ...
- 【python】python函数式编程、高阶函数
1.map() : python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并 返回. def f(x): r ...
- numpy+pandas 基础学习
#-*- coding:utf-8 -*- import numpy as np; data1=[1,2,3,4,5] array1=np.array(data1) #创建数组/矩阵 # 使用nump ...
- springboot 整合 redis 共享Session-spring-session-data-redis
参考:https://www.cnblogs.com/ityouknow/p/5748830.html 如何使用 1.引入 spring-boot-starter-redis <dependen ...
- 白鹭引擎 - 本地坐标和舞台坐标的转化 ( globalToLocal, localToGlobal )
class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...
- 对象 Object
在js 中创建最简单的对象,然后给它添加属性或者方法 示例如下: var obj = new Object(); //或者 var obj = {}; obj.name = '张三'; obj.fun ...
- Duboo 与springboot整合
https://github.com/apache/incubator-dubbo-spring-boot-project 当采用properties方式时,可以用下方的注解 1.pom <de ...
- 解决 shopnc b2b2c 版权问题 修改路经ULR及目录文件夹思路及教程
相信各位使用过NC的朋友,多多少少收到过律师函,把一堆人吓尿了,原因你使用了盗版,大哥都要吃饭可以理解#网络那么大,他怎么能快速定位到您的,原因很简单 搜索引擎,NC在开发中定义了URL路由规则,在百 ...
- BBS-项目流程分析-表的创建
http://www.cnblogs.com/alice-bj/tag/Django%20-%20BBS/ https://www.cnblogs.com/venicid/p/9365019.html ...
- mui longtap 事件无效
1.mui 的部分事件默认是关闭的 需要在init中单独配置事件开关 mui.init({ gestureConfig: { longtap: true, //默认为false } })