spring AOP
AOP概述
AOP面向切面编程是对面向对象编程的延续(AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。)
面向切面编程思想是将程序中非业务代码(提交事务,打印日志,权限验证,统一异常处理)提取分离出来,通过代理对象帮助我们调用这些提取出来的非业务代码,在业务代码中不用显示调用非业务代码,最终做到了也业务代码与非业务代码的分离,降低了耦合度。
面向切面编程,是实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。
原理:动态代理模式
AOP编程思想是java中的,不是spring专有的是spring使用了这一编程思想
实现
首先导入jar包
AspectJ 是一个基于 Java 语言的 AOP 框架,它提供了强大的 AOP 功能,且其实
现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又
将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
开启自动代理,在spring文件里面开启自动代理
创建自动代理的类,加入注解标签,
@before在运行连接点方法之前执行,传入参数为在com.ffyc.spring.dao.adminDao类下面的所有的方法,都是切入点,(..)里面传入的参数不定,最前面的*表示方法返回值任意。
@after是在运行后执行,无论前面出现没有异常
运行结果
@AfterThrowing 运行时出现错误执行,通过throwing可以得到异常出现的原因
@AfterReturning 运行时出现异常不进行执行
@around环绕通知
运行结果
spring事务管理
概述
事务管理本质上是数据库提供的一种管理机制(数据库事务管理就是对一次数据库操作过程中执行的多条语句进行管理,保证一次对数据库操作过程中多条 sql 要么都执行成功,要么都不执行,从而确保数据一致性.)
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求
Spring事务管理是spring框架对事务提交这一功能进行封装,程序员在业务开发中不需要显示提交事务。
Spring 中的事务管理分为两种形式:
- 编程式事务
需要程序员自己在代码里面控制事务触发和回滚
- 声名式事务
声名式事务底层使用了AOP思想,可以为方法添加事务功能,他的控制是方法级别的
Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.
实现
1.配置事务管理
需要提交事务的方法上面加上注解@Transactional
没有出现异常的话事务会正常提交,出现异常的话事务会发生回滚,要么全发生,要么都不发生。需要注意的事情是如果此方法加上了@AfterThrowing 运行时出现错误执行,通过throwing可以得到异常出现的原因 或者 加上了@around环绕通知 会对@Transactional事务提交造成影响,他们会对异常进行捕获,@Transactional就不知道方法里面执行错误了,还会提交错误的事务。
@Transactiona可以添加在方法上面,也可以添加到类上面,添加到类上面,此类里面所有的方法都会被提交事务所管理。
一般情况下,@Transactiona都添加在service层
声名事务失效场景
- @Transactiona用在了非public方法上面
同一包下面,默认的格式可以调用
添加@Transactiona注解,要么全部提交要么全不提交,运行结果确是提交了一条,出现异常未发生回滚,没有触发事务。
- 方法中异常被捕获了,@Transactiona认为方法上面没有异常
发生异常被捕获后@Transactiona认为方法上面没有异常其实已经出错了,事务提交也只是提交了一条数据,没有全部提交
2.方法中出现编译器异常,还是会提交事务
@Transactional(rollbackFor = Exception.class)这样就可以,出现编译器异常事务就不会提交了。
- 编译器异常也会影响@Transactiona提交事务
- 数据库引擎不支持提交事务 mysql中只有innodb支持提交事务
spring_web搭建
Ssm框架
早期ssm=spring+strtuts2+mybatis ssh
现在 ssm=spring+springweb+mybatis
搭建
1.导包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.在web.xml配置spring核心请求分发器
在spring.xml中开启web层注解
<!--开启web层注解-->
<mvc:annotation-driven></mvc:annotation-driven>
3.部署tomcat
写一个测试
Springweb运行流程
Springweb组件
前端控制器:DispatcherServlet(不需要程序员开发),由框架提供,在web.xml 中配置。
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求.
处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的 url 查找 Handler(处理器/Controller)
处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。
处理器:Handler(也称之为 Controller,需要工程师开发)。
注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可
以去正确执行 Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。