Sping IOC
这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的更多相关文章
- Sping IOC容器
Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...
- Sping IOC 理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- sping IOC和DI 初始化和关系
springIOC和spring DI作为spring core的核心思想,有必要学习下才能更好的使用spring ========================================== ...
- sping IOC的设计原理和高级特性
1. IOC 是Spring的内核,字面意思是控制反转,并提出了DI依赖注入的概念. 2.Spirng 容器的设计中,一个是实现BeanFactory 接口的简单饿汉容器,另外一个是比较高级的Appl ...
- sping ioc 源码分析(二)-- refresh()方法分析
测试环境代码: @Configuration @ComponentScan("com.yang.xiao.hui.ioc") @Conditional(MyCondition.cl ...
- sping ioc 源码分析(一)-- register(componentClasses) 方法
一.测试环境的搭建: public class Apple { } @Component public class MyComponet { } public class MyCondition im ...
- Spring源码阅读-IoC容器解析
目录 Spring IoC容器 ApplicationContext设计解析 BeanFactory ListableBeanFactory HierarchicalBeanFactory Messa ...
- Spring初识及其IOC入门
一.框架 框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度. 二.Spri ...
- Spring面试题汇总
一.Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么? Spring 框架中核心组件有三个:Core.Context 和 Beans.其中最核心的组件就是Beans, Spri ...
随机推荐
- MySQL的常用SQL语句.md
修改密码 这是常见的大家一般都要用的 首先 安装成功了打开cmd --> mysql -u root -p -->输入你的密码 修改mysql root用户密码 格式 ...
- 微信app支付android客户端以及.net服务端实现
由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ...
- 【Js应用实例】javascript管理cookie
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ORACLE中seq$表更新频繁的分析
在分析ORACLE的AWR报告时,发现SQL ordered by Executions(记录了按照SQL的执行次数排序的TOP SQL.该排序可以看出监控范围内的SQL执行次数)下有一个SQL语句执 ...
- canvas粒子系统的构建
前面的话 本文将从最基本的imageData对象的理论知识说开去,详细介绍canvas粒子系统的构建 效果演示 下面是实例效果演示,博文结尾有全部源码 imageData 关于图像数据imageDat ...
- 专业运维配的vsftpd.conf
需要另外写userlist,下面的配置文件可以参考,这是使用云镜像市场的全能java环境装的机. [root@VM_1_202_centos vsftpd]# cat vsftpd.conf # Ex ...
- amoeba
Amoeba 原理:amoeba相当于业务员,处理client的读写请求,并将读写请求分开处理.amoeba和master以及slave都有联系,如果是读的请求,amoeba就从slave读取信息反馈 ...
- prop解决一个checkbox选中后再次选中失效的问题
//问题点 初始状态复选框没有全选, 点击全选按钮调用checkAll方法, 实现了全选, 然后点击全不选按钮, 实现了全不选, 然后再次点击全选按钮, 结果却木有全选, 再反复点击木有任何反应. d ...
- python常用标准库
-------------------系统内建函数------------------- 1.字符串 str='这是一个字符串数据测试数据'对应 str[0]:获取str字符串中下标为 ...
- 【javascript】谈谈HTML5 ——HTML兽进化, H5兽!
作为一名Web开发者,可能你并没有对这个“H5”这个字眼投入太多的关注,但实际上它早已不知不觉进入到你的开发中,并且总有一天会让你不得不正视它,了解它并运用它 打个比方:<海贼王>中的 ...