
Spring
雪落南城
这一场人间流浪,长随步履温柔相候
展开
-
多个AOP修饰同一个方法
多个AOP修饰同一个方法原创 2023-03-01 21:43:47 · 1291 阅读 · 0 评论 -
在项目中写完数据库自动写缓存怎么实现?
自动执行缓存操作原创 2022-09-18 01:40:51 · 218 阅读 · 0 评论 -
Spring中的beanDefinition
BeanDefinition是什么BeanDefinition是一个接口,定义了对一个bean元信息的描述,比如bean的class,bean的作用域,bean的Order等信息,在Spring生成bean的时候需要依赖于bdBeanDefinition什么时候加载的Spring在启动时会先把BD加载进容器,那么具体是什么时候加载的呢?总结放前边:就是在Spring启动时,初始化beanFactory的时候,将bd加载进容器,之后在创建bean的时候依赖BD首先我们进入AbstractAppli原创 2022-03-08 09:35:44 · 559 阅读 · 0 评论 -
快速实现异步调用-Spring @Async注解
[INFO ] [10:44:25] org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor - More than one TaskExecutor bean found within the context, and none is named ‘taskExecutor’. Mark one of them as primary or name it ‘taskExecutor’ (possibly a原创 2022-01-07 19:09:15 · 562 阅读 · 0 评论 -
记一次@Value失效
背景Spring Boot开发中,我们会在application.yml中写一些固定配置,比如appKey,数据库信息等,当我们代码中需要用到这些配置的时候,一般用@Value来取值@Value("${app.name}")private String appName;在某次开发中,希望在创建bean的时候,设置一个配置的值进去,示例代码如下...原创 2021-12-17 21:16:50 · 585 阅读 · 0 评论 -
注解生效一定作为Spring管理的bean吗?----Reflections获取使用了指定注解的所有字段
由于之前使用注解,大部分都是为了切面,需要有一个切面类,同时目标类也作为一个Spring管理的bean,在Spring启动的时候,生成动态代理类其实我们的注解并不是仅仅为了生成动态代理,比如说mt的配置中心,系统如何实时感知配置项的变更?就是因为加了zk的监听器,每个zk的临时节点都是一个配置项,利用注解为每一个配置项添加监听器其中一个知识就是,初始化的时候遍历服务中注解了@XXConfig的字段,为这些字段添加监听器,用到了开源包org.reflections:reflections:jar:0.9.原创 2021-12-13 15:19:50 · 451 阅读 · 0 评论 -
Spring中的Aware接口是干嘛的
梳理spring bean的生命周期,我们知道,在进行完属性填充之后,Spring会去检查对象是否实现了Aware接口,之后调用相关的方法,再之后执行postProcessBeforeInitialization。那么让我们看一下Spring的源码吧断点tips,当我们知道Spring会执行Aware接口方法时,我们直接用自定义的bean实现接口,打个断点,就可以知道Spring什么时候走进来了~Spring判断了三种aware接口的实现BeanNameAware、BeanClassLoader原创 2021-08-17 23:44:19 · 1250 阅读 · 0 评论 -
Spring MVC请求原理图
搬一下石杉老师的话:(1)tomcat的工作线程将请求转交给spring mvc框架的DispatcherServlet(2)DispatcherServlet查找@Controller注解的controller,我们一般会给controller加上你@RequestMapping的注解,标注说哪些controller用来处理哪些请求,此时根据请求的uri,去定位到哪个controller来进行处理(3)根据@RequestMapping去查找,使用这个controller内的哪个方法来进行请求的处.原创 2021-03-17 00:01:19 · 190 阅读 · 0 评论 -
Spring整合Mybatis
先上图:为什么我们可以直接@Autowired一个Mapper接口呢?原理如上图相关知识点:1、包扫描2、beanDefinition3、ImportBeanDefinitionRegistrar4、factoryBean原创 2021-02-01 22:02:05 · 127 阅读 · 0 评论 -
Spring中的FactoryBean是啥?
我们在getBean的时候,进入的类是AbstractBeanFactory类但是Spring中还有一个FactoryBean,这个是干嘛用的呢?其实FactoryBean也是一个接口,是为了我们可以自定义对某个对象的处理比如我们有一个Student,我们想在Student对象对某些属性赋值,可以让student实现一个FactoryBean接口,在getObject的时候进行相关改造源码:示例代码:控制台输出:强啊霸哥1611510111320强啊霸哥1611510111320原创 2021-01-25 01:44:27 · 885 阅读 · 0 评论 -
Spring为什么不先执行后置处理器再进行属性赋值
Spring正常流程中,会先进行属性赋值,在执行后置处理器所以遇到循环依赖的时候,需要用到三级缓存来解决那么,为什么不考虑先执行后置处理器再进行属性赋值呢?这样可以少用一级缓存吧?个人思考原因:如果先执行后置处理器再进行属性赋值,那么 后置处理器中 无法使用bean的成员变量了其他原因 暂时没有想到 后续有思考会更新...原创 2021-01-24 00:45:24 · 200 阅读 · 0 评论 -
关于jul桥接slf4j失败问题的探究
背景slf4j提供桥接的能力,可以兼容项目中不同的日志实现,统一由slf4j门面调用同一日志实现在测试jul桥接slf4j时,失败了绑定的是log4j2pom:<dependencies> <!-- slf4j核心包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-ap原创 2021-01-03 22:52:58 · 1521 阅读 · 0 评论 -
log4j2使用及log4j2.xml分析
我们使用slf4j + log4j2作为项目的日志组合pom <!-- slf4j核心包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.13</version> <原创 2021-01-03 05:18:19 · 2445 阅读 · 1 评论 -
个人认为的Spring的一些学习方向
1、Spring IOC2、Spring AOP原理,使用再细一点,什么时候由POJO变成代理类的,如何判断的Spring AOP 和 aspectJ 什么关系?3、Spring日志框架相关spring 5 默认日志框架是什么?common-log?slf4j和log4j/log4j2什么关系?4、Spring 怎么整合的 mybatis?...原创 2020-12-27 23:34:54 · 224 阅读 · 0 评论 -
Spring日志框架的一点思考
spring原生使用的是spring自己写的jcl,apache写的jcl中,只支持log4j,jul14,jul13,simple-loggingspring 进行了改造门面模式,便于统一,走统一的日志框架,具体实现根据是否引入jar包原创 2020-12-25 01:02:54 · 221 阅读 · 1 评论 -
Spring AOP执行流程图&源码分析
老规矩,先来个图:源码,前边的执行和普通bean的加载流程一致,我们直接来到doCreateBean原创 2020-12-18 20:16:56 · 1870 阅读 · 2 评论 -
@ConditionalOnClass是在哪使用的?
我们通过@ConditionalOnClass可以有条件的加载bean,那么这个注解在哪里被使用的呢?首先我们跳到这个注解,有的Spring注解会在注释中说明哪个类在调用,不巧的是,这个类没有,那么我们可以看一下这个类在哪里使用过发现了使用它的类:OnClassCondition其实这个类和注解在一个包里:ok,接下来进入激动人心的打断点环节metadata就是使用了这个注解的类的信息同时根据调用栈可以清晰的看到这个注解的使用流程PS:在createBean之前,不满足Condit原创 2020-11-18 21:28:18 · 2292 阅读 · 1 评论 -
Spring提供的本地事件发送及监听机制ApplicationEvent
角色介绍事件主体ApplicationEvent生产者ApplicationContext消费者ApplicationListener使用1、创建事件主体,继承ApplicationEvent@Datapublic class TestEvent extends ApplicationEvent{ private int id; private String name;}2、发送事件,发送器无需定义 @Autowired private ApplicationContext原创 2020-10-20 16:57:01 · 555 阅读 · 0 评论 -
记一次数据库缓存数据不一致导致的线上case
背景某服务使用了缓存和数据库,存储了计费规则相关信息,有一次在修改了规则之后,新规则没有生效。最后探究原因,是因为先删除了缓存,数据库还没修改,此时有请求打进来,查缓存没有,查数据库,将老数据更新到了缓存里,然后数据库才更新。导致后续的请求查缓存都是旧数据。问题所在1、数据库缓存一致性2、缓存key的过期时间3、@Transactional范围合理性,本次case代码中是先改库后删缓存,但是都在一个事务修饰的方法中,实际情况先执行了缓存操作后才提交的数据库事务思考数据库缓存一致性对于这个问题原创 2020-06-30 14:59:14 · 286 阅读 · 0 评论 -
content-type的一点探究
最近在工作中,写后门接口调试的时候发现一个问题使用postman调试时在上家公司content-type设置的是:multipart/form-data现在使用这个content-type类型传的参数并不能被获取改成application/x-www-form-urlencoded就可以了那么问题来了,为什么会这样呢?//TODO先写述职报告了...原创 2020-06-03 20:15:42 · 228 阅读 · 0 评论 -
Spring-bean加载流程及bean的生命周期
在bean构建的过程中,getBean方法内部的具体逻辑可以参考之前的文章Spring如何解决循环依赖原创 2020-05-18 10:52:31 · 869 阅读 · 0 评论 -
POST时Controller获取不到请求参数、web请求格式
代码是这样的,postman设置如下:结果msg为空将postman请求的时候 content-type改为 x-www-form-urlencoded 就好了原创 2020-05-06 16:57:27 · 2489 阅读 · 0 评论 -
Spring如何判断某个类用了某个注解
Spring提供了一个AnnotationUtils类用于判断某个类是否用了某个注解,以@KafkaListener为例,KafkaListener ann = AnnotationUtils.findAnnotation(clazz, KafkaListener.class);clazz为使用了该注解的类时,会返回相应的注解.因为每个bean在构造的时候都会调用beanPostProces...原创 2020-04-28 20:49:05 · 5526 阅读 · 0 评论 -
Spring中InitializingBean和BeanPostProcessor区别
InitializingBean和BeanPostProcess都是Spring提供的接口区别:1、BeanPostProcess先于InitializingBean执行2、InitializingBean是在对象已经实例化之后,执行接口的afterPropertiesSet()方法;BeanPostProcess是在bean构建的过程中,postProcessBeforeInitiali...原创 2020-04-26 20:16:32 · 3632 阅读 · 4 评论 -
SpringWeb一个请求的调用链路浅析
定义一个controller@RestController@RequestMapping("/order")public class OrderController extends BaseController { @GetMapping("/test") public String getOrderInfoByChannelOrderId(@RequestParam In...原创 2020-03-20 15:35:40 · 766 阅读 · 0 评论 -
Spring-如何解决循环依赖
大致结构图原创 2020-02-29 02:43:15 · 1867 阅读 · 0 评论 -
Kafka Producer send原理及重试机制浅析(retries/acks如何被使用的)
我们在使用kafka时会在producer端定义这么两个变量的值:retries 和 ackack已经介绍过了retries是kafka producer针对可重试异常自动发起重试的次数我们在使用kafkaTemplate时发现:Spring 提供了一个producerListener接口,在发送成功/失败时会调用这个接口的onSend/onError方法,我们只需要实现这个接口就可以在发...原创 2019-11-08 11:48:32 · 10282 阅读 · 2 评论 -
SpringBoot中@KafkaListener原理
在我们的SpringBoot工程中,只需在方法中注解@KafkaListener(topics = {”demo_topic_01“})即可实现对该topic的监听我们知道,kafka的consumer端通过从broker poll消息,然后处理我们通过正向理解 + 结果反推 来分析代码最终肯定会调用KafkaConsumer的poll()方法,可以通过方法栈来确定调用来源查看poll...原创 2019-11-07 15:24:35 · 20905 阅读 · 5 评论 -
Spring中BeanPostProcessor的加载过程
BeanPostProcessor是Spring提供的bean后置处理器,在Bean初始化之前/之后执行一些操作。流程大致如下1、使用getBeanNamesForType 扫描所有BeanPostProcessor的子类类名2、根据类名getBean获取相应的bean,在getBean的时候触发了postProcessBeforeInitialization或者postProcessAf...原创 2019-11-07 14:13:07 · 1605 阅读 · 0 评论 -
SpringBoot启动系列之prepareEnvironment浅析
环境准备prepareEnvironment方法private ConfigurableEnvironment prepareEnvironment( SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments) { // Create and configure ...原创 2019-10-25 11:40:22 · 1139 阅读 · 0 评论 -
SpringBoot启动系列之prepareContext浅析
Spring在启动的时候,refreshContext之前有一步prepareContext操作今天来分析一下prepareContext干了啥private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationR...原创 2019-10-25 11:42:11 · 1105 阅读 · 0 评论 -
SpringBoot启动系列之整体流程概览
众所周知,启动SpringBoot项目只需启动Application里的main方法即可,这个main方法就一行:SpringApplication.run(InvincibleApplication.class, args);今天探究一下run到底干了啥。/** * 返回了ApplicationContext对象,我们可以用这个对象处理很多事情,getBean 等等 * Static...原创 2019-10-24 19:30:59 · 338 阅读 · 0 评论 -
@Autowired 和 @Resource 区别
从Spring源码的角度分析处理@Autowired的是AutowiredAnnotationBeanPostProcessor处理@Resource的是CommonAnnotationBeanPostProcessor1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。2、@Autowired默认按类型装配(...原创 2019-10-24 13:53:43 · 396 阅读 · 0 评论 -
@Bean构造时有入参的情况
以RedisAutoConfiguration为例@Bean@ConditionalOnMissingBeanpublic StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { String...原创 2019-06-06 12:39:24 · 2598 阅读 · 0 评论 -
Spring注解之-@ConditionalOnExpression表达式
@ConditionalOnExpression("${mq.cumsumer.enabled}==1&&${rabbitmq.comsumer.enabled:true}") @ConditionalOnExpression("'${mq.comsumer}'.equals('rabbitmq')") 适合多重条件校验...原创 2019-05-22 10:34:43 · 6832 阅读 · 4 评论 -
Spring注解之-@ConditionalOnProperty按条件生成bean
在开发的过程中,有些bean不需要加载可以利用@ConditionalOnProperty 和 yml文件@Configuration@ConditionalOnProperty(name = "spring.batch.job.names",havingValue = "order-cancelorder")public class CancelOrderConfig {...}...原创 2019-05-21 17:31:51 · 6108 阅读 · 0 评论 -
Spring注解之-@ConfigurationProperties
该注解用于将yml设置的属性注入到bean中,方便使用1、构建一个bean@Component@ConfigurationProperties(prefix = "test")@Datapublic class TestYml { private String dogName; private String catName;}2、yml文件中设置属性...原创 2019-05-07 11:06:03 · 255 阅读 · 0 评论 -
Spring注解-@Scope
参考:https://blog.youkuaiyun.com/Tracycater/article/details/54019223Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围。在 Spring IoC 容器中具有以下几种作用域:基本作用域(singleton、prototype),Web 作用域(reqeust、sessio...原创 2019-04-12 15:47:42 · 140 阅读 · 0 评论 -
SpringBoot-Controller参数校验
1、Controller层@Valid 和 @Validated 都可以@PostMapping(value = "/xxx")public ResponseBean addContractFrontConfigInfo(@Validated ContractFrontConfigQuery contractFrontConfigQuery) { return null;}...原创 2019-03-26 19:12:48 · 449 阅读 · 0 评论