开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
写在前面
作为一个java程序员,spring应该都不会陌生了吧?
对于大部分程序员来说,spring的入门,估计跑起一个框架,熟悉一下开发的流程,基本上就掌握spring框架的开发了。
随着开发年限的变大,我们不能仅仅是掌握到这个地步,更应该深入的学习spring框架。
这不,接下来就是spring框架的学习之旅了,希望可以帮助到大家。
一、AOP介绍
1.1 AOP实现之Spring AOP
1.1.1 实现原理分析
- Spring AOP是通过动态代理技术实现的
- 而动态代理是基于反射设计的。( 关于反射的知识。请自行学习)
- 动态代理技术的实现方式有两种: 基于接口的JDK动态代理 和 基于继承的CGLib动态代理。
- JDk动态代理
目标对象必须实现接口
1.使用Proxy类来生成代理对象的一些代码如下:
/**
* 使用JDK的方式生成代理对象
* @author llsydn
*/
public class MyProxyUtils {
public static UserService getProxy(final UserService service) {
//使用Proxy类生成代理对象
Userservice proxy = (userservice) Proxy.newProxyInstance(
service.getClass().getClassloader(),
service.getClass().getInterfaces(),
new InvocationHandler() {
//代理对象方法一执行,invoke方法就会执行-次
public Object invoke(object proxy, Method method, object[] args) throws Throwable {
if("save".equals(method.getName()){
system.out.println("记录日志...");
// 开启事务
}
// 提交事务
// 让service类的save或者update方法正常的执行下去
return method.invoke(service, args);
}
});
//返回代理对象
return proxy;
}
}
- cglib动态代理
目标对象不需要实现接口
底层是通过继承目标对象产生代理子对象(代理子对象中继承了目标对象的方法,并可以对该方法进行增强)
2.使用CGLIB类来生成代理对象的一些代码如下:
public static UserService getProxy(){
// 创建CGLIB核心的类
Enhancer enhancer = new Enhancer();
// 设置父类
enhancer.setSuperclass(UserServiceImpl.class);
// 设置回调函数
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(object obj, Method method, object[] args, MethodProxy methodProxy) throws Throwable {
if("save".equals(method.getName())) {
//记录日志
system.out.println("记录日志了...");
}
return methodProxy.invokeSuper(obj, args);
}
});
//生成代理对象
UserService proxy = (UserService) enhancer.create();
return proxy;
}
1.1.2 使用
- 其使用ProxyFactoryBean创建:
- 使用 aop:advisor 定义通知器的方式实现AOP需要通知类实现Advice接口
- 增强(通知)的类型有:
- 前置通知: org.springframework.aop.MethodBeforeAdvice
- 后置通知: org.springframework.aop.AfterReturningadvice
- 环绕通知: org.aopalliance.intercept.MethodInterceptor
- 异常通知: org.springframework.aop.Throwsadvice
好了,以上就是Spring学习之旅-核心高级篇(4) 的全部内容了。
今天就先到这里了,后面的内容,留下次分享了,先溜了!!!^_^
如果觉得写得不错的,帮忙点赞、评论、收藏一下呗!!!