spring核心之横向切面编程aop

本文深入探讨Spring框架中的AOP(面向切面编程)概念及其应用,对比面向对象编程,解析AOP如何通过横切关注点提升代码的可重用性和可维护性。同时,详述了Spring事务管理机制,包括事务的ACID特性、隔离级别以及如何通过Spring的PlatformTransactionManager进行事务控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、spring核心之 aop(重点)
aop: Aspect Oriented Programming 面向切面编程 ,是一种思想。
oop: Object Orinted programming 面向对象编程 ,是一个思想。

  总结:
        oop:纵向抽取
        好处:1)提高可重用性
                    2)提高可扩展和可维护
                    3)多态
        aop:横向向抽取
        好处:1)提高可重用性
                    2)提高可扩展和可维护

二、aop怎么玩?
aop底层原理:动态代理技术 jdk动态代理和cglib动态代理

    代理========>经纪人、中介

三、动态代理(重点)
黑客入侵
1)jdk黑客: 只能入侵实现接口的对象。 针对接口实现类
jdk接口:InvocationHandler
2)cglib黑客:针对类(aspect包—spring提供的)
aopalliance: MethodInteceptor 当类实现接口内部用的jdk黑客 如果类没有实现接口 使用cglib动态代理

四、aop的术语
连接点
切点
通知/增强
切面
植入

五、mybatis的事务控制
1、mybatis的事务:JDBC|Manage 默认不会自动提交。

    2、spring集成mybatis的事务:事务默认是自动提交。
    mybatis-spring-xxx.jar包
    
    本质:将事务交给了spring管理

六、事务
3.1.事务:
3.1.1.事务概念
事务:是逻辑上一组操作,要么全都成功,要么全都失败.
事物目的就是解决数据不一致的问题。

3.1.2.事务特性:
3.1.2.1.ACID:
        原子性:事务不可分割
        一致性:事务执行的前后,数据完整性保持一致.
        隔离性:一个事务执行的时候,不应该受到其他事务的打扰
        持久性:一旦结束,数据就永久的保存到数据库.

3.1.2.2.事务3类读问题
如果不考虑隔离性,事务由3类读问题
脏读 :一个事务读到另一个事务未提交数据
不可重复读 :一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结
果不一致
虚读 :一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果 不一致

3.1.2.3.事务的隔离级别:
设置事务的隔离级别,从某种程度上可以有效解决事务特性引起的3类读问题

        未提交读:以上情况都有可能发生。
        已提交读:避免脏读,但不可重复读,虚读是有可能发生。
        可重复读:避免脏读,不可重复读,但是虚读有可能发生。
        串行的:避免以上所有情况.

3.2.Spring中事务管理:
分层开发:事务处在Service层.
3.2.1.Spring提供事务管理API:
3.2.1.1.PlatformTransactionManager:平台事务管理器.
commit(TransactionStatus status)
getTransaction(TransactionDefinition definition)
rollback(TransactionStatus status)
3.2.1.2.TransactionDefinition:事务定义
ISOLation_XXX:事务隔离级别.
PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)
过期时间:
3.2.1.3.TransactionStatus:事务状态
是否有保存点
是否一个新的事务
事务是否已经提交
3.2.1.4.三者关系
PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.
3.2.2.API详解:
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或iBatis 进行持久化数据时使用

        org.springframework.orm.hibernate3.HibernateTransactionManager  使用Hibernate3.0版本进行持久化数据时使用
        
        org.springframework.orm.jpa.JpaTransactionManager       使用JPA进行持久化时使用
        
        org.springframework.jdo.JdoTransactionManager   当持久化机制是Jdo时使用
        
        org.springframework.transaction.jta.JtaTransactionManager
            使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

七、spring事务的实现
1、手动事务(演示 了解)
接口: DataSourceTransactionManager
事务管理模板类:transactionTemplate

第1步:业务的层的哪些方法需要事务(黑客)。
UserInfoServiceImpl1.zz(int from ,int to ,int money);
第2步:xml中配置事务管理器 (不同的orm框架 事务管理的方式不同)
(orm框架:mybatis,hibernate,jpa,jdbcTemplate…)



第3步:在业务类定义TransatcionTemplate事务模板类
new TransatcionTemplate(事务管理器);

第4步:在需要事务管理的方法中
transactionTemplate.execute(new TransactionCallbackWithoutResult() {

            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    updateOperation1();//持久层操作1   扣二狗子的300
                    updateOperation2();//持久层操作2   增加付自强300
                } catch (SomeBusinessException ex) {
                    status.setRollbackOnly();
                }
            }
        });

第5步:测试,调用业务类的方法
@Autowired

private IUserInfoService iUserInfoService;
@Test
public void testZZ() {
    iUserInfoService.zz(1, 200, 300);//没有代理  调用的就是目标对象的目标方法
}

2、申明式事务(开发)

第1步:业务的层的哪些方法需要事务(黑客)。
UserInfoServiceImpl1.zz(int from ,int to ,int money);
第2步:xml中配置事务管理器 (不同的orm框架 事务管理的方式不同)
(orm框架:mybatis,hibernate,jpa,jdbcTemplate…)



第3步:xml配置中定义切面

<tx:advice id=“ndAdvice” transaction-manager=“txTransaction”>
tx:attributes

<tx:method name=“zz*” />

<tx:method name="*" read-only=“true”/>
</tx:attributes>
</tx:advice>
第4步:xml配置根据切点+增强 ,自动生成业务方法的代理对象

手动事务与申明式事务区别?
1.手动式针对单个方法进行增强,如果有多个方法,每个方法都要手动调用transactionTemplate
2. 声明式事务通过aop的原理进行增强方法的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值