建设网站公开教学视频给个网站能看的
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:42
当前位置: 首页 > news >正文
建设网站公开教学视频,给个网站能看的,品牌网站建设制作,相册网站建设目的目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring Bean作用域 8.spring注解开发 9.Spring框架中AOP#xff08;Aspect Oriented Programming#xff09; 10.AOP 实现分类 11.A…目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring Bean作用域 8.spring注解开发 9.Spring框架中AOPAspect Oriented Programming 10.AOP 实现分类 11.AOP 术语 12.SM框架的整合 13.Spring中的事务 1.Spring是什么 spring 是目前主流的 Java Web 开发框架是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架具有很高的凝聚力和吸引力。 Spring 由 Rod Johnson 创立2004 年发布了 Spring 框架的第一版其目的是用于简化企业级应用程序开发的难度和周期。 Spring 是分层的 Java SE/EE 一站式轻量级开源框架以 IoCInverse of Control控制反转和 AOPAspect Oriented Programming面向切面编程为内核。 IoC 指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前对象的创建都是由我们使用 new 创建而使用 Spring 之后对象的创建都交给了 Spring 框架。AOP 用来封装多个类的公共行为将那些与业务无关却为业务模块所共同调用的逻辑封装起来减少系统的重复代码降低模块间的耦合度。另外AOP 还解决一些系统层面上的问题比如日志、事务、权限等 2.Spring 框架特点 1方便解耦简化开发 Spring 就是一个大工厂可以将所有对象的创建和依赖关系的维护交给 Spring 管理。 2方便集成各种优秀框架 Spring 不排斥各种优秀的开源框架其内部提供了对各种优秀框架如 Struts2、Hibernate、MyBatis 等的直接支持。 3降低 Java EE API 的使用难度 Spring 对 Java EE 开发中非常难用的一些 APIJDBC、JavaMail、远程调用等都提供了封装使这些 API 应用的难度大大降低。 4方便程序的测试 Spring 支持 JUnit4可以通过注解方便地测试 Spring 程序。 5AOP 编程的支持 Spring 提供面向切面编程可以方便地实现对程序进行权限拦截和运行监控等功能。 6声明式事务的支持 只需要通过配置就可以完成对事务的管理而无须手动编程 3.Spring体系结构 Spring 框架采用分层的理念根据功能的不同划分成了多个模块这些模块大体可分为 Data Access/Integration数据访问与集成、Web、AOP、Aspects、Instrumentation检测、Messaging消息处理、Core Container核心容器和 Test。如下图所示以下是 Spring Framework 4.x 版本后的系统架构图 上图中包含了 Spring 框架的所有模块这些模块可以满足一切企业级应用开发的需求在开发过程中可以根据需求有选择性地使用所需要的模块
- Data Access/Integration数据访问集成 数据访问集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块具体介绍如下。 JDBC 模块提供了一个 JBDC 的样例模板使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制而且能享受到 Spring 管理事务的好处。 ORM 模块提供与流行的“对象-关系”映射框架无缝集成的 API包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理无需额外控制事务。 OXM 模块提供了一个支持 Object /XML 映射的抽象层实现如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据或者将XML 数据映射成 Java 对象。 JMS 模块指 Java 消息服务提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMSJMS 用于用于在两个应用程序之间或分布式系统中发送消息进行异步通信。 Transactions 事务模块支持编程和声明式事务管理。
- Web模块 Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Portlet 组件具体介绍如下。 Web 模块提供了基本的 Web 开发集成特性例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。 Servlet 模块提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签完全无缝与 Spring 其他技术协作。 WebSocket 模块提供了简单的接口用户只要实现响应的接口就可以快速的搭建 WebSocket Server从而实现双向通讯。 Portlet 模块提供了在 Portlet 环境中使用 MVC 实现类似 Web-Servlet 模块的功能。
- Core ContainerSpring的核心容器 Spring 的核心容器是其他模块建立的基础由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成没有这些核心容器也不可能有 AOP、Web 等上层的功能。具体介绍如下。 Beans 模块提供了框架的基础部分包括控制反转和依赖注入。 Core 核心模块封装了 Spring 框架的底层部分包括资源访问、类型转换及一些常用工具类。 Context 上下文模块建立在 Core 和 Beans 模块的基础之上集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。 SpEL 模块提供了强大的表达式语言支持支持访问和修改属性值方法调用支持访问及修改数组、容器和索引器命名变量支持算数和逻辑运算支持从 Spring 容器获取 Bean它也支持列表投影、选择和一般的列表聚合等。
- AOP、Aspects、Instrumentation和Messaging 在 Core Container 之上是 AOP、Aspects 等模块具体介绍如下 AOP 模块提供了面向切面编程实现提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术并且能动态的把这些功能添加到需要的代码中这样各司其职降低业务逻辑和通用功能的耦合。 Aspects 模块提供与 AspectJ 的集成是一个功能强大且成熟的面向切面编程AOP框架。 Instrumentation 模块提供了类工具的支持和类加载器的实现可以在特定的应用服务器中使用。 messaging 模块Spring 4.0 以后新增了消息Spring-messaging模块该模块提供了对消息传递体系结构和协议的支持。
- Test模块 Test 模块Spring 支持 Junit 和 TestNG 测试框架而且还额外提供了一些基于 Spring 的测试功能比如在测试 Web 框架时模拟 Http 请求的功能。 4.Spring开发环境搭建 使用 Spring 之前需要安装 JDK、Tomcat 和 Eclipse 下载Apache Common Logging API Common Logging 是使用 Spring 的必要组件。Apache Common Logging API 下载地址Apache Commons Logging - Download Apache Commons Logging 下载完成后将压缩包解压到相应位置。该文件包含以下 jar 文件和其它支持文档目录结构如下。 下载Spring Spring 下载地址JFrog 该文件目录结构如下 在 libs 目录中包含了 Spring 框架提供的所有 jar 文件其中有 4 个 jar 文件是 Spring 框架的基础包分别对应 Spring 容器的四个模块具体如表 2 所示。 使用 Spring 框架时只需将 Spring 的 4 个基础包以及 commons-logging-1.2.jar 包复制到项目的 lib 目录并发布到类路径中即可 第一个Spring程序 1.创建maven的javaweb项目 2.引入配置文件 5.spring中IOC和DI IoC 容器是 Spring 的核心也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化以及对象从创建到销毁的整个生命周期。 Spring 中使用的对象都由 IoC 容器管理不需要我们手动使用 new 运算符创建对象。由 IoC 容器管理的对象称为 Spring BeanSpring Bean 就是 Java 对象和使用 new 运算符创建的对象没有区别。 Spring 通过读取 XML 或 Java 注解中的信息来获取哪些对象需要实例化。Spring 提供 2 种不同类型的 IoC 容器即 BeanFactory 和 ApplicationContext 容器
- BeanFactory 容器 BeanFactory 是最简单的容器由 org.springframework.beans.factory.BeanFactory 接口定义采用懒加载lazy-load所以容器启动比较快。BeanFactory 提供了容器最基本的功能配置文件加载时不会创建对象在获取bean时才会创建对象 为了能够兼容 Spring 集成的第三方框架如 BeanFactoryAware、InitializingBean、DisposableBean所以目前仍然保留了该接口。简单来说BeanFactory 就是一个管理 Bean 的工厂它主要负责初始化各种 Bean并调用它们的生命周期方法。BeanFactory 接口有多个实现类 org.springframework.beans.factory.xml.XmlBeanFactory最常见 使用 BeanFactory 需要创建 XmlBeanFactory 类的实例通过 XmlBeanFactory 类的构造函数来传递 Resource 对象。如下所示。 Resource resource new ClassPathResource(applicationContext.xml); BeanFactory factory new XmlBeanFactory(resource);
- ApplicationContext 容器
ApplicationContext 继承了 BeanFactory 接口由 org.springframework.context.ApplicationContext 接口定义对象在启动容器时加载。ApplicationContext 在 BeanFactory 的基础上增加了很多企业级功能例如 AOP、国际化、事件支持等。
ApplicationContext 接口有两个常用的实现类具体如下。
1ClassPathXmlApplicationContext
该类从类路径 ClassPath 中寻找指定的 XML 配置文件并完成 ApplicationContext 的实例化工作具体如下所示。
ApplicationContext applicationContext new ClassPathXmlApplicationContext(String configLocation);
配置文件加载则创建对象
在上述代码中configLocation 参数用于指定 Spring 配置文件的名称和位置如 Beans.xml。
2FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的 XML 配置文件并完成 ApplicationContext 的实例化工作具体如下所示。
ApplicationContext applicationContext new FileSystemXmlApplicationContext(String configLocation);
二者的主要区别在于如果 Bean 的某一个属性没有注入使用 BeanFacotry 加载后第一次调用 getBean() 方法时会抛出异常而 ApplicationContext 则会在初始化时自检这样有利于检查所依赖的属性是否注入。
因此在实际开发中通常都选择使用 ApplicationContext只有在系统资源较少时才考虑使用 BeanFactory。 spring容器加载多个配置文件 1.使用字符串参数逗号分隔 2.使用字符串数组 3.使用导入 Spring Bean定义
由 Spring IoC 容器管理的对象称为 BeanBean 根据 Spring 配置文件中的信息创建。
可以把 Spring IoC 容器看作是一个大工厂Bean 相当于工厂的产品如果希望这个大工厂生产和管理 Bean则需要告诉容器需要哪些 Bean以及需要哪种方式装配 Bean。
Spring 配置文件支持两种格式即 XML 文件格式和 Properties 文件格式。 Properties 配置文件主要以 key-value 键值对的形式存在只能赋值不能进行其他操作适用于简单的属性配置。 XML 配置文件是树形结构相对于 Properties 文件来说更加灵活。XML 配置文件结构清晰但是内容比较繁琐适用于大型复杂的项目。
通常情况下Spring 的配置文件使用 XML 格式。XML 配置文件的根元素是 beans该元素包含了多个子元素 bean。每一个 bean 元素都定义了一个 Bean并描述了该 Bean 如何被装配到 Spring 容器中bean 元素中可以包含很多属性其常用属性如下表所示。
属性名称描述idBean 的唯一标识符Spring 容器对 Bean 的配置和管理都通过该属性完成。id 的值必须以字母开始可以使用字母、数字、下划线等符号。namename 属性中可以为 Bean 指定多个名称每个名称之间用逗号或分号隔开。Spring 容器可以通过 name 属性配置和管理容器中的 Bean。class该属性指定了 Bean 的具体实现类它必须是一个完整的类名即类的全限定名。scope用于设定 Bean 实例的作用域属性值可以为 singleton单例、prototype原型、request、session 和 global Session。其默认值是 singletonconstructor-argbean元素的子元素可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号从 0 开始type 属性指定构造参数的类型propertybean元素的子元素用于调用 Bean 实例中的 setter 方法来属性赋值从而完成依赖注入。该元素的 name 属性用于指定 Bean 实例中相应的属性名refproperty 和 constructor-arg 等元素的子元索该元素中的 bean 属性用于指定对某个 Bean 实例的引用valueproperty 和 constractor-arg 等元素的子元素用于直接指定一个常量值list用于封装 List 或数组类型的依赖注入set用于封装 Set 类型的依赖注入map用于封装 Map 类型的依赖注入entrymap 元素的子元素用于设置一个键值对。其 key 属性指定字符串类型的键值ref 或 value 子元素指定其值init-method容器加载 Bean 时调用该方法类似于 Servlet 中的 init() 方法destroy-method容器删除 Bean 时调用该方法类似于 Servlet 中的 destroy() 方法。该方法只在 scopesingleton 时有效lazy-init懒加载值为 true容器在首次请求时才会创建 Bean 实例值为 false容器在启动时创建 Bean 实例。该方法只在 scopesingleton 时有效
IOC创建对象的方式
1.无参构造器创建对象 默认
2.有参构造创建对象 使用下标传递参数 使用数据类型传递参数 通过属性名传递参数 创建对象时属性的其它注入方式
set注入
bean idstudentService classcn.kgc.spring.service.StudentServiceImpl!– 属性是引用类型 赋值时使用ref–property namestudentDao refstudentDao/!– 属性是基本类型 String类型 Date类型 赋值时使用value –property nameage value20/property namestuName value张三/property nameprice value20.4/property namescore value80.3/property namebirth value2021/8/13/property namestr arrayvalue张三/valuevalue李四/valuevalue王五/value/array/propertyproperty namelislistvalue抽烟/valuevalue喝酒/valuevalue烫头/value/list/property!– spring容器中组件默认都是单例的 全局共享一个对象–property namelis2listref beanstudentDao/refref beanstudentDao/refref beanstudentDao/ref/list/propertyproperty namebookssetvaluejava/valuevaluephp/valuevaluec#/value/set/propertyproperty namescoresmapentry keymath value89 /entryentry keyenglish value90 /entryentry keyjava value80 /entry/map/propertyproperty namemapmapentry key01 value-refstudentDao/entryentry key02 value-refstudentDao/entryentry key03 value-refstudentDao/entry/map/propertyproperty namepspropsprop keydrivercom.mysql.jdbc.Driver/propprop keyurljdbc:mysql:///mybatis/propprop keyusernameroot/propprop keypasswordrooot/prop/props/property/bean 使用set注入每个属性必须含有对应的set方法否则无法进行属性的注入
Spring的依赖注入之p命名空间和c命名空间
p命名空间是set注入的一种快捷实现方式想要使用p命名空间注入需要注意一下几点。 实体类中必须有set方法 实体类中必须有无参构造器默认存在 必须导入p命名空间注入方式依赖。
xml依赖代码 导入后即可使用 c命名空间是构造器注入的一种快捷实现方式想要使用c命名空间需要注意一下几点。 实体类中必须存在有参构造器 必须导入c命名空间注入方式依赖。
xml依赖代码 导入后即可使用 类型转换器的使用
作用自定义注入参数和实体类中类型的匹配方式
import org.springframework.core.convert.converter.Converter;public class MyConverter implements ConverterString, Date {Overridepublic Date convert(String source) {SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd);try {Date parse simpleDateFormat.parse(source);return parse;} catch (ParseException e) {e.printStackTrace();}return null;}
} Bean的自动装配
1.autowirebyName在容器的上下文中寻找与类中属性对应的set方法名字相同的id属性值进行装配 bean idteacher classcn.kgc.spring.entity.Teacherproperty namename value李老师/property nameteaNo value001//beanbean idclassRoom1 classcn.kgc.spring.entity.ClassRoomproperty nameaddress value学思楼1楼/property nameclassNo value1//beanbean idstudent classcn.kgc.spring.entity.Student autowirebyName /bean 2.autowirebyType在容器的上下文中寻找与类中属性类型相同的Bean进行装配 3.使用注解自动装配
1.导入context约束 2.开启注解支持 获取配置文件中的值
public class Aoo {Value(\({test.boolean})private Boolean testBoolean;Value(\){test.string})private String testString;Value(\({test.integer})private Integer testInteger;Value(\){test.long})private Long testLong;Value(\({test.float})private Float testFloat;Value(\){test.double})private Double testDouble;Value(#{\({test.array}.split(,)})private String[] testArray;Value(#{\){test.list}.split(,)})private ListString testList;Value(#{\({test.set}.split(,)})private SetString testSet;Value(#{\){test.map}})private MapString, Object testMap;}配置文件 properties
spring中复杂对象的创建 1.FactoryBean public class ConnectionFactoryBean implements FactoryBeanConnection {Overridepublic Connection getObject() throws Exception {Class.forName(com.mysql.jdbc.Driver);Connection connection DriverManager.getConnection(jdbc:mysql:///java2215?serverTimezoneUTC, root, root);return connection;}Overridepublic Class? getObjectType() {return Connection.class;}Overridepublic boolean isSingleton() {return false;} } 6.Spring中bean的生命周期 1.singleton 容器启动的时候创建对象容器正常关闭时销毁对象 2.prototype 获取对象的时候创建对象spring容器不负责对象的销毁 生命周期的过程 1.调用无参创建对象 2.调用set方法初始化属性 3.调用初始化方法 4.对象创建完成使用对象 5.关闭容器调用销毁的方法 7.Spring Bean作用域 在配置文件中除了可以定义 Bean 的属性值和相互之间的依赖关系还可以声明 Bean 的作用域。例如如果每次获取 Bean 时都需要一个 Bean 实例那么应该将 Bean 的 scope 属性定义为 prototype如果 Spring 需要每次都返回一个相同的 Bean 实例则应将 Bean 的 scope 属性定义为 singleton。 作用域的种类 Spring 容器在初始化一个 Bean 实例时同时会指定该实例的作用域。Spring 5 支持以下 6 种作用域。 1singleton 默认值单例模式表示在 Spring 容器中只有一个 Bean 实例Bean 以单例的方式存在。 2prototype 原型模式表示每次通过 Spring 容器获取 Bean 时容器都会创建一个 Bean 实例。 3request 每次 HTTP 请求容器都会创建一个 Bean 实例。该作用域只在当前 HTTP Request 内有效。 4session 同一个 HTTP Session 共享一个 Bean 实例不同的 Session 使用不同的 Bean 实例。该作用域仅在当前 HTTP Session 内有效。 5application 同一个 Web 应用共享一个 Bean 实例该作用域在当前 ServletContext 内有效。 类似于 singleton不同的是singleton 表示每个 IoC 容器中仅有一个 Bean 实例而同一个 Web 应用中可能会有多个 IoC 容器但一个 Web 应用只会有一个 ServletContext也可以说 application 才是 Web 应用中货真价实的单例模式。 6websocket websocket 的作用域是 WebSocket 即在整个 WebSocket 中有效 8.spring注解开发 1.开启注解的包扫描 2.常用的注解 四个注解的功能是一样的只是使用不同的注解可以看出层次结构 3.作用域注解 9.Spring框架中AOPAspect Oriented Programming 1.代理模式讲解 作用 通过代理类为原始类增加额外的功能 代理分类 1.1静态代理 静态代理优缺点 1优点 在不修改目标对象的功能前提下能通过代理对象对目标功能扩展 2缺点 因为代理对象需要与目标对象实现一样的接口所以会很多代理类 ,一旦接口增加方法目标对象与代理对象都要维护 开发代理对象的原则 1.代理对象和目标对象实现相同的接口 2.代理对象依赖于目标对象 1.2动态代理反射 程序运行的过程中通过jdk提供代理技术动态的为某个类产生动态代理对象的过程 开发代理对象的原则 1代理对象不需要实现接口但是目标对象要实现接口否则不能用JDK动态代理。 2代理对象的生成是利用JDK的API动态的在内存中构建代理对象。 3动态代理也叫做 JDK代理、接口代理 Testpublic void test4() { //jdk的动态代理// 被代理对象UserServiceImpl userService new UserServiceImpl();InvocationHandler handler new InvocationHandler() {/*** param proxy 生成的代理对象 可忽略* param method 原始对象中的方法* param args 原始对象中的参数* return* throws Throwable*/Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(——log———);Object invoke method.invoke(userService, args);return invoke;}};/*参数1类加载器动态代理对象没有类加载器 需要借助别的类的加载器实现类的加载* 类加载器的作用* 1.加载class文件到JVM虚拟机* 2.创建类的class对象进而创建类的实例化对象 参数2:原始类实现的所有接口 基于jdk的动态代理要求代理对象和原始对象要实现相同的接口** 参数3代理对象额外增加的功能 InvocationHandler/UserService o (UserService) Proxy.newProxyInstance(TestStaticProxy.class.getClassLoader(), userService.getClass().getInterfaces(), handler);o.login();o.register();}基于CGLib的动态代理 开发代理对象的原则 1.代理对象无需和原始类对象实现相同的接口 2.代理对象和原始类对象要存在父子类关系 实现步骤 Testpublic void test5(){ //基于cglib的动态代理UserServiceImpl userService new UserServiceImpl();Enhancer enhancer new Enhancer();enhancer.setClassLoader(this.getClass().getClassLoader());enhancer.setSuperclass(userService.getClass());//设置额外的功能MethodInterceptor callback new MethodInterceptor() {//等价于 jdk代理中 invocationHandler 中的 invoke 方法/* param o 代理对象* param method 原始对象中的方法* param objects 原始对象中的参数* param methodProxy 代理方法* return 原始方法的返回值* throws Throwable*/Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(———cglib log————);return method.invoke(userService, objects);}};enhancer.setCallback(callback);// 创建代理对象UserService usrService (UserService) enhancer.create();usrService.login();usrService.register();}2.AOP概述 AOP为Aspect Oriented Programming的缩写是面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续是软件开发中的一个热点也是Spring框架中的一个重要内容是函数式编程的一种衍生范型 AOP可以分离业务代码和关注点代码重复代码在执行业务代码时动态的注入关注点代码。切面就是关注点代码形成的类。Spring AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类并且要求被代理的类必须实现一个接口 10.AOP 实现分类 AOP 要达到的效果是保证开发者不修改源代码的前提下去为系统中的业务组件添加某种通用功能按照 AOP 框架修改源代码的时机可以将其分为两类 静态 AOP 实现 AOP 框架在编译阶段对程序源代码进行修改生成了静态的 AOP 代理类生成的 *.class 文件已经被改掉了需要使用特定的编译器比如 AspectJ。 动态 AOP 实现 AOP 框架在运行阶段对动态生成代理对象在内存中以 JDK 动态代理或 CGlib 动态地生成 AOP 代理类如 SpringAOP 11.AOP 术语 连接点JointPoint) :与切入点匹配的执行点在程序整个执行流程中可以织入切面的位置方法的执行前后异常抛出的位置 切点(PointCut) : 在程序执行流程中真正织入切面的方法。 切面(ASPECT) :切点通知就是切面 通知(Advice) :切面必须要完成的工作也叫增强。即它是类中的一个方法方法中编写织入的代码。 前置通知 后置通知 环绕通知 异常通知 最终通知 目标对象(Target) ;被织入通知的对象 代理对象(Proxy) :目标对象被织入通知之后创建的新对象 快速使用 1.基于接口形式实现spring自身对于aop的实现 使用Spring aop接口方式实现aop, 可以通过自定义通知来供Spring AOP识别对应实现的接口是: 前置通知: MethodBeforeAdvice 返回通知:AfterReturningAdvice 异常通知:ThrowsAdvice 环绕通知:MethodInterceptor 通知的类型 Spring 方面可以使用下面提到的五种通知工作 通知描述前置通知在一个方法执行之前执行通知。最终通知在一个方法执行之后不考虑其结果执行通知。后置通知在一个方法执行之后只有在方法成功完成时才能执行通知。异常通知在一个方法执行之后只有在方法退出抛出异常时才能执行通知。环绕通知在一个方法调用之前和之后执行通知。 案例 业务接口 实现类 实现接口定义通知类 配置方式 基于Aspectj实现AOP操作 1.基于xml配置文件 2.基于注解的形式实现 切入点表达式 作用声明对哪个类中的哪个方法进行增强 语法 execution[访问权限修饰符] 返回值 [ 类的全路径名 ] 方法名 (参数列表)[异常] 访问权限修饰符 可选项不写就是四个权限都包含 写public就表示只包括公开的方法 返回值类型 必填项 * 标识返回值任意 全限定类名 可选项两个点 .. 表示当前包以及子包下的所有类省略表示所有类 方法名 必填项 * 表示所有的方法 set*表示所有的set方法 形参列表 必填项 表示没有参数的方法 ..)参数类型和参数个数随意的方法 *只有一个参数的方法 String 第一个参数类型随意第二个参数String类型 异常信息 可选项 省略时标识任何异常信息 方式2定义切面类 public class PointCut {//前置通知public void beforeMethod(){System.out.println(开启事务);}//后置通知 切点方法正常执行之后执行public void afterMethod(){System.out.println(关闭事务);}//环绕通知public void around(ProceedingJoinPoint jp) {try {System.out.println(——环绕前——);Object proceed jp.proceed();System.out.println(——环绕后——);} catch (Throwable throwable) {throwable.printStackTrace();System.out.println(异常通知);}finally {System.out.println(最终通知);}}//最终通知 无论切点方法是否正常执行 都会在其后执行public void fy(){System.out.println(最终通知);}//异常通知 和后置通知永远只能执行一个public void exceptionMethod(){System.out.println(异常通知);}} 使用xml配置方式实现aop 注解方式实现aop Component Aspect public class PointCut2 {//前置通知Before(execution( cn.kgc.spring.service.StudentServiceImpl.(..)))public void beforeMethod(){System.out.println(开启事务);}//后置通知 切点方法正常执行之后执行AfterReturning(execution( cn.kgc.spring.service.StudentServiceImpl.(..)))public void afterMethod(){System.out.println(关闭事务);}//环绕通知Around(execution( cn.kgc.spring.service.StudentServiceImpl.(..)))public void around(ProceedingJoinPoint jp){try {System.out.println(——环绕前——);Object proceed jp.proceed();System.out.println(——环绕后——);} catch (Throwable throwable) {throwable.printStackTrace();System.out.println(异常通知);}finally {System.out.println(最终通知);}}//最终通知 无论切点方法是否正常执行 都会在其后执行After(execution( cn.kgc.spring.service.StudentServiceImpl.(..)))public void fy(){System.out.println(最终通知);}//异常通知 和后置通知永远只能执行一个AfterThrowing(execution( cn.kgc.spring.service.StudentServiceImpl.(..)))public void exceptionMethod(){System.out.println(异常通知);} } 通用切点的定义方式 12.SM框架的整合 1.引入依赖 dependencies !– mysql驱动–dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.44/version/dependency!–druid–dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.10/version/dependency !–mybatis–dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency!–IOC 依赖注入–dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.9/version/dependency!–mybatisspring 整合包–dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.5/version/dependency!–aspects 切面–dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.3.9/version/dependency!–jdbc–dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.3.9/version/dependency!–lombok–dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.16/version/dependency!– 日志工具–dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency!–mybatis分页插件–dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.2.1/version/dependency !–测试工具–dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency/dependencies 2.配置spring的文件 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd!–引入外部的数据源配置文件–context:property-placeholder locationdb.properties/!–配置druid数据库连接池–bean iddruid classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value\({jdbc.driver}/property nameurl value\){jdbc.url}/property nameusername value\({jdbc.username}/property namepassword value\){jdbc.password}//bean!–sqlSessionFactory–bean idssf classorg.mybatis.spring.SqlSessionFactoryBean!– 配置数据源–property namedataSource refdruid/!– 注入mybatis的核心配置文件–property nameconfigLocation valueclasspath:mybatis-config.xml/!–mapper映射文件–property namemapperLocations valueclasspath:mapper/.xml//bean!–扫描所有的接口–bean classorg.mybatis.spring.mapper.MapperScannerConfigurer!–扫描所有的接口生成代理对象注入spring容器–property namebasePackage valuecn.kgc.spring.dao//bean /beans 3.配置mybatis文件 ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configuration settings!–开启字段的驼峰命名–setting namemapUnderscoreToCamelCase valuetrue/!–开启日志–setting namelogImpl valueLOG4J/ /settings!–设置实体类的别名–typeAliasespackage namecn.kgc.mybatis.entity//typeAliases!– 分页配置–pluginsplugin interceptorcom.github.pagehelper.PageInterceptor!– 配置mysql方言 –property namehelperDialect valuemysql /!– 设置为true时如果pageSize0就会查询出全部的结果 –property namepageSizeZero valuetrue /!– 3.3.0版本可用分页参数合理化默认false禁用 –!– 启用合理化时如果pageNum1会查询第一页如果pageNumpages会查询最后一页 –!– 禁用合理化时如果pageNum1或pageNumpages会返回空数据 –property namereasonable valuetrue //plugin/plugins /configuration 日志文件 (log4j.properties) 4.编写测试类 测试 13.Spring中的事务 1.配置式事务 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:contexthttp://www.springframework.org/schema/contextxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd!– 注入事务管理器–bean iddataSourceTransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdruid//bean!–配置事务通知– tx:advice idtx transaction-managerdataSourceTransactionManagertx:attributestx:method namesave/tx:method namedelete//tx:attributes /tx:advice!–配置事务的aop–aop:configaop:pointcut idservicePoint expressionexecution(* cn.kgc.spring.service..(..))/aop:advisor advice-reftx pointcut-refservicePoint//aop:config /beans 2.声明式事务 事务传播方式 事务最重要的两个特性是事务的传播级别和数据隔离级别。传播级别定义的是事务的控制范围事务隔离级别定义的是事务在数据库读写方面的控制范围。 事务传播方式演示 1、PROPAGATION_REQUIRED 说明如果当前没有事务就新建一个事务如果已经存在一个事务中加入到这个事务中。 演示 public interface UserMapper{Integer deleteById(int id); } public interface EmpMapper {Integer deleteByEmpNo(String empno); }public interface EmpService {Integer deleteByEmpNo(String empno); }Service public class EmpServiceImpl implements EmpService {Autowiredprivate EmpMapper empMapper;/*** 根据员工编号删除员工信息* param empno* return*/Transactional(propagation Propagation.REQUIRED)Overridepublic Integer deleteByEmpNo(String empno) {Integer integer empMapper.deleteByEmpNo(empno);if(integer 1 ){throw new RuntimeException();}return integer;} }public interface UserService {int deleteById(int id); }// 实现类 Service public class UserServiceImpl implements UserService{Autowiredprivate UserMapper userMapper;Autowiredprivate EmpService empService;Transactional(propagation Propagation.REQUIRED)Overridepublic int deleteById(int id) {Integer line userMapper.deleteById(id);Integer integer empService.deleteByEmpNo(7698);return lineinteger;} } 结果 2、PROPAGATION_SUPPORTS 说明支持当前事务如果当前没有事务就以非事务方式执行。 3、PROPAGATION_REQUIRES_NEW 说明新建事务如果当前存在事务把当前事务挂起
- 上一篇: 建设网站服务怎么制作网页快捷方式
- 下一篇: 建设网站公司浩森宇特小程序公司开发排名
相关文章
-
建设网站服务怎么制作网页快捷方式
建设网站服务怎么制作网页快捷方式
- 技术栈
- 2026年03月21日
-
建设网站服务器自营方式建设银行纪检监察网站
建设网站服务器自营方式建设银行纪检监察网站
- 技术栈
- 2026年03月21日
-
建设网站费怎么入账张家港普通网站建设
建设网站费怎么入账张家港普通网站建设
- 技术栈
- 2026年03月21日
-
建设网站公司浩森宇特小程序公司开发排名
建设网站公司浩森宇特小程序公司开发排名
- 技术栈
- 2026年03月21日
-
建设网站公司价格完整的网站建设
建设网站公司价格完整的网站建设
- 技术栈
- 2026年03月21日
-
建设网站公司哪好深圳广告标识设计公司
建设网站公司哪好深圳广告标识设计公司
- 技术栈
- 2026年03月21日


