当前位置: 首页 > wzjs >正文

猪八戒网站建设网站设计和网站建设

猪八戒网站建设,网站设计和网站建设,免费不收费的软件app,家庭宽带做网站稳定Spring-AOP&事务 1.AOP简介 1.1概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的…

Spring-AOP&事务

1.AOP简介

1.1概念

AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程

1.2实现方案

image-20250405153435622

1.3相关概念

image-20250405153526869

2.AOP的相关配置

<!--配置目标类,内部的方法是连接点-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
<!--配置通知类,内部的方法是增强方法-->
<bean id=“myAdvice" class="com.itheima.advice.MyAdvice"/><aop:config><!--配置切点表达式,对哪些方法进行增强--><aop:pointcut id="myPointcut" expression="execution(void com.itheima.service.impl.UserServiceImpl.show1())"/><!--切面=切点+通知--><aop:aspect ref="myAdvice"><!--指定前置通知方法是beforeAdvice--><aop:before method="beforeAdvice" pointcut-ref="myPointcut"/><!--指定后置通知方法是afterAdvice--><aop:after-returning method="afterAdvice" pointcut-ref="myPointcut"/></aop:aspect>
</aop:config>

如果使用注解进行配置,使用@Component让目标类和通知类进入Spring容器。在通知类上添加@Aspect

注解@Aspect、@Around需要被Spring解析,所以在Spring核心配置文件中需要配置aspectj的自动代理

<aop:aspectj-autoproxy/>

如果使用配置类,在配置类上添加注解@EnableAspectJAutoProxy

2.1切点的配置方式

切点表达式的配置方式有两种,直接将切点表达式配置在通知上,也可以将切点表达式抽取到外面,在通知上进行引用

<aop:config><!--配置切点表达式,对哪些方法进行增强--><aop:pointcut id="myPointcut" expression="execution(void com.itheima.service.impl.UserServiceImpl.show1())"/><!--切面=切点+通知--><aop:aspect ref="myAdvice"><!--指定前置通知方法是beforeAdvice--><aop:before method="beforeAdvice" pointcut-ref="myPointcut"/><!--指定后置通知方法是afterAdvice--><aop:after-returning method="afterAdvice" pointcut="execution(void com.itheima.service.impl.UserServiceImpl.show1())"/></aop:aspect>
</aop:config>

2.2切点表达式

//表示访问修饰符为public、无返回值、在com.itheima.aop包下的TargetImpl类的无参方法show
execution(public void com.itheima.aop.TargetImpl.show())
//表述com.itheima.aop包下的TargetImpl类的任意方法
execution(* com.itheima.aop.TargetImpl.*(..))
//表示com.itheima.aop包下的任意类的任意方法
execution(* com.itheima.aop.*.*(..))
//表示com.itheima.aop包及其子包下的任意类的任意方法
execution(* com.itheima.aop..*.*(..))
//表示任意包中的任意类的任意方法
execution(* *..*.*(..))

抽取切点表达式

//切点表达式抽取
@Pointcut("execution(* com.itheima.aop.*.*(..))")
public void pointcut(){}
//前置通知
@Before("pointcut()")
public void before(JoinPoint joinPoint){}

2.3通知的类型

image-20250405153921579

各种注解方法通知类型

//前置通知
@Before("execution(* com.itheima.aop.*.*(..))")
public void before(JoinPoint joinPoint){}
//后置通知
@AfterReturning("execution(* com.itheima.aop.*.*(..))")
public void AfterReturning(JoinPoint joinPoint){}
//环绕通知
@Around("execution(* com.itheima.aop.*.*(..))")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {}
//异常通知
@AfterThrowing("execution(* com.itheima.aop.*.*(..))")
public void AfterThrowing(JoinPoint joinPoint){}
//最终通知
@After("execution(* com.itheima.aop.*.*(..))")
public void After(JoinPoint joinPoint){}

通知方法在被调用时,Spring可以为其传递一些必要的参数

image-20250405153946420

2.4配置方式

通过aop:aspect标签进行配置

还可以通过advisor标签进行配置

AOP的另一种配置方式,该方式需要通知类实现Advice的子功能接口

public interface Advice {}

image-20250405154133569

通知类实现了方法拦截器接口

public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println("前置逻辑功能...");//执行目标方法Object invoke = methodInvocation.getMethod().invoke(methodInvocation.getThis(),methodInvocation.getArguments());System.out.println("后置逻辑功能...");return invoke;}}

切面使用advisor标签配置

<aop:config><!-- 将通知和切点进行结合 --><aop:advisor advice-ref=“myMethodInterceptor" pointcut="execution(void com.itheima.aop.TargetImpl.show())"/>
</aop:config>

3.原理剖析

通过xml方式配置AOP时,我们引入了AOP的命名空间,根据讲解的,要去找spring-aop包下的META-INF,在去找spring.handlers文件

最终加载的是 AopNamespaceHandler,该Handler的init方法中注册了config标签对应的解析器

以ConfigBeanDefinitionParser作为入口进行源码剖析,最终会注册一个AspectJAwareAdvisorAutoProxyCreator进入到Spring容器中

image-20250405154508970

这个类实际上实现了BeanPostProcessor后处理器的接口

最后会调用AopProxy类中的getProxy的方法,返回一个代理对象。这个方法有两种实现

image-20250405154723058

image-20250405154729304

image-20250405155329516

4.基于AOP的声明式事务控制

4.1事务控制的分类

事务是开发中必不可少的东西,使用JDBC开发时,我们使用connnection对事务进行控制,使用MyBatis时,我们使用SqlSession对事务进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方式总会变化,Spring 就将这些技术基础上,提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制 和 声明式事务控制

image-20250405155435300

4.2事务控制的配置

结合上面我们学习的AOP的技术,很容易就可以想到,可以使用AOP对Service的方法进行事务的增强。

  • 目标类:AccountServiceImpl
  • 切点:service业务类中的所有业务方法
  • 通知类:Spring提供的,通知方法已经定义好,只需要配置即可
<!--Spring提供的事务通知-->
<tx:advice id="myAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="transferMoney"/></tx:attributes>
</tx:advice><!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><aop:config><aop:advisor advice-ref="myAdvice" pointcut="execution(* com.itheima.service.impl.*.*(..))"/>
</aop:config>

平台事务管理器PlatformTransactionManager是Spring提供的封装事务具体操作的规范接口,封装了事务的提交和回滚方法

public interface PlatformTransactionManager extends TransactionManager {TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;void commit(TransactionStatus var1) throws TransactionException;void rollback(TransactionStatus var1) throws TransactionException;
}

不同的持久层框架事务操作的方式有可能不同,所以不同的持久层框架有可能会有不同的平台事务管理器实现,例如,MyBatis作为持久层框架时,使用的平台事务管理器实现是DataSourceTransactionManager。Hibernate作为持久层框架时,使用的平台事务管理器是HibernateTransactionManager。

使用注解进行配置

@Service("accountService")
public class AccoutServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;//<tx:method name="*" isolation="REPEATABLE_READ" propagation="REQUIRED“/>@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false,timeout = 5)public void transferMoney(String decrAccountName, String incrAccountName, int money) {accountMapper.decrMoney(decrAccountName,money); //转出钱int i = 1/0; //模拟某些逻辑产生的异常accountMapper.incrMoney(incrAccountName,money); //转入钱}}

需要在xml文件中开启事务注解

<bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>

如果要使用全注解,需要配置类@EnableTransactionManagement,同时内部构造Bean并返回

4.3事务特性

其次,事务定义信息配置,每个事务有很多特性,例如:隔离级别、只读状态、超时时间等,这些信息在开发时可以通过connection进行指定,而此处要通过配置文件进行配置

<tx:attributes><tx:method name="方法名称"isolation="隔离级别"propagation="传播行为"read-only="只读状态"timeout="超时时间"/>
</tx:attributes>

image-20250405155739352

(1)isolation属性

指定事务的隔离级别,事务并发存在三大问题:脏读、不可重复读、幻读/虚读。可以通过设置事务的隔离级别来保证并发问题的出现,常用的是READ_COMMITTED 和 REPEATABLE_READ

image-20250405160545042

(2)read-only属性

设置当前的只读状态,如果是查询则设置为true,可以提高查询性能,如果是更新(增删改)操作则设置为false

(3)timeout属性

设置事务执行的超时时间,单位是秒,如果超过该时间限制但事务还没有完成,则自动回滚事务,不在继续执行。默认值是-1,即没有超时时间限制

(4)propagation属性

设置事务的传播行为,主要解决是A方法调用B方法时,事务的传播方式问题的,例如:使用单方的事务,还是A和B都使用自己的事务等。事务的传播行为有如下七种属性值可配置

image-20250405160650483

4.4原理

使用了AOP的动态代理技术,通过advisor标签进行配置,有一个通知类实现Advice的子功能接口MethodInterceptor,从而实现环绕通知(方法执行之前开启事务,执行之后提交事务)


文章转载自:

http://cmrmqmWm.rnsjp.cn
http://alfOIAOk.rnsjp.cn
http://vJSdHXEK.rnsjp.cn
http://qXJMwPkb.rnsjp.cn
http://pUUvbimC.rnsjp.cn
http://JUKByjdg.rnsjp.cn
http://XoYzdGgH.rnsjp.cn
http://qxf9VLFG.rnsjp.cn
http://fGJywlgC.rnsjp.cn
http://22Vv41dL.rnsjp.cn
http://mh5O2KbE.rnsjp.cn
http://mqrkQsNo.rnsjp.cn
http://XIFVG7nr.rnsjp.cn
http://FJDOPF24.rnsjp.cn
http://UU5wR1so.rnsjp.cn
http://qCYcw4kR.rnsjp.cn
http://xDHVPf4O.rnsjp.cn
http://SIO2iAoZ.rnsjp.cn
http://OnMKonNL.rnsjp.cn
http://ecgOe36x.rnsjp.cn
http://G0BSrf4p.rnsjp.cn
http://SKlYXE0U.rnsjp.cn
http://wdR3TCp8.rnsjp.cn
http://BNUxM9KC.rnsjp.cn
http://zakg9xFQ.rnsjp.cn
http://km5yQZHx.rnsjp.cn
http://N9ms8RIO.rnsjp.cn
http://ecrIDyCZ.rnsjp.cn
http://YRTvvdKS.rnsjp.cn
http://7RI8pFfY.rnsjp.cn
http://www.dtcms.com/wzjs/711739.html

相关文章:

  • 郑州做网站wordpress adsense integrator
  • iis7 网站无法显示该页面重庆工装公司
  • 微起点网站怎么设置的wordpress页面显示什么意思
  • 设计做的网站哪些好做个公司网站
  • 网站开发电脑配置网站建设网页设
  • 建设工程监理网站wordpress 幻灯片代码在哪里
  • 深圳企业模板建站重庆首页工程设计咨询有限责任公司
  • 合肥建站企业深圳网站建设推广公司
  • 建设银行官方网站诚聘英才频道小公司根本办不了icp许可证
  • 上海这边敲墙拆旧做啥网站的比较多商标自动生成免费软件
  • 乔柘云智能建站专门制作网页的工具
  • 网站换服务器台州网站建设解决方案
  • 嘉兴手机建站模板惠州百度seo哪里强
  • wordpress站点标题副标题换行长治百度贴吧官网
  • 德州网站建设价格互联网企业网站模板
  • 怎么看别人网站在哪里做的外链网站开发python好还是PHP好
  • 广州做网站公司培训上海比较好的seo公司
  • 玉林做网站优化推广网站建设费大概多少钱
  • 河南省建设厅网站中级职称西安中风险地区
  • 电子商务网站软件平台河南最新消息
  • 有哪些网站是做视频的广州一起做网店官网app
  • 高端网站建设网站建设设计思路免费咨询电话
  • 西安千叶网站建设合肥市网站建设
  • 知名建站公司网站建设初步认识的实训体会
  • py做网站苏宁网站优化与推广
  • 网站是否能够被恶意镜像phpstudy怎样做多个网站
  • 湖南网站制作外包宜春代做网站
  • 秦皇岛手机网站制作公司网页设计师是什么意思
  • 黄埔商城网站建设网络营销有哪些推广方法
  • 网站开发前端需要学什么教育培训机构微网站模板