Java : Spring基础 AOP
简单的JDK动态代理例子(JDK动态代理是用了接口实现的方式)(ICar是接口, GoogleCar是被代理对象, MyCC是处理方法的类):
public class TestCar {
public static void main(String[] args) {
ICar car = (ICar) Proxy.newProxyInstance(TestCar.class.getClassLoader(), GoogleCar.class.getInterfaces(), new MyCC());
car.start();
car.run();
}
}
class MyCC implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("start")) {
System.out.println("do something...");
}
method.invoke(new GoogleCar(), args);
return null;
}
}
===============================================================================
简单的cglib动态代理例子(cglib是用了继承的方式实现动态代理):
public class CglibProxy implements MethodInterceptor {
private CustomerDao customerDao;
public CglibProxy(CustomerDao customerDao) {
this.customerDao = customerDao;
}
public CustomerDao createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(customerDao.getClass());// 设置父类
enhancer.setCallback(this);//设置回调,也就是处理的类,这里因为自身实现了这个接口,重写intercept方法
return (CustomerDao) enhancer.create();//创建代理对象
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("增强方法...");
return methodProxy.invokeSuper(o, objects);
}
}
===============================================================================
springAOP是基于AspectJ(静态代理)和Cglib(动态代理)的
专业术语:
Joinpoint(连接点): 指的是可以被拦截到的点,比如一个类里面有四个方法,这四个方法都可以被拦截并增加功能,这四个方法都叫做连接点.
Pointcut(切入点): 真正被拦截到的点,如果四个方法只有一个被拦截并增强了, 这个方法就叫切入点.
Advice(通知/增强): 对一个方法进行增强或者权限校验的方法被称为 Advice. 方法层面的增强(在方法前后增强)
Introduction(引介): 类层面的增强, 比如动态加个属性,加个方法
Target: 被增强的对象(被代理的对象).
Weaving(织入): 将Advice应用到Target的过程,简单来说就是增强或者校验的过程.
Proxy(代理): 代理对象,生成的代理对象.
Aspect(切面): 多个通知和多个切入点的组合,称为一个切面.
spring通知类型:
前置通知: 在目标方法之前进行操作
后置通知: 在目标方法之后进行操作
环绕通知: 在执行之前和之后进行操作
异常抛出通知: 出现异常的时候进行的操作
最终通知: 无论代码是否有异常,总会进行操作,相当于finally代码块
引介通知:.....暂时不了解
===============================================================================
XML方式(其中MyAspectXML是权限校验的类,里面的checkPri是权限校验方法,需要在ProductDaoImpl.save方法前执行):
<bean id="productDao" class="com.smile.myweb.ProductDaoImpl"/>
<bean id="myAspectXML" class="com.smile.myweb.MyAspectXML"/>
<aop:config>
<aop:pointcut id="pointcut1" expression="execution(* com.smile.myweb.ProductDaoImpl.save(..))"/>
<aop:aspect ref="myAspectXML">
<aop:before method="checkPri" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
===============================================================================
注解方式 需要开启配置 <aop:aspectj-autoproxy/>
然后把需要增强的类和代理类都加入IOC 在代理类上面添加@Aspect注解,在增强上面使用@Before或@AfterReturing等注解,如:
@Aspect
public class MyAspectAnno {
@Before(value = "execution(* com.smile.myweb.OrderDao.save(..))")
public void before() {
System.out.println("前置通知~~~");
}
}
@Before 前置通知 例子略
@AfterReturing 后置通知 后置通知可以接受返回值,使用注解里面的 returning 参数:
---------------------------------------------------------------------------------------
@AfterReturning(value = "execution(* com.smile.myweb.OrderDao.save(..))", returning = "result")
public void after(Object result) {
System.out.println("后置通知~~~");
System.out.println(result);
}
@Around 环绕通知
------------------------------------------------------------------------------------------
@Around(value = "execution(* com.smile.myweb.OrderDao.save(..))")
public void after(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前~");
Object object = joinPoint.proceed();// 执行的方法 object为返回值
System.out.println("环绕后~");
System.out.println(object);
}
@AfterThrowing 异常抛出通知 有异常抛出的时候才会执行:
-----------------------------------------------------------------------------------------
@AfterThrowing(value = "execution(* com.smile.myweb.OrderDao.save(..))", throwing = "e")
public void after(Throwable e){
System.out.println("异常" + e.getMessage());
}
@After 最终通知 例子略
========================================================================
切入点注解: @Pointcut 如果有很多个通知作用于同一个方法,那么只需要声明一个空方法,加上这个注解,然后在别的通知的注解的value值写上 类名.方法名() 就可以了 如:
-------------------------------------------------------------------------------------------
@After(value = "MyAspectAnno.pointcut1()")
public void after(){
System.out.println("最终通知");
} @Pointcut(value = "execution(* com.smile.myweb.OrderDao.save(..))")
private void pointcut1() {}
try{
try{ //@Before method.invoke(..); }finally{ //@After } //@AfterReturning}catch(){ //@AfterThrowing}Java : Spring基础 AOP的更多相关文章
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- Spring基础——AOP通知
spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上.是spring组件中的某个方法.无返回类型.参数类型与通知类型有关.一个切面 开启数据库 关闭数据库 开启事务 检 ...
- Java : Spring基础 IOC
使用 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml" ...
- Java基础-SSM之Spring的AOP编程
Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- Java回顾之Spring基础
第一篇:Java回顾之I/O 第二篇:Java回顾之网络通信 第三篇:Java回顾之多线程 第四篇:Java回顾之多线程同步 第五篇:Java回顾之集合 第六篇:Java回顾之序列化 第七篇:Java ...
- Spring基础知识之基于注解的AOP
背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法 ...
- Spring基础篇——Spring的AOP切面编程
一 基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...
- 第65节:Java后端的学习之Spring基础
Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...
随机推荐
- 个人发现的createProcess调用漏洞
现在的杀毒软件都会杀掉c盘下的program.exe程序,所以某种意义上而言,这个漏洞算不上“漏洞”. 问题描述 眼睛护士版本:3.0.18.301存在createProcess调用漏洞. 详细说明 ...
- 自学git心得-1
Github作为目前世界上最先进的分布式版本控制系统,是软工工作者管理工程代码的不二选择,笔者也是因时所需,自学了基本的git操作,在此回顾一下也作为分享. 推荐学习资源:https://www.li ...
- 使用Python批量合并PDF文件(带书签功能)
网上找了几个合并pdf的软件,发现不是很好用,一般都没有添加书签的功能. 又去找了下python合并pdf的脚本,发现也没有添加书签的功能的. 于是自己动手编写了一个小工具,使用了PyPDF2. 下面 ...
- l2tp over ipsec
搭建教程: 转自: https://segmentfault.com/a/1190000006125737 http://www.wangyuxiong.com/blog/ti-yan-qiang-w ...
- shell命令详解
sed命令 将文本input.txt中含有”姓名”字符串的行中的谢朝辉替换成扎巴依 sed -e '/姓名/s/谢朝辉/扎巴依/g' input.txt 将input.txt中第n(5)行替换成”ji ...
- 索引反向使用案例,加index_desc hint
drop index idx_t;create index idx_t on t(owner desc,object_type asc); select /*+index(a,idx_t)*/ * f ...
- 工作好搭档(一):松林 SL-B3 人体工学椅
本人从事码农这行职业,已经整整十年零九天,十年一觉如旧梦,仿佛昨天还在SARS. 2008年,我累到腰痛,脖子痛,怎么休息也不见好,去中医院检查,医生诊断,坐的太久,坐姿不对,运动少,轻度颈椎,腰肌劳 ...
- SAP CRM One order里user status和system status的mapping逻辑
Below example show: How the mapping relationship between User status and System status maintained in ...
- DB TABLE实践
我的数据库设计实践(一) 兜兜转转,突然发现我现在已经是一个老司机了,一直写代码都很忙,没有把很多点点滴滴的记录下来,今天开始就开始一个系列,分析当年我接触或者我设计过的表结构,有好有坏,有欢喜也 ...
- WAS8.5安装和部署
刚研究WAS8.5的安装部署,写一些注意事项: 1.下载安装软件 安装器:agent.installer.linux.gtk.x86_64_1.7.2000.20140227_0303 WAS: WA ...