【Spring】Spring全面详解(二)--什么是spring spring的三大核心概念?(超详细建议收藏慢慢看)

本文主要是介绍【Spring】Spring全面详解(二)--什么是spring spring的三大核心概念?(超详细建议收藏慢慢看),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring


文章目录

  • Spring
    • 第四章
      • 1、Aop---面向切面编程
        • 通知类型
          • **1、前置通知**
          • **2、后置通知**
          • **3、异常通知**
          • 4、环绕通知
        • 目前存在的问题
        • 解决方案
          • 【解决方案1:配置自动代理】
          • 【解决方案2:配置声明式代理】
          • 【解决方案3:采用注解的方式配置代理】
    • 第五章
      • 1、spring与mybatis集成
        • 1、整合
        • 2、优化
        • 3、消除警告
        • 4、锁定版本号
        • 5、整合之后
          • 区别:
        • 6、事务的配置步骤
        • 7、事务配置的优化
          • 【解决方案1】
          • 【解决方案2】
    • 第六章
      • 1、spring事务配置优化
        • 1、spring事务
        • 2、开发中最常见的两种事务配置方式
          • 第一种:声明式事务
          • 第二种:注解事务
      • 1、spring事务配置优化
        • 1、spring事务
        • 2、开发中最常见的两种事务配置方式
          • 第一种:声明式事务
          • 第二种:注解事务

第四章

1、aop
2、spring与mybatis集成
3、spring中的事务处理

1、Aop—面向切面编程

通知类型
	1、前置通知: 它是在业务逻辑代码执行之前由系统自动调用2、后置通知: 它是在业务逻辑代码执行之后由系统自动调用3、异常通知: 它是在业务逻辑代码执行过程中,产生异常时由系统自动调用(它与后置通知属于平级关系,二者只执行其一)				4、环绕通知: 它相当于前置+后置通知,它会把业务代码的执行过程包含在通知中
1、前置通知
	特点:前置通知中的代码,将会自动在业务逻辑代码之前自动调用前置通知的要求:1、通知类需要实现接口MethodBeforeAdvicepublic class BeforeAdvice implements MethodBeforeAdvice {}2、重写接口的before方法public void before(Method method, Object[] args, Object targetClass) throws Throwable {}
2、后置通知
	特点:前置通知中的代码,将会自动在业务逻辑代码之后自动调用后置通知的要求:1、通知类需要实现接口AfterReturningAdvicepublic class AfterAdvice implements AfterReturningAdvice {}2、重写接口的afterReturning方法public void afterReturning(Object returnValue, Method method, Object[] args, Object targetClass) throws Throwable {}//后置通知多了一个参数(返回的数据)
3、异常通知

(异常通知与后置通知属于平级,二者只会触发一个)

	特点:异常通知中的代码,它会在业务逻辑类执行过程中产生异常时自动调用(其他类产生的异常,异常通知并不触发)异常通知的要求:1、通知类需要实现接口ThrowsAdvice注意:这个接口比较特殊,接口中并没有方法,它是一个标识性接口,标识当前是一个异常通知public class MyThrowsAdvice implements ThrowsAdvice {}2、编写方法(格式不能随便写)public void afterThrowing(Method method, Object[] args, Object targetClass,Exception ex){}

【实际应用】

	1、编写MyThrowsAdvice类实现ThrowsAdvice接口2、编写方法afterThrowingpublic void afterThrowing(Method method, Object[] args, Object targetClass, Exception ex){System.out.println("---------------------进入异常通知--------------------");System.out.println("产生异常的业务逻辑类:"+targetClass.getClass());System.out.println("产生异常的方法:"+method.getName());System.out.println("产生异常的原因:"+ex.getMessage());System.out.println("---------------------离开异常通知--------------------");}3、注册后置通知<!--注册异常通知--><bean id="throws" class="org.java.advice.myThrowsAdvice"/>4、在代理模式中配置异常<!-- 2、代理附加的额外功能--><property name="interceptorNames"><list><value>before</value><value>after</value><value>throws</value></list></property>

image-20230616170451868

4、环绕通知
特点:环绕通知是把业务逻辑代码运行的整个过程,包含在通知中环绕通知的要求:1、通知类需要实现接口 MethodInterceptorpublic class RoundAdvice implements MethodInterceptor {}2、重写接口的方法public Object invoke(MethodInvocation methodInvocation) throws Throwable {return null;}

【实际应用】

1、编写RoundAdvice类实现MethodInterceptor接口2、重写接口的方法invoke@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println();System.out.println("--------------------进入环绕通知-----------------------");System.out.println("即将访问的业务类:"+methodInvocation.getThis().getClass());System.out.println("即将访问的业务方法:"+methodInvocation.getMethod().getName());System.out.println("即将传递的参数:"+ Arrays.toString(methodInvocation.getArguments()));System.out.println("--------------------准备离开环绕通知,进入业务逻辑类-------");System.out.println();//此方法执行后,就会进入业务类逻辑类,返回的obj即为业务方法发返回结果Object obj = methodInvocation.proceed();System.out.println();System.out.println("--------------------回到环绕通知,继续环绕-----------------------");System.out.println("业务类返回的结果是:"+obj);System.out.println("--------------------离开环绕通知-----------------------");return obj;}3、注册后置通知<!--注册环绕通知--><bean id="round" class="org.java.advice.roundAdvice"/>4、在代理模式中配置环绕通知//由于环绕通知就是前置通知+后置通知,因此,在附加功能上只需要配置环绕通知即可<!--配置代理--><bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"><!--  1、指定代理的业务接口--><property name="proxyInterfaces"><value>org.java.service.buyBookService</value></property><!-- 2、代理附加的额外功能--><property name="interceptorNames"><list><value>throws</value><value>round</value></list></property><!--3、功能附加完成后要访问的业务类--><property name="target" ref="buyBookService"/></bean>

目前存在的问题
【问题】:
1、当前代理类只能对1个业务类进行代理,如果有1000个业务类,就需要配置1000个代理类
2、配置了代理类以后,只有访问代理类才能附加功能,如果直接访问业务类的名称,AOP的功能无法附加
解决方案
【解决方案1:配置自动代理】
特点:1、不用单独的配置代理,系统会根据访问的业务类的名称自动生成代理 2、访问时,直接访问业务类的名称即可,不用访问代理的名称 
缺点:value里面的业务类还是需要写一千次a、在applicationContext.xml文件配置自动代理 <!--    配置自动代理--><bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><!--1、指定访问哪些业务类的时候,自动创建代理--><property name="beanNames"><list><value>buyBookService</value><value>buyBookService2</value><value>buyBookService3</value></list></property><!--2、指定要代理要附加的功能--><property name="interceptorNames"><list><value>before</value><value>after</value><value>mythrows</value></list></property></bean>b、访问时,直接访问业务类的名称即可,不用访问代理类BuyBookService bookService = (BuyBookService) cxt.getBean("buyBookService");
【解决方案2:配置声明式代理】
 @@@特点:对指定包下面的所有业务类自动形成代理 1、编写通知类(注意:这种通知类不需要实现任何接口)public class MyAdvice {/*** 前置通知* JoinPoint:通过它可以获得当前要访问的业务类的名称 ,方法名,参数*/public void before(JoinPoint joinPoint){System.out.println("-------进入前置通知------------");System.out.println("即将访问的业务类是:"+joinPoint.getTarget().getClass());System.out.println("即将访问的业务方法:"+joinPoint.getSignature().getName());System.out.println("传递的参数有:"+ Arrays.toString(joinPoint.getArgs()));System.out.println("-------离开前置通知------------");}//后置通知类public void after(JoinPoint joinPoint, Object obj) {//obj:返回值System.out.println();System

这篇关于【Spring】Spring全面详解(二)--什么是spring spring的三大核心概念?(超详细建议收藏慢慢看)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958046

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使