ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring 源码:深度解析AOP源码配置解析 [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2024-6-14 21:06
标题: Spring 源码:深度解析AOP源码配置解析


  
一、 解析AOP配置的入口

1.1 从XML配置到AOP Namespace的解析流程

流程解析
1.2 分析注解驱动的AOP配置解析流程

解析流程
二、AOP配置解析的核心流程

2.1 ConfigBeanDefinitionParser 类

   ConfigBeanDefinitionParser 类是 AOP 配置的 Bean 定义解析器。负责解析 <aop:config> 标签中的配置信息,并将解析结果应用到 Spring 的 Bean 定义中。
  主要责任
2.2 parse()

根据 <aop:config> 元素及其子元素的配置信息,进行相应的解析和处置惩罚,最终将 AOP 相干的配置信息转换为 Spring 容器内部的数据布局。

2.3 parseAdvisor()

解析<advisor>元素及其子元素的配置信息,并根据解析结果注册相应的 BeanDefinition 到 Spring 容器中。

2.4 parseAspect()

负责解析 <aspect> 元素及其子元素的配置信息,并根据解析结果注册相应的 BeanDefinition 到 Spring 容器中。

2.5 parsePointcut()

解析切点元素,获取id和expression属性的值,并根据这些值创建和注册切点定义对象。

2.6 createAdvisorBeanDefinition()

根据传入的参数创建一个切面通知 Bean 定义对象,并设置相应的属性和构造器参数。

2.7 createPointcutDefinition()

创建一个切点定义的 Bean,并设置其作用域、合成标记和表达式属性值,然后返回该 Bean 定义对象。

三、设计模式

3.1 JDK 动态署理

3.2 CGLIB 署理

3.3 AOP 面向切面

四、实际与应用

   如安在实际项目中应用 Spring AOP 实现事务管理
  假设有一个 简单的订单管理体系,包含订单服务和相干的实体类。盼望在创建订单的过程中实现事务管理,即要么全部乐成,要么全部失败。
  
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.boot</groupId>
  7.     <artifactId>spring-boot-starter-aop</artifactId>
  8. </dependency>
  9. <!-- 其他依赖 -->
复制代码
  1. /**
  2. * @Entity: 这个注解表明这是一个 JPA 实体类
  3. *
  4. */
  5. @Entity
  6. public class Order {
  7.     /**
  8.      * @Id: 表示该字段是实体类的主键
  9.      * @GeneratedValue: 指定了主键的生成策略 -> GenerationType.IDENTITY:主键值会自动增加
  10.      */
  11.     @Id
  12.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  13.     private Long id;
  14.     private String orderNumber;
  15.     private double amount;
  16.     // Getters and setters
  17. }
复制代码
  1. /**
  2. * 在方法上添加 @Transactional 注解,Spring AOP 可以在方法执行前后自动管理事务的开启、提交和回滚
  3. */
  4. @Service
  5. public class OrderService {
  6.     @Autowired
  7.     private OrderRepository orderRepository;
  8.     @Transactional
  9.     public void createOrder(String orderNumber, double amount) {
  10.         Order order = new Order();
  11.         order.setOrderNumber(orderNumber);
  12.         order.setAmount(amount);
  13.         orderRepository.save(order);
  14.     }
  15. }
复制代码
  1. @SpringBootApplication
  2. @EnableTransactionManagement
  3. public class MyApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(MyApplication.class, args);
  6.     }
  7. }
复制代码
攀登顶峰,这种奋斗的自己就足以充实人的心

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4