接着Spring第五篇讲 我们今天将叙述以下几个知识点

1 什么是AOP

AOP 是一种思想  横向重复  纵向抽取

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP 解决 OOP 中遇到的一些问题.是 OOP 的延续和扩展.

2 为啥学习AOP

对程序进行增强,不改变源码的前提下  AOP 可进行权限校验,日志记录,性能监控,事物控制等功能。

3 Spring中AOP的由来

AOP 最早是由AOP联盟提出来的,并且制定了规范 Spring框架引入aop思想 必须遵守AOP联盟的规范

Spring中能够为容器中管理对象生成动态代理对象(以前自己写代码)  spring能帮我们生成动态代理对象----》完成spring思想来开发。

4 Spring实现aop原理

就是动态代理技术和cglib技术

动态代理技术  被代理对象必须实现接口才能产生代理对象

cglib可以对所有类进行代理  但是如果该类被final修饰则无法被cglib代理

5 aop名词(相关术语)

5.1  Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点.5.1

5.2 Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.指的就是已经发生的

5.3 Advice(通知/增强):增强的代码   所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

写好一个“通知”   把这些“通知”  “切入”到“连接点”

5.4  Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field.

5.5Target(目标对象):代理的目标对象(被代理对象)

5.6 Weaving(织入):是将通知 织入  切入点 过程 叫织入   是指把增强应用到目标对象来创建新的代理对象的过程. spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入

5.7 Proxy(代理):  将通知织如到目标对象之后,形成代理对象, 一个类被           AOP 织入增强后,就产生一个结果代理类Aspect(切面): 是切入点和通知(引介)的结合

5.8 aspect  切入点+通知

6 Spring中如何使用AOP

6.1 xml配置

6.1.1 导包

4+2+2+2

前六个包在前几次spring中已经提过  说后面两个2 分别是

后面的2 是aop联盟包 如下图

下的

第二个包 在搜索框搜  weaver  

6.1.2 准备目标对象  代码如下

@Override
public void save() {

System.out.println("存储李俊");
}

@Override
public void delete() {

System.out.println("删除账户");
}

@Override
public void update() {
System.out.println("更新账户");

}

@Override
public void find() {
System.out.println("查找用户");

}

6.1.3 准备通知(advice)  建类myAdvice    代码如下

public void before(){
System.out.println("这是前置通知");
}
public void afterReturning(){
System.out.println("这是后置通知 如果出现异常不会调用");
}
//环绕通知
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("这是环绕通知之前的部分!!");
Object proceed = pjp.proceed();//调用目标方法
System.out.println("这是环绕通知之后的部分!!");
return proceed;
}
public void afterException(){
System.out.println("出事啦!出现异常了!!");
}
//后置通知
public void after(){
System.out.println("这是后置通知(出现异常也会调用)!!");
}

其中环绕通知 需要特别记住。

6.1.4 写配置文件 将通知织入目标对象中  需要进行新的约束引入  代码如下

<!-- 1 配置目标对象 -->
<bean name="User" class="lijun.Service.UserServieImpl"></bean>
<!-- 2 配置通知对象 -->
<bean name="myAdvice" class="cn.lijun.springaop.MyAdvice"></bean>
<!-- 3将通知 织入 目标 -->
<aop:config>
<aop:pointcut expression="execution(* cn.lijun.Service.*ServiceImpl.*(..))" id="lj"/>
<aop:aspect ref="MyAdvice">
<!-- 指定名为before方法作为前置通知 -->
<aop:before method="before" pointcut-ref="lj" />
<!-- 后置 -->
<aop:after-returning method="afterReturning" pointcut-ref="lj" />
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="lj" />
<!-- 异常拦截通知 -->
<aop:after-throwing method="afterException" pointcut-ref="lj"/>
<!-- 后置 -->
<aop:after method="after" pointcut-ref="lj"/>
</aop:aspect>
</aop:config>
</beans>

6.1.5 测试

package cn.lijun.springaop;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.lijun.Service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cn/lijun/springaop/applicationContext.xml")
public class Demo {
@Resource(name="User")
private UserService u;
@Test
public void fun1(){

u.save();
}

}

6.2 注解配置  和上面类似。

Spring第六篇---AOP的更多相关文章

  1. Spring第六篇【Spring AOP模块】

    前言 Spring的第五篇也算是AOP编程的开山篇了,主要讲解了代理模式-..本博文主要讲解Spring的AOP模块:注解方式和XML方式实现AOP编程.切入点表达式.. AOP的概述 Aop: as ...

  2. Spring总结六:AOP(面向切面编程)

    概述: AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的 ...

  3. Spring 使用介绍(六)—— AOP(二)

    一.切入点语法 1)通配符 AOP支持的通配符: *:匹配任何数量字符 ..:匹配任何数量字符的重复,在类型模式中匹配任何数量子包,在方法参数模式中匹配任何数量参数 +:匹配指定类型的子类型,仅能作为 ...

  4. 白话Spring(基础篇)---AOP(execution表达式)

    作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! -------------------------------- ...

  5. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

  6. 跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心

    SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwic ...

  7. Spring Cloud第六篇 | Hystrix仪表盘监控Hystrix Dashboard

    本文是Spring Cloud专栏的第六篇文章,了解前五篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ...

  8. 白话Spring(基础篇)---AOP(execution表达式)(转)

    [一知半解,就是给自己挖坑] 作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! ----------------- ...

  9. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

随机推荐

  1. UVA - 242 Stamps and Envelope Size (完全背包+bitset)

    题意:给你一些邮票面值的集合,让你选择其中一个集合,使得“能用不超过n枚集合中的邮票凑成的面值集合S中从1开始的最大连续面值”(即mex(S)-1)最大.如果有多解,输出集合大小最小的一个:如果仍有多 ...

  2. 康托展开与逆康托展开模板(O(n^2)/O(nlogn))

    O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } in ...

  3. ACM学习历程—HDU5666 Segment(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5666 这题的关键是q为质数,不妨设线段上点(x0, y0),则x0+y0=q. 那么直线方程则为y = y0/x ...

  4. vim直接编辑远程文件

    本文由Suzzz原创,发布于http://www.cnblogs.com/Suzzz/p/4116341.html,转载请保留此声明. Linux环境下 vim scp://user@hostIP/P ...

  5. ubuntu lts install licode tag pre-v5.4

    1. Requirements Ubuntu 14.04 LTS 2. Clone Licode codeYou first need to clone our code from github.Yo ...

  6. python风格指南

    还在让别人一眼就看出你是一只野生程序猿嘛,快来看看谷歌的python风格指南提升逼格吧! http://zh-google-styleguide.readthedocs.io/en/latest/go ...

  7. 转:InnoDB Crash Recovery 流程源码实现分析

    此文章转载给登博的文章,给大家分享 InnoDB Crash Recovery 流程源码实现分析 Crash Recovery问题 本文主要分析了InnoDB整个crash recovery的源码处理 ...

  8. oracle connect by用法篇 (包括树遍历)之二

    3.2查询当前时间往前的12周的开始时间.结束时间.第多少周 , ) - (rownum ) as startDate, sysdate , 'd'))) - (rownum ) as endDate ...

  9. C# 正规表达式

    在C#中怎么用正则表达式限制文本框内不能输入数字?只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数字:" ...

  10. django的render的说明

    return render(request,"homesite.html",locals()) homesite.html页面中的所有内容都可以被渲染,不论是标签还是js代码,包括 ...