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

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

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

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

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

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

InvocationHandler 接口扮演了类似于装饰器模式中的装饰器的角色。
InvocationHandler 接口包含了对方法的调用处理逻辑,类似于装饰器模式中的装饰器对对象进行额外的包装和处理。InvocationHandler 的实现类,可以在目标对象的方法调用前后加入额外的逻辑,从而实现类似于装饰器模式的功能。Proxy 类通过 newProxyInstance 方法动态创建代理对象。
newProxyInstance 方法可以看作是一个工厂方法,根据传入的类加载器、接口数组和 InvocationHandler 对象动态产生代理对象。InvocationHandler 中的 invoke 方法进行处理,从而实现代理的功能。如何在实际项目中应用 Spring AOP 实现事务管理
假设有一个 简单的订单管理系统,包含订单服务和相关的实体类。希望在创建订单的过程中实现事务管理,即要么全部成功,要么全部失败。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
/**
* @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
}
/**
* 在方法上添加 @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);
}
}
@EnableTransactionManagement 注解,启用事务管理。@SpringBootApplication
@EnableTransactionManagement
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
攀登顶峰,这种奋斗的本身就足以充实人的心