

流程解析:
<aop:config>、<aop:aspect>、<aop:pointcut>、<aop:before>等 。schema 头文件来解析配置。<aop:aspect> 元素时,会创建对应的切面,并指定切面的 ID 和引用的 bean。<aop:before>、<aop:after> 等元素时,会创建对应的通知,并指定通知要执行的方法。<aop:pointcut> 元素时,Spring 会创建一个切点,并指定切点的 ID 和表达式。JDK动态代理。CGLIB 动态代理。解析流程:
@Aspect 注解标记的类,并将其识别为切面类。@Before、@After、@Around 等注解的方法,这些注解表示切面的通知类型。@Pointcut 注解,用于定义切点表达式,Spring 会解析这些表达式并创建切点。@Before、@After、@Around 等注解的方法,并将其作为通知,与对应的切点关联。ConfigBeanDefinitionParser 类是 AOP 配置的 Bean 定义解析器。负责解析
<aop:config>标签中的配置信息,并将解析结果应用到 Spring 的 Bean 定义中。
主要责任:
<aop:config> 标签及其子标签中的配置信息,包括切面定义、通知类型、切点表达式等。根据 <aop:config> 元素及其子元素的配置信息,进行相应的解析和处理,最终将 AOP 相关的配置信息转换为 Spring 容器内部的数据结构。

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

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

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

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

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

InvocationHandler 接口扮演了类似于装饰器模式中的装饰器的角色。InvocationHandler 接口包含了对方法的调用处理逻辑,类似于装饰器模式中的装饰器对对象进行额外的包装和处理。InvocationHandler 的实现类,可以在目标对象的方法调用前后加入额外的逻辑,从而实现类似于装饰器模式的功能。Proxy 类通过 newProxyInstance 方法动态创建代理对象。newProxyInstance 方法可以看作是一个工厂方法,根据传入的类加载器、接口数组和 InvocationHandler 对象动态产生代理对象。InvocationHandler 中的 invoke 方法进行处理,从而实现代理的功能。如何在实际项目中应用 Spring AOP 实现事务管理
假设有一个 简单的订单管理系统,包含订单服务和相关的实体类。希望在创建订单的过程中实现事务管理,即要么全部成功,要么全部失败。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 其他依赖 -->2.定义订单实体类 Order 。
/**
* @Entity: 这个注解表明这是一个 JPA 实体类
*
*/
@Entity
public class Order {
/**
* @Id: 表示该字段是实体类的主键
* @GeneratedValue: 指定了主键的生成策略 -> GenerationType.IDENTITY:主键值会自动增加
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
private double amount;
// Getters and setters
}3.定义订单服务类 OrderService,并添加创建订单的方法。
/**
* 在方法上添加 @Transactional 注解,Spring AOP 可以在方法执行前后自动管理事务的开启、提交和回滚
*/
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public void createOrder(String orderNumber, double amount) {
Order order = new Order();
order.setOrderNumber(orderNumber);
order.setAmount(amount);
orderRepository.save(order);
}
}4.配置事务管理:在 Spring Boot 主类上添加 @EnableTransactionManagement 注解,启用事务管理。
@SpringBootApplication
@EnableTransactionManagement
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}攀登顶峰,这种奋斗的本身就足以充实人的心
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。