【spring源码学习】spring的AOP面向切面编程的实现解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口。在spring aop中主要描述围绕方法调用而注入的切面行为。(2)spring定义了几个时刻织入增强行为的接口  =>org.

一:Advice(通知)
(1)定义在连接点做什么,为切面增强提供织入接口。在spring aop中主要描述围绕方法调用而注入的切面行为。
(2)spring定义了几个时刻织入增强行为的接口
  =>org.springframework.aop.BeforeAdvice
   org.springframework.aop.MethodBeforeAdvice
  =>org.springframework.aop.AfterAdvice
   org.springframework.aop.AfterReturningAdvice
  =>org.springframework.aop.ThrowsAdvice

二:PointCut(切点)
(1)决定Advice应该作用那些连接点。也就是说通过PointCut来定义需要增强的方法集合。
(2)spring定义的PointCut的接口
  =>org.springframework.aop.Pointcut
  =>org.springframework.aop.TruePointcut
  => org.springframework.aop.support.JdkRegexpMethodPointcut
(3)相关接口。PointCut接口会返回两个对象,一个ClassFilter,一个是MethodMatcher
  =>org.springframework.aop.ClassFilter    
  =>org.springframework.aop.TrueClassFilter

  =>org.springframework.aop.MethodMatcher  匹配当前方法是否需要执行增强逻辑,也就是是否需要执行Advice接口的方法。
  =>org.springframework.aop.TrueMethodMatcher

三:通知器皿(Advisor)
  (1)完成对目标方法的切面增强设计(advice)和关注点的设计(PoinCut)以后,需要一个对象把他们结合起来,完成这个作用的就是(Advisor)
  (2)spring定义的Advisor接口
  =>org.springframework.aop.Advisor
  =>org.springframework.aop.support.DefaultPointcutAdvisor

  (3)Advisor的控制器的接口
  =>org.springframework.aop.framework.adapter.AdvisorAdapter
  =>org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter  目标方法执行完执行该增强的控制器
  =>org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter  目标方法未执行前执行该增强的控制器
  =>org.springframework.aop.framework.adapter.ThrowsAdviceAdapter   目标方法执行过程抛出异常执行该增强的控制器

四:springAop的相关
  (1)springAop的核心技术是动态代理。动态代理的技术是jdk的一个特征。
  (2)springAop的代理对象生成案例
    =>org.springframework.aop.framework.ProxyFactoryBean
    =>org.springframework.aop.framework.ProxyFactory


五:ProxyFactoryBean的工作流程。
(1)实现FactoryBean接口的类,在想IOC容器申请bean的时候,其实返回的是该类执行getObject()方法的返回。
(2)ProxyFactoryBean的getObject()方法返回的是目标对象的代理对象。
  其执行过程
  =>根据配置的interceptorNames的属性值先初始化代理增强的链子.根据interceptorNames从IOC容器中得到增强类的bean,然后判断其类型,形成DefaultPointcutAdvisor对象。
  =>根据配置的targetName属性值从IOC容器中得到目标对象的bean,形成一个SingletonTargetSource对象。
  =>将其本身作为一个aop代理对象创建的数据配置类,创建一个动态代理对象,返回给ioc容器申请。
(3)在执行目标对象的方法过程中,会根据执行的方法的对象,从代理链子里找到所有的Advisor对象,然后利用其属性Pointcut对象获取ClassFilter, MethodMatcher来判断当前Advisor是否要执行。如果执行,则加入执行代理链子中。以jdk动态代理为例子,是org.springframework.aop.framework.JdkDynamicAopProxy类中invoke(Object proxy, Method method, Object[] args)方法中这句代码List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);。该句代码中this.advised其实就是ProxyFactoryBean本身。

 

六案例

一:Advice的对象

package com.mobile.thinks.aop.advice;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class LoginBeforeAdvice implements MethodBeforeAdvice{

    @Override
    public void before(Method method, Object[] args, Object target)throws Throwable {
        System.out.println("LoginBeforeAdvice.before()执行方法为==>"+method.getName());
        System.out.println("LoginBeforeAdvice.before()执行参数为==>"+args);
        System.out.println("LoginBeforeAdvice.before()执行的目标为==>"+target.getClass());
    }
    
    

}
View Code

二:目标对象

package com.mobile.thinks.service.impl;

import java.util.Date;

import org.springframework.stereotype.Service;

import com.mobile.thinks.entity.User;
import com.mobile.thinks.service.UserInfoService;

@Service(value="userInfoServiceImpl")
public class UserInfoServiceImpl implements UserInfoService{

    
    @Override
    public User loginByUserNameAndPassWord(String userName, String passWord) {
        User user=new User();
        
        user.setAddress("三门峡");
        user.setAge(28);
        user.setCreateTime(new Date());
        user.setName(userName);
        return user;
    }

    
}
View Code

三:配置文件

 <!-- 测试ProxyFactoryBean -->
       <!--定义一个advice  -->
       <bean name="loginBeforeAdvice" class="com.mobile.thinks.aop.advice.LoginBeforeAdvice" />
    <!-- 定义FactoryBean -->
    <bean name="userInfoService" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 要代理的目标对象,在ioc容器中的名字 -->
        <property name="targetName">
            <value>userInfoServiceImpl</value>
        </property>
        <!-- 要植入增强功能的advice在IOC容器中的名字 -->
        <property name="interceptorNames">
            <list><value>loginBeforeAdvice</value></list>
        </property>
    </bean>
View Code

 

七:spring内部基于该中方式实现动态代理的案例。spring提供的HttpInvoker远程调用.可以阅读该类getObject方法。实现对Facade接口代理

org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean

相关文章
|
7天前
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
3天前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
9 2
|
6天前
|
负载均衡 Java 应用服务中间件
学习aop以及nginx
学习AOP和Nginx的最好方式是通过实践。你可以尝试在你的项目中使用这些技术,或者找一些在线教程进行学习。
13 1
|
7天前
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
11天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
|
12天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
18 3
|
12天前
|
JavaScript Java 数据安全/隐私保护
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码
22 0
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)
|
13天前
|
设计模式 缓存 程序员
Spring6(三):面向切面AOP(1)
Spring6(三):面向切面AOP(1)
14 1
|
13天前
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
7天前
|
XML 监控 Java
如何在Spring Boot中使用AOP
如何在Spring Boot中使用AOP

推荐镜像

更多