spring
文章平均质量分 82
曹朋羽
学无止境
展开
-
springboot使用@ConfigurationProperties自动绑定配置参数属性
这里ConfigurationProperties会有两部分,一是框架通过autoConfig自动装配的,一种是我们自己显示使用@ConfigurationProperties修饰的bean。2、注册合适的ConfigurationProperties类型bean, 当前metadata是正在初始化的Configuration类,然后从其注解上获取带有EnableConfigurationProperties注解作为bean定义加载到容器中。除了在类上标注外,还可以在@Bean方法上。原创 2024-01-04 14:37:14 · 1371 阅读 · 0 评论 -
springboot application配置文件读取顺序
文件位置还是和上面的一致。默认情况下配置文件的名称为application,如果不想使用该文件名,可以通过spring.config.name参数来指定具体的文件名,一般也没人会改吧。这里看到先是通过processWithoutProfiles方法解析不带profiles的配置文件,然后通过processWithProfiles解析带profiles的配置文件,最后将解析到的配置文件设置到environment中。启动时会按照上面的顺序进行加载配置文件,如果存在多个,后面的会覆盖前面的配置项值。原创 2023-12-28 14:30:00 · 1358 阅读 · 1 评论 -
springboot 自动装配原理
这里解析的是所有的配置,不仅仅是autoconfiguration类型的,所有解析完成会存放到cache后面多次使用,最后还会根据key=org.springframework.boot.autoconfigure.EnableAutoConfiguration从map中获取所有的configuration。这一步会对configuration进行条件过滤,这里就使用了spring的@Conditional来进行条件装配,只不过springboot对其进行了扩展了很多注解。可以看下以前写的这两篇文章。原创 2023-12-26 09:34:58 · 889 阅读 · 1 评论 -
springboot 快速上手
这样就完成了一个springboot web工程的启动,默认情况下会扫描当前@SpringBootApplication注解所在类的包及子包下注解标识的bean。新建工程,在maven的dependencyManagement配置spring-boot-dependencies全局依赖设置,这样在使用springboot相关依赖的时候,不用写具体版本,会从上面引入的pom中读取对应jar包版本。自动装配,可以根据类路径上的依赖和配置信息,自动推断应用程序的配置,减少了显示配置的工作。原创 2023-12-25 14:49:52 · 466 阅读 · 0 评论 -
spring的SPI机制之使用SpringFactoriesLoader加载服务实现
spring.factories是一个properties文件,以key=value形式来配置服务接口与实现。多个value可以用英文逗号隔开,多个jar包中不同的spring.factories可以指定相同的key,然后会自动将所有的实现value合并成一个list。配置value的时候,value对应的类必须是key的子类或实现类。SpringFactoriesLoader在springboot框架中有大量使用,可以根据spring的规范实现其扩展接口,实现自己的功能。1、读取配置接口名称。原创 2023-12-22 15:10:56 · 577 阅读 · 0 评论 -
spring使用@Scheduled配置定时任务
但是同样的任务不会并行执行,如果超过设定的频率,前一个任务还未完成则会等待前一个任务完成,再开始下一个任务。比如:fixedRate设置的任务周期是5秒,如果一次任务的时间耗时是3秒,则下一任务会等到5秒间隔开始,但是如果惹我你执行耗时是6秒,则本次任务结束后会立即执行下一次任务,下一任务已经排队等候1秒了。然后更新trigger信息,再次调用schedule()方法生成下一周期任务到executor执行,到时间又会调用run方法这样循环往复完成cron周期性执行。cron表达式指定任务频率。原创 2023-12-20 10:02:10 · 2129 阅读 · 0 评论 -
spring使用@Conditional进行条件装配
在spring中有些bean需要满足某些环境条件才创建某个bean,这个时候可以在bean定义上使用@Conditional注解来修饰。@Conditional需要指定一个条件类,这个类不需实现Condition接口并且实现其matches方法。只有当matches方法返回true时才创建当前bean。例如下面定义一个bean只有当当前jdk版本大于等于8时才创建该bean。bean定义这里写的很简单,看Java8Condition条件类。原创 2023-12-14 17:03:36 · 470 阅读 · 0 评论 -
spring 属性注入 @Autowired和@Resource注解使用
众所周知@Resource 和 @Autowired两大注解是开发中最常用的两大注解。原创 2023-12-11 16:39:40 · 1024 阅读 · 0 评论 -
spring @Async异步执行
方法的异步执行是通过线程池来执行的, spring默认会从beanFactory中尝试去获取TaskExecutor类型的bean,如果获取不到,就会继续尝试获取bean name为’taskExecutor’的bean,还获取不到就创建一个SimpleAsyncTaskExecutor类型的执行器。异步执行的原理还是通过@EnableAsync引入对应的bean后置处理器,来使用advisor对@Async标识的方法进行代理增强。添加@Async注解的方法必须是public的。因为使用的动态代理。原创 2023-11-24 17:47:35 · 615 阅读 · 0 评论 -
spring Environment上下文环境参数变量
spring通过Environment对象来存储上下文环境变量信息,即包含当前系统环境变量也包含配置文件配置变量。Environment作为一个bean被存放在容器中,可以在需要的地方进行依赖注入直接使用。原创 2023-10-20 15:30:35 · 371 阅读 · 0 评论 -
spring 源码阅读之@Configuration解析
然后解析的到的配置bean会经过ConfigurationClassParser类进行配置解析,具体解析方法在processConfigurationClass,真正解析方法doProcessConfigurationClass。@Configuration注解用于标识一个类是配置类,用于声明和组织Bean定义,首先@Configuration本身也是一个@Component,在其注解定义上标有@Component。配置bean里可以通过方法上@Bean注解进行bean的定义。原创 2023-10-19 15:26:41 · 173 阅读 · 0 评论 -
spring event事件通知机制
要发布事件首先要定义事件,我们可以通过集成ApplicationEvent类来定义事件需要调用ApplicationEvent类构造函数来设置消息内容。原创 2023-10-10 11:23:15 · 175 阅读 · 0 评论 -
spring 事物源码阅读之事务与持久化操作的结合
前面文章说到在开启事务后,会将数据库连接存放在当前线程的ConnectionHolder。那么后续的数据库持久化操作是怎么感知的呢。这里就要说到一个重要的类TransactionSynchronizationManager。原创 2023-10-09 14:35:52 · 109 阅读 · 0 评论 -
spring 事物源码阅读之传播特性实现
Spring事务传播特性是指在多个事务操作之间如何管理事务的行为。Spring框架提供了不同的事务传播特性,用于定义事务的边界和隔离级别。先来回顾下spring事务传播有哪些类型。原创 2023-10-08 17:02:15 · 188 阅读 · 0 评论 -
spring 事务源码阅读之事务控制
事务入口是事务代理拦截器类TransactionInterceptor,其继承TransactionAspectSupport。事务的控制主要是通过TransactionManager™来完成。这里实例类是其子类DataSourceTransactionManager。TM里绑定了datasource,我们可以通过其获取数据库连接,然后根据@Transactional注解设置的属性进行connection的属性设置。事务状态属性信息会被封装成TransactionStatus用来流程流转。原创 2023-10-08 14:08:02 · 87 阅读 · 0 评论 -
spring 事务源码阅读之实现原理
开启事务为我们引入了两个重要的1、BeanFactoryTransactionAttributeSourceAdvisor事务Advisor。设置两个属性TransactionInterceptor用来代理管理事务,TransactionAttributeSource用来匹配事务方法。1、InfrastructureAdvisorAutoProxyCreator是bean后置处理器,用来判断当前bean是否需要代理。原创 2023-10-07 16:21:51 · 649 阅读 · 0 评论 -
spring AOP源码阅读分析
Spring AOP实现是通过bean后置处理器去实现。在后置处理器方法找到所有的Advisor,即@Aspect注解标注的bean。然后每个被创建的bean都会拿出所有的类方法与解析到的Advisors切点规则进行匹配,只要有一个规则匹配,则该bean会被通过JDK动态代理或cglib方式代理包装返回代理对象。通过代理执行原方法时,会计算出当前方法匹配的所有Advisor规则组成Intecepters依次调用。原创 2023-09-27 10:27:47 · 121 阅读 · 0 评论 -
spring 扩展点之后置处理器(PostProcessor)及Aware接口
在bean的实例化前后执行。每个接口有不同的接口方法。Bean定义注册后置处理器,这个也是在bean被初始化之前对bean定义进行修改,比BeanFactory后置处理其稍早一些,暴露的是BeanDefinitionRegistry注册对象。总的来说,Spring Aware 的作用是为 Bean 提供访问和利用 Spring 容器资源的能力,通过回调方法将特定的对象或上下文注入到 Bean 中,使得 Bean 能够与 Spring 容器进行交互,获取更多的功能和信息,从而更好地适应各种开发需求。原创 2023-09-26 15:45:15 · 292 阅读 · 0 评论 -
spring bean实例化过程及顺序
invokeAwareMethod()回调aware方法,如果Bean实现了Spring的Aware接口,会通过回调方式将特定的资源设置到Bean中。spring bean的初始化从doCreateBean方法开始,依次会调用下面三个方法执行bean的初始化。如果Bean实现了InitializingBean接口,Spring会调用其重写的afterPropertiesSet()初始化方法,进行一些自定义的初始化逻辑。populateBean()方法会进行属性的注入,也就是完成IOC依赖注入功能。原创 2023-09-26 10:11:31 · 316 阅读 · 0 评论 -
spring bean初始化源码阅读
扫描实际操作是在ClassPathBeanDefinitionScanner.doScan方法for (String basePackage : basePackages) {//循环所有指定的包路径//step1 找到所有可能的bean//读取@Scope设置,默认是singleton//获取beanName,首先根据注解判断是否明确指定,否则根据beanDef自动生成//这里candidate实例是ScannedGenericBeanDefinition,下面两个if都成立。原创 2023-09-25 10:56:25 · 165 阅读 · 0 评论