
spring
文章平均质量分 92
主要包含spring源码以及一些中间件的学习
倚-天-照-海
这个作者很懒,什么都没留下…
展开
-
Springboot之starter
创建id-generate-autoconfigure,为了方便,把项目重命名了,原本是叫id-generate-spring-boot-autoconfigure,如下图所示:该项目当中包含:pom.xml、spring.factories、IdGenerateAutoConfiguration、IdGenerateService 和 IdProperties 这5个关键文件,下面逐一看看。原创 2023-11-19 00:11:12 · 297 阅读 · 0 评论 -
条件注解及自定义注解
目录结构:如何自定义注解?注解其实就是一种标记,可以在程序代码中的关键节点(类、方法、变量、参数、包)上打上这些标记,然后程序在编译时或运行时可以检测到这些标记从而执行一些特殊操作。因此可以得出自定义注解使用的基本流程:第一步,定义注解——相当于定义标记;第二步,配置注解——把标记打在需要用到的程序代码中;第三步,解析注解——在编译期或运行时检测到标记,并进行特殊操作。在底层实现上,所有定义的注解都会自动继承接口。原创 2023-11-18 18:17:05 · 258 阅读 · 0 评论 -
Swagger注解及SwaggerUI的使用
API详细说明——注释汇总作用范围API使用位置对象属性用在输入参数对象的字段上协议集描述@Api用于controller类上协议描述用在controller的方法上Response集用在controller的方法上Response用在里边非对象参数集用在controller的方法上非对象参数描述用在的方法里边描述返回对象的意义@ApiModel用在返回对象类上Api 用在类上,说明该类的作用。与Controller注解并列使用。原创 2023-11-18 17:26:14 · 948 阅读 · 0 评论 -
Spring和Springboot中常用的注解
只有一个方法可以用此注解进行注释。可以写一个配置类(带有@Configuration注解的类),在配置类中写一个带有@Bean注解的方法,通过方法生成想要的bean(这就是通过显示的java代码装配的方式创建bean)。需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。默认情况下,bean的ID与带有@Bean注解的方法名是一样的,在上例中,bean的名字就是sgtPeppers,也可以通过name属性为bean指定一个名字,例如上例中的"lonelyHearts"。原创 2023-11-12 23:16:33 · 233 阅读 · 0 评论 -
Spring事务的实现方式
Spring事务有两种实现方式:编程式事务和声明式事务。编程式事务是指通过编码方式实现事务管理,缺点是与业务代码高度耦合,不同的业务代码需要编写不同的事务实现。声明式事务属于无侵入式,不会影响业务逻辑的实现。原创 2023-11-06 22:52:16 · 747 阅读 · 0 评论 -
Spring bean的作用域和线程安全问题
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当希望每次IoC容器返回的Bean是同一个实例时,可以设置scope为singleton;当希望每次IoC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。scope配置项有5个属性,用于描述不同的作用域。使用该属性定义Bean时,IoC容器仅创建一个Bean实例,IoC容器每次返回的是同一个Bean实例。原创 2023-11-06 22:30:51 · 82 阅读 · 0 评论 -
Spring装配bean的方式
加上@Configuration注解的类就是配置类,该注解的作用就是告诉spring,配置类起到了与XML配置文件相同的作用,好处是不用写那么多复杂的配置文件了。用@Configuration注解类,等价于XML中配置beans,用@Bean标注方法等价于XML中配置bean。@ComponentScan注解能够在spring中开启组件扫描,该注解会使spring默认扫描配置类所在的包及其子包,可以明确设置组件扫描的基础包,查找带有@Component注解的类,在spring上下文中自动创建一个bean。原创 2023-11-06 00:11:11 · 246 阅读 · 0 评论 -
Spring常用的注入方式
这三种注入方式既可以基于xml配置文件注入,也可以基于@Configuration注解的配置类注入。下面是通过配置文件方式注入的三种方式。如果是基于@Configuration配置类方式注入,就不用写配置文件,但是需要编写配置类,在配置类上加上@Configuration和@ComponentScan(“需要扫描的包名”)注解,同时在UserService和UserDao上加上@Component注解,通常是在Service类上加上@Service注解,在Dao类上加上@Repository注解。原创 2023-11-05 23:54:07 · 168 阅读 · 0 评论 -
@Transactional失效及事务传播特性
2、如果ServiceA.methodA方法的事务行为类型是PROPAGATION_REQUIRED,即方法上使用@Transactional(propagation=Propagation.REQUIRED)注解,ServiceB.methodB方法上也使用@Transactional(propagation=Propagation.REQUIRED)注解,则ServiceB.methodB方法不会新建事务,而是加入到ServiceA.methodA方法的事务中。原创 2023-11-05 16:13:44 · 180 阅读 · 0 评论 -
@Transactional原理分析
由于@Transactional注解是通过AOP实现的,可以猜想:在服务启动时,创建spring容器,进行一系列相关bean的创建,如果开启了AOP功能(对于基于注解实现的AOP,可以在启动类上加上@EnableAspectJAutoProxy注解来开启AOP功能),还会缓存所有的切面信息,如果引入与jdbc相关的依赖(spring-boot-starter-jdbc),与@Transactional相关的切面信息自然也会被放到缓存中。当事务有保存点不会去提交事务,而是释放保存点。原创 2023-11-05 15:37:01 · 192 阅读 · 0 评论 -
Spring AOP的原理(下)
在上一篇文章()中已经分析了创建并获取适配当前bean的增强器,如果在匹配切面的过程中,发现适配的切面,那就需要创建代理对象了。原创 2023-11-04 23:23:05 · 128 阅读 · 1 评论 -
Spring AOP的原理(上)
在当前方法postProcessBeforeInstantiation执行完之后,若返回的不是null,则说明创建了代理对象,接着会调用AbstractAutoProxyCreator的postProcessAfterInitialization方法再次尝试创建代理对象,在该方法中会判断targetSourcedBeans中是否已经包含了目标beanName,若已包含,则直接返回代理对象,说明已创建代理对象,不再重复创建,否则继续尝试创建代理对象。增强器中都会通过反射来调用增强方法,如下所示。原创 2023-11-04 22:02:48 · 96 阅读 · 1 评论 -
Spring AOP的概念及简单使用
AOP(Aspect-Oriented Programming,面向切面编程或面向方面编程)是一种技术,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为 “Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系。原创 2023-11-04 00:10:02 · 130 阅读 · 1 评论 -
Spring如何解决循环依赖
比如说aop的情况下,x注入y,y也注入x,而y中注入的x需要加代理(aop),但是加代理的逻辑在注入属性之后,也就是x的生命周期走到注入属性的时候,x还不是一个代理对象,那么这个时候把x存起来,然后注入y,获取、创建y,发现y需要注入x,就去三级缓存中获取x,拿出来的x是一个没有代理的对象。在重写的getObject方法中会判断是否需要为当前bean创建代理对象,如果不需要,则直接返回半成品的bean实例,如果需要,则创建并返回代理对象。如果不需要被AOP代理,则直接返回半成品的bean实例。原创 2023-11-03 00:14:36 · 115 阅读 · 0 评论 -
Spring bean的初始化
常用的spring bean的初始化方法有以下四种:(1)@PostConstruct注解的方法;(2)类实现了InitializingBean接口,实现了afterPropertiesSet方法;(3)通过XML配置文件在标签中的init-method属性指定初始化方法,或者@Bean的initMethod属性指定的方法,如@Bean(initMethod = "init"),其中init是一个方法;原创 2023-11-01 23:11:21 · 2103 阅读 · 1 评论 -
Spring bean的属性注入
如果@Autowired注解用在属性上,就会调用AutowiredFieldElement类的inject方法,如果@Autowired注解用在方法上,就会调用AutowiredMethodElement类的inject方法(这就是@Autowired注解用在属性和方法上的区别)。如果属性是通过@Autowired或@Value注入的,则调用前者的,如果属性是通过@Resource注入的,则调用后者的(面试考点:这里就是@Autowired和@Resource注入属性的一个不同点)。原创 2023-11-01 22:09:50 · 212 阅读 · 1 评论 -
Spring bean的实例化
spring bean的实例化、属性注入和初始化都是在doCreateBean方法中完成的。代码逻辑如下:1.如果bean定义中存在 InstanceSupplier ,会使用这个回调接口创建对象(应该是3.X以后新加的,3.X的源码中没有)2.根据配置的factoryMethodName或factory-mtehod创建bean3.解析构造函数并进行实例化因为一个类可能有多个构造函数,所以需要根据配置文件中配置的参数或者传入的参数确定最终调用的构造函数。原创 2023-11-01 21:38:27 · 87 阅读 · 1 评论 -
Spring bean的生命周期
调用DefaultSingletonBeanRegistry类的isSingletonCurrentlyInCreation方法判断单例bean是否正在创建中,该方法中的singletonsCurrentlyInCreation是一个Set集合,如果单例bean正在创建中,会将正在创建的bean放到该集合中(这一步在AbstractBeanFactory类的doGetBean方法中第二次调用getSingleton方法时完成的),创建完成之后,从该集合中删除bean。一个bean一定是个对象。原创 2023-11-01 21:06:54 · 117 阅读 · 1 评论