这2天学习了Spring的AOP  其中包括注解式和非注解式的配置  个人感觉注解式的配置非常好用。具体内容如下:

1.    AOP 面向切面编程

个人理解就是在一个写好的方法上增加一些新的功能  主要有权限管理,缓存,日志,错误处理,性能优化,事务处理

其中有几个基本概念:

1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。       ------  相当于一个类

2.连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。----客户端调用的方法

3.通知(Advice):在切面的某个特定的连接点上执行的动作。  ----切面中的方法

3.切入点(Pointcut):匹配连接点的断言。

就是一种判断规则,如果满足了判断则会执行切面中的通知。

如果没有满足规则,程序不能执行通知方法

4.目标对象(Target Object): 被一个或者多个切面所通知的对象。--------被代理者

配置切面的主要如下

<!-- 切面的对象 -->
<bean id="txAspect" class="aspect.TxAspect"></bean>

<!-- 配置切面 -->
<aop:config>
<!-- within(包名,类名)    execution可以具体到方法上 -->
<!-- <aop:pointcut expression="within(Service.Impl.UserServiceImpl)" id="pc"/> -->
<aop:pointcut expression="execution(* Service..*.*(..))" id="pc"/>
<!--  几个主要的通知-->
<aop:aspect ref="txAspect">
<!-- <aop:around method="around" pointcut-ref="pc"/>
<aop:after method="after" pointcut-ref="pc"/> -->
<aop:after-returning method="afterReturn" pointcut-ref="pc" returning="msg"/>
<!-- 配置通知 -->
<!-- <aop:before method="before" pointcut-ref="pc"/> -->
<!-- 异常通知 参数必须和接收参数一致 joinPoint必须放在前面-->
<!-- <aop:after-throwing method="afterThrow" pointcut-ref="pc" throwing="throwable"/> -->
</aop:aspect>

</aop:config>

通知的类型

1.环绕通知

在目标方法执行之前,执行之后都要执行

2.前置通知(Before advice)

在目标方法执行之前执行

3.后置通知(After returning advice)

在目标方法执行之后执行

4.异常通知(After throwing advice)

目标方法执行后抛出异常才执行

5.最终通知(After (finally) advice)

在目标方法执行之后 都会执行的通知

说明:

5大通知类型中,环绕通知功能最为强大,因为环绕通知,可以控制目标方法是否执行。

以后可以使用环绕通知做 权限控制,事务控制,日志收集和处理,

检测程序的执行性能(时间)

切入点表达式的写法

粒度:按类匹配   粗粒度

1.within表达式

Within(包名.类名)     within(service.UserServiceImpl)  匹配UserServiceImpl的全部操作

within(service.*)

匹配service包下一级子类

within(service..*)

匹配service包下的所有的子孙类

2.

Execution(返回值类型 包名.类名.方法名(参数列表))

AOP的调用原理

1.当spring容器解析到AOP标签时,开启启动AOP的相关配置

2.当解析到切入点表达式时,该表达式会进入spring内存中保留

3.当解析到切面类时,首先会为切面创建对象。并且根据切入点表达式,和通知的匹配关系进行绑定。

4.如果从容器中获取对象时,如果该对象与切入点表达式中的规则匹配。

则会为其创建代理对象,如果该类实现了接口,则会为其创建JDK的代理,如果该类没有实现接口,则会采用cglib进行代理。代理对象创建完成后,交给用户使用。

5.当代理对象执行方法时,则会执行与切入点表达式绑定的通知方法。

在程序中做异常的收集,可以实时监控那些java代码报错,方便后期维护。

/能够接收异常信息 获取当前方法
//如果添加JoinPoint参数,则必须位于第一位
public void afterThrow(JoinPoint joinPoint,Throwable throwable){
System.out.println("获取异常信息:"+throwable.getMessage());
System.out.println("获取异常类型:"+throwable.getClass());

System.out.println("当前执行的方法为:"+joinPoint.getSignature().getName());
System.out.println("我是一个异常通知");
}

配置切面如下:

<!--切面的对象 -->
<bean id="myAspect" class="aspect.MyAspect"></bean>

<!--配置切面 -->
<aop:config>
<aop:pointcut expression="execution(* service..*.*(..))" id="pc"/>

<aop:aspect ref="myAspect">

<aop:after-throwing method="afterThrow"
pointcut-ref="pc" throwing="throwable"/>

</aop:aspect>
</aop:config>

后置通知介绍:

作用:

获取目标方法执行后的返回值结果,并且进行记录时需要使用后置通知。

环绕通知的规范

环绕通知中必须添加返回值,否则程序执行获取不到结果。

如果有多个环绕通知,则或先执行下一个通知,如果没有下一个通知,则会执行目标方法

其结构是一种嵌套关系

AOP的注解形式

切面配置的要素:

1.切入点表达式

2.切面对象

3.通知

1.开启前面注解

注解的使用

注解中切入点的写法

1.将切入点写入通知内部

@Before(value="execution(* service..*.*(..))")

缺点:如果该切入点需要重复使用,则必须重复写多次

2.自定义方法编辑切入点

@Pointcut(value="execution(* service..*.*(..))")

public void pointcut(){}

优点:

1.可以实现切入点表达式的复用

2.方便表达式管理

注解中通知的用法:

如何获取方法的注解:

案例:

权限控制,如果该方法上添加了@privilege注解,则需要进行权限控制.

思路:

1.通过反射调用获取方法注解

2.通过切入点表达式获取

方法:

1.自定义注解

2.注解的获取

权限控制例题

1.用户应该有自己的权限列表,内部保存用户的全部权限

2.当方法执行时需要权限时会与用户列表进行匹配如果满足权限。

方法才能执行如果不满足权限,方法则不能执行

Sping IOC的更多相关文章

  1. Sping IOC容器

    Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...

  2. Sping IOC 理解(转)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  3. sping IOC和DI 初始化和关系

    springIOC和spring DI作为spring core的核心思想,有必要学习下才能更好的使用spring ========================================== ...

  4. sping IOC的设计原理和高级特性

    1. IOC 是Spring的内核,字面意思是控制反转,并提出了DI依赖注入的概念. 2.Spirng 容器的设计中,一个是实现BeanFactory 接口的简单饿汉容器,另外一个是比较高级的Appl ...

  5. sping ioc 源码分析(二)-- refresh()方法分析

    测试环境代码: @Configuration @ComponentScan("com.yang.xiao.hui.ioc") @Conditional(MyCondition.cl ...

  6. sping ioc 源码分析(一)-- register(componentClasses) 方法

    一.测试环境的搭建: public class Apple { } @Component public class MyComponet { } public class MyCondition im ...

  7. Spring源码阅读-IoC容器解析

    目录 Spring IoC容器 ApplicationContext设计解析 BeanFactory ListableBeanFactory HierarchicalBeanFactory Messa ...

  8. Spring初识及其IOC入门

    一.框架 框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度. 二.Spri ...

  9. Spring面试题汇总

    一.Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么? Spring 框架中核心组件有三个:Core.Context 和 Beans.其中最核心的组件就是Beans, Spri ...

随机推荐

  1. hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有

    今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午.......也是刚刚好复习到这里 顺便就写写 注意:一般都在多方维护关系,至于是用单向还是用 ...

  2. 获取MVC中Controller下的Action参数异常

    我现在做的一个项目有一个这样的需求, 比如有一个页面需要一个Guid类型的参数: public ActionResult Index(Guid id) { //doing something ... ...

  3. 递归调用里的性能问题(js)

    说明 这是在codewars.com上刷的一道js练习题,在此做个记录 问题描述 The Fibonacci sequence is traditionally used to explain tre ...

  4. hdu3416 Marriage Match IV(最短路+网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3416 题意: 给出含n个点.m条有向边的图,每条边只能走一次,给出起点和终点,求起点到终点的最短路径有 ...

  5. DOM树节点和事件

    一.前言:DOM树节点是JS的基础语句.通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果. 二.DOM树节点    DOM节点分为三大类: 元素节点,属性节点,文本节点  ...

  6. Linux常用命令简单总结

    Liunx常用命令 1. 文件及目录管理 1.1. ls:显示目录 参数及说明 空:补显示隐含文件 -a:显示所有文件 -l:显示详细列表 1.2. chgrp:设置文件组(root权限) 用法示例 ...

  7. [2014-08-17]Mac OSX 截图快捷键

    系统:OSX 10.9.4 内容来自网络,存于此以便查阅 基本操作 全屏截图:Command-Shift-3 指定区域截图:Command-Shift-4 指定窗口截图:Commnad-Shift-4 ...

  8. .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错

    最近在学习.NET CORE ,刚开始就遇到问题了. 安装EF框架的试试就报错, 报错如下: 错误 程序包还原失败.正在回滚“XXX”的程序包更改. 找了好久的方案,网上也没搜到对应的问题和方案,然而 ...

  9. selenium元素定位不到之iframe

    我们在使用selenium的18中定位方式的时候,有时会遇到定位不上的问题,今天我们就来说说导致定位不上的其中一个原因---iframe 问题描述:通过firebug查询到相应元素的id或name等, ...

  10. java开发3轮技术面+hr面 面经(MT)

    一直没打理博客园  发现博客园阅读量好大,就把前段时间写的一个面经也搬过来咯,大家一起加油.... 作者:小仇Eleven 链接:https://www.nowcoder.com/discuss/37 ...