皮皮网

【编程猫源码编程器怎么用】【迷你编程源码学校】【什么叫指标源码】springjdk源码分析

来源:英魂之刃源码 时间:2024-12-24 08:26:34

1.springjdkԴ?码分????
2.springboot哪个版本稳定?
3.Spring事件监听机制
4.spring—AOP与事务

springjdk源码分析

springjdkԴ?????

       详细,包含知识点多的码分,你可以看看动力节点java基础视频大全。码分里面有很多深入且精彩的码分讲解,比如源码分析分析讲的码分特别到位,尤其是码分编程猫源码编程器怎么用HashMap的工作原理和源码分析,真正的码分把jdk源码翻了一遍,要是码分拿着这个去面试绝对是秒杀级神器。

springboot哪个版本稳定?

       springboot2.0.0.m2是码分什么版本

       Release表示是正式的版本.

       RCstandsforReleaseCandidate表示后选版本

       Mstandsformilestone表示里程碑版本.

       一般而言,稳定性由上而下,依次降低.

       ,

       springboot快速入门及@SpringBootApplication注解分析

       简单demo

       使用maven构建项目,官方现在稳定版本是码分1.5.4,第一个入门demo不是码分web项目,pom依赖如下:

       实体User类:

       配置类:

       入口类Application:

       项目结构目录

       启动程序,码分以main方法启动:

       打印出正确的码分结果。

       来分析一下流程,码分为何Runnable类,码分User,Map会纳入spring容器。

       首先我们分析的迷你编程源码学校就是入口类Application的启动注解@SpringBootApplication,进入源码:

       发现@SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。

       根据上面的理解,上面的入口类Application,我们可以使用:

       使用@ComponentScan注解代替@SpringBootApplication注解,也可以正常运行程序。原因是@SpringBootApplication中包含@ComponentScan,并且springboot会将入口类看作是一个@SpringBootConfiguration标记的配置类,所以定义在入口类Application中的Runnable也可以纳入到容器管理。

       看一个demo学会使用这些参数配置

       在包下com.zhihao.miao.springboot定义一个启动应用类(加上@SpringBootApplication注解)

       在com.zhihao.miao.beans包下定义一个实体类,并且想将其纳入到spring容器中,

       启动启动类,打印结果如下:

       说明Cat类并没有纳入到spring容器中,这个结果也如我们所想,因为@SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的什么叫指标源码类(特定注解标记,比如说@Controller,@Service,@Component,@Configuration和@Bean注解等等)纳入到spring容器,很显然MyConfig不在@SpringBootApplication注解标记类相同包下及其子包的类,所以需要我们去配置一下扫包路径。

       修改启动类,@SpringBootApplication(scanBasePackages="com.zhihao.miao"),指定扫描路径:

       启动并打印:

       当然使用@SpringBootApplication(scanBasePackageClasses=MyConfig.class),指定scanBasePackageClasses参数的value值是你需要扫描的类也可以,结果一样,不过如果多个配置类不在当前包及其子包下,则需要指定多个。

       再看一个列子,

       在上面的列子的相同包下(com.zhihao.miao.springboot)配置了People,并将其纳入到spring容器中(@Component),我们知道@SpringBootApplication注解会扫描当前包及其子包,所以People类会纳入到spring容器中去,云端存储html源码我们需要将其排除在spring容器中,如何操作?

       可以使用@SpringBootApplication的另外二个参数(exclude或excludeName)

       启动类,

       启动并打印结果:

       然后修改@SpringBootApplication配置,

       很明显启动报错。使用@excludeName注解也可以。如下,

       @SpringBootApplication(excludeName={ "com.zhihao.miao.springboot.People"})

       参考文档:

       Springboot1.5.4官方文档

springboot1.5,2.1+jdk8,jdk的内存占用对比

       对新的技术学习探索是一件快乐而有趣的事情。

       最近关注了springboot最新版本2.1.1,jdk。然后准备把手头的学习项目升级一下。

       那么为什么不用jdk而使用jdk?我的判断很简单,因为jdk是LTS版本啊。

       那么升级总得有个差异,所以简单的通过项目版本变更对比下内存耗用情况。

       首先介绍下我的项目:

       springboot1.5.+swagger+undertow+spring-orm4.3.3+jdk1.8

       当前版本内存耗费截图如下:

       启动时间:StartedJdyXcxApiin4.seconds(JVMrunningfor5.)

       内存情况:堆内存中的初试内存堆大小M,使用M,超过的短信开源源码时候回收了一下

       开始升级springboot:

       springboot2.1.1+swagger+undertow+spring-orm5.1.4+jdk1.8

       启动时间:StartedJdyXcxApiin3.seconds(JVMrunningfor4.)

       内存情况:堆内存中的初试内存堆大小M,使用M,超过M的时候回收了一下

       开始升级jdk:

       springboot?2.1.1?+swagger+undertow+spring-orm5.1.4?+jdk

       启动时间:StartedJdyXcxApiin3.seconds(JVMrunningfor4.)

       内存情况:堆内存中的初试内存堆大小M,使用M,超过M的时候回收了一下

       综合统计:

如何选择SpringBoot最稳定的版本,以及相应的SpringCloud版本

       1、登录Spring的官网,查看当前最稳定的版本。

       当然了,想使用SpringCloud,还需要许多的jar包,如何选择兼容的jar包呢?在这里,我们可以考虑使maven的dependencyManagement功能。

       dependencyManagement其实就相当于一个对jar版本进行管理的依赖管理器,如果在dependencies的dependency里没有找到version属性,Maven就会去dependencyManagement里寻找相应的版本信息。

       如果既使用了dependencyManagement功能,又在dependencies的dependency里指定了version属性,dependency是以version属性为准的,所以,不用担心使用dependencyManagement功能之后无法自行指定jar包的版本信息。

       在这里,我们选择的是alibaba的版本管理配置。

       首先,进入阿里巴巴的GitHub地址,进入WiKi页面,点击版本说明。

       或者直接点击版本说明

       我们可以看到,2.4.2版本的SpringBoot,对应的alibaba版本是.0.RC1,对应的SpringCloud版本是.0,我们选择.0.2,最终配置如下。

       我这里是为了学习,所以选择的都是最新版本,在生产环境,还是要根据实际情况来详细评估选择哪些版本,以免给自己挖坑。

jdk1.7选什么版本springboot

       1.。由于springboot2.0以后不支持jdk1.7,所以只能自降springboot的版本由2.0降为1.。当选用jdk1.7构建springboot项目时会提示,选用jdk1.8。

请问年最稳定的jdk版本or哪个最好用,最流行!

       Java8是继Java5之后改动最大的一个版本,很经典,目前企业用的最多的还是Java8,即使有人用Java,但特性可能还是只用了Java8的,所以还是java8吧

Spring事件监听机制

       本文探讨事件监听机制在Java开发中的应用,从基础的JDK事件机制,深入到Spring、SpringBoot的事件机制,结合源码分析和具体使用方式。事件监听机制与设计模式中的观察者模式紧密相关,广泛应用于Spring框架。

       在Java中,事件通过`EventObject`类描述,事件监听器通过`EventListener`类表示。在Spring中,事件机制以观察者模式为基础,设计类图展示了其核心组件。默认的事件广播方式为同步,但通过配置`Executor`可实现异步执行。Spring的事件体系由`ApplicationContext`管理,它聚合事件广播器`ApplicationEventMulticaster`和事件监听器`ApplicationListnener`,通过`addApplicationListnener`方法注册监听器。事件源发布事件后,广播器遍历事件注册表,调用监听器的`onApplicationEvent`方法,完成事件处理逻辑。

       SpringBoot内置了7个事件,它们在容器启动的不同阶段发布。通过`SpringApplicationEvent`作为顶层抽象类,每个事件对应一个特定的启动阶段。SpringBoot提供了默认的事件发布机制,例如`EventPublishingRunListener`。通过`@SpringBootApplication`注解的启动类、`spring.factories`文件、`@Component`注解或`@EventListener`注解,可以配置监听器。不同配置方式各有特点,如通过`spring.factories`文件配置监听器实现类,或在启动类的`main`方法中手动添加监听器。使用`@Component`注解确保监听器被Spring扫描,适用于SpringBoot内置事件的后3个。使用`@Component`和`@EventListener`注解,可以减少监听器类的个数,但仅适用于后3个事件。

       总结各种配置方式,实现事件监听的灵活性和可扩展性。监听器通过实现`ApplicationListener`接口定义,多种方式共存可能导致重复执行。为了控制监听器执行顺序,可以使用`@Order`注解或`Ordered`接口。监听器默认为同步执行,异步执行可通过配置`Executor`或结合`@Async`注解实现。

spring—AOP与事务

        title: spring——AOP与事务.md

        date: -- ::

        categories: [Spring]

        tags: [AOP,事务]

        toc: true

        先列出源码中比较重点的几个类:

        1、<aop:before method="before" pointcut-ref="myMethods"/>包装成一个advisor

        2、AspectJAwareAdvisorAutoProxyCreator,当实例化所有bean都会执行到AspectJAwareAdvisorAutoProxyCreatorç±»

        它会检测bean是否advisor以及advice存在,如果有就说明这个bean有切面,有切面那么就会生成代理

        3、jdk的代理,bean里面的所有advisor加入到proxyFactory。

        4、jdkDynamicProxy invoke,拿到bean里面的所有Interceptor,会循环proxyFactory里面的所有advisor

        里面有advice,里面的advice有两种类型,要么是advice,要么是MethodInterceptor类型的

        5、当代理对象调用方式,是一个MethodInterceptor类型的类的链式调用过程,直到容器的大小和索引一致的时候调用JoinPoint目标方法

        before:this.advice.before(),invocation.processd();

        装配参数,切面里面before方法的method对象,method.getParamterTypes()[0]

        最终会把advice封装成MethodInterceptor类型的对象

        程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。

        每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

        增强是织入到目标类连接点上的一段程序代码,在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。

        增强逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有逻辑,而在AOP的帮助下,目标业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。

        引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

        织入是将增强添加对目标类具体连接点上的过程。AOP像一台织布机,将目标类、增强或引介通过AOP这台织布机天衣无缝地编织到一起。根据不同的实现技术,AOP有三种织入的方式:

        a、编译期织入,这要求使用特殊的Java编译器。

        b、类装载期织入,这要求使用特殊的类装载器。

        c、动态代理织入,在运行期为目标类添加增强生成子类的方式。

        Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

        一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。

        切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

        advisor: pointCut advice

        一类功能的增强

        around方法里面代码切面

        事务切面

        缓存切面

        日志切面

        事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)。

        大致流程形如

        数据库事务拥有几大特性:

        事务的四大特性:

        事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

        事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

        一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

        也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

        个人理解,事务在Spring中是借助AOP技术来实现的,可以作为AOP中的一个事务切面。spring源码对事务的处理逻辑,自己研究吧!

        ORM框架中以Mybatis为例,事务处理就是用到了一个类Transaction,部分源码如下

        可以看出Transaction管理的就是一个connection,而connection我们很清楚是与用户会话挂钩的。

        那么关系就是Transaction 管理Connection ,而connection与 用户session一对一存在。

        在springBoot中,只需要加入POM就可以了,配合注解使用即可。

        接下来就是事务的控制了。

        首先事务有几大传播属性:

        其中最常见的,用得最多就 PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、 PROPAGATION_NESTED 这三种。事务的传播属性是 spring 特有的,是 spring 用来控制方法事务的一种手段,说直白点就是用来控制方法是否使用同一事务的一种属性,以及按照什么规则回滚的一种手段。

        下面用代码演示这三种属性的机制:

        事务的默认属性就是required,通过Transactional.java中的Propagation propagation() default Propagation.REQUIRED; 可以看出。

        这种情况就是事务1,事务2 都加入到了事务0中。不管是1,2哪个事务抛出异常,事务0都会回滚。数据添加会失败。

        这种情况就是:

        事务0(required) {

        ​ 事务1 (REQUIRES_NEW)

        ​ 事务2

        }

        此时。

        情况a:

        1、如果只是事务2出现了异常,那么事务1会提交,事务2加入到事务0中会回滚。

        2、如果只是事务1出现了异常,那么事务1会回滚,向上层事务0抛异常,事务2会加入到事务0中,这时都会回滚。

        情况b:

        如果事务1,事务2都是REQUIRES_NEW传播属性。那么结果就是:

        1、如果事务1,抛出了异常,那么事务2是不会执行的,那么事务0必然回滚。

        2、如果事务2,抛出异常,那么事务1会提交,表中会有数据。事务2有异常回滚并抛出,事务0回滚。

        NESTED属性其实就是创建了回滚点,有异常时,会回滚到指定的回滚点。

        在这通过代码测试,出现一种情况是,无论事务1,事务2哪个有异常,数据都不会插入成功,原因是,不论是事务1还是事务2都会向事务0抛出异常,事务0捕获到异常后,执行rollback()方法,这就操作成了,事务的全部回滚。

        如果想要事务1和事务2 想要根据自己的回滚点回滚,那么事务0必须自己处理异常,不让spring捕获到这个异常,那么就满足了。把代码改成这种:

        Jack大佬提供了,伪代码分析法。

        按照Spring源码的事务处理逻辑,伪代码大致为: