这个可以看我之前的文章:当我变成一个服务员和售货员教你一分钟了解并学废Spring AOP!!!
二、Spring框架的AOP的底层实现
Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种
基于JDK的动态代理
必须是面向接口的,只有实现了具体接口的类才能生成代理对象
基于CGLIB动态代理
- 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
- Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
- 如果实现类接口,使用JDK动态代理完成AOP
- 如果没有实现接口,采用CGLIB动态代理完成AOP
- 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
- Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
- 如果实现类接口,使用JDK动态代理完成AOP
- 如果没有实现接口,采用CGLIB动态代理完成AOP
基于Spring的AOP简单实现
注意一下,在讲解之前,说明一点:使用Spring AOP,要成功运行起代码,只用Spring提供给开发者的jar包是不够的,请额外上网下载两个jar包:
- aopalliance.jar
- aspectjweaver.jar
三、通过配置的方式实现aop通知效果
xml配置
<bean id="logger" class="com.ahpome.company.utils
[video(video-8PGqMbZO-1716354551447)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=1804892953)(image-https://img-blog.csdnimg.cn/img_convert/d03a705143646f4f3f6ea879d59b2788.png)(title-必看视频!获取2024年最新Java开发全套学习资料 备注Java)]
.Logger" />
<aop:config>
<aop:aspect id="loggerAspect" ref="logger"> // 定义切面 aspect
<aop:pointcut id="loggerRef" expression="execution(\* com.ahpome.company..\*.\*(..)) and !bean(logger)" /> //定义 切入点
<aop:around method="record" pointcut-ref="loggerRef" /> //通知 环绕通知 :around;前置通知 :before;后置通知:after;最终通知:after-returning;异常通知:after-throwing
</aop:aspect>
</aop:config>
logger.java
public Object record(ProceedingJoinPoint pjp){
Log log = new Log();
try {
log.setOperator("admin");
String mname = pjp.getSignature().getName();
log.setOperName(mname);
Object[] args = pjp.getArgs();
log.setOperParams(Arrays.toString(args));
//执行目标方法,返回的是目标方法的返回值,本例中 void
Object obj = pjp.proceed();
if(obj != null){
log.setResultMsg(obj.toString());
}else{
log.setResultMsg(null);
}
log.setOperResult("success");
System.out.println("1111");
return obj;
} catch (Throwable e) {
log.setOperResult("failure");
log.setResultMsg(e.getMessage());
} finally{
// logService.saveLog(log);
}
return null; 注意:这里如果是返回null即使你调用的时候返回是null,即使你的方法中含有返回值
}
}
JDK动态代理
接口
public interface UserService {
void save();
int select();
}
接口实现类
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户信息成功");
}
@Override
public int select() {
System.out.println("查询用户信息成功");
return 10;
}
}
JDK动态代理工厂类
public class JdkProxyFactory implements InvocationHandler {
private Object target;
public JdkProxyFactory(Object target) {
this.target = target;
}
/\*\*
\* 获取代理对象,当前类继承InvocationHandler
\*
\* @return
\*/
public Object getProxyObject() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//添加功能
System.out.println("增强代码,添加日志功能");
### 最后
小编精心为大家准备了一手资料
![](https://img-blog.csdnimg.cn/img_convert/64e10ea7f3292a2fda76116767140472.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/55bd577b37da24f2be329c35cdb83e65.webp?x-oss-process=image/format,png)
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
1. BAT面试的20道高频数据库问题解析
2. Java面试宝典
3. Netty实战
4. 算法
![](https://img-blog.csdnimg.cn/img_convert/b523ec5ef1fd81ca6b616e4b71f46f0c.webp?x-oss-process=image/format,png)
**BATJ面试要点及Java架构师进阶资料**
![](https://img-blog.csdnimg.cn/img_convert/776152d1e4c729a1ba3b729ca4542d33.webp?x-oss-process=image/format,png)
ookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
1. BAT面试的20道高频数据库问题解析
2. Java面试宝典
3. Netty实战
4. 算法
[外链图片转存中...(img-MubFuXwy-1716399484197)]
**BATJ面试要点及Java架构师进阶资料**
[外链图片转存中...(img-uRqY1IJr-1716399484197)]