
Spring
文章平均质量分 57
Spring 技术经验分享
catoop
性格开朗外向,积极进取充满热情,为人诚恳做事用心,爱好手工实践和大自然。有较强的自学意识创新意识和进取精神。喜欢分享技术收获,虽然是一个知识的搬运工,但对技术孜孜不倦,什么都想搞什么都想做的劲头小伙,善于灵活的运用技术优雅的解决问题,善于表达乐于沟通,一切只因心中那殿力量努力向上。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解 Spring 类型转换核心接口 ConversionService
虽然提供了很多默认转换,但我们经常需要处理自定义类型或特殊的转换规则。实现自定义转换最常用的方式是实现接口。S: 源类型 (Source Type)T: 目标类型 (Target Type): 实现具体的转换逻辑,将源对象source转换为目标类型T的对象。示例:将字符串 “yes”/“no” 转换为 Boolean@Component // 声明为 Bean,Spring Boot 会自动注册@Overrideif (!// 或根据需求返回 false/抛出异常。原创 2025-04-28 16:06:30 · 1180 阅读 · 0 评论 -
使用 Spring 的 FactoryBean 创建和获取 Bean 对象
在Spring框架中,FactoryBean接口提供了一种强大的机制来创建复杂的bean实例。本文将基于提供的代码示例,详细介绍如何通过FactoryBean创建bean对象,并展示如何获取这些bean实例以及它们所属的FactoryBean实例。原创 2025-03-18 19:48:03 · 470 阅读 · 0 评论 -
Spring SmartLifecycle:精准控制Bean的生命周期
这个案例中使用了spring上下文中的 ThreadPoolTaskExecutor,所以不能使用 @PreDestroy 注解方法来进行回收处理,因为spring在关闭容器时会先对上下问中的线程池进行shutdown完成后,才会执行所有bean的destroy方法。等高级功能,是构建企业级 Spring 应用的必备技能。通过合理使用 SmartLifecycle,可以实现。是 Spring 框架中用于。原创 2025-02-18 11:01:51 · 558 阅读 · 0 评论 -
Spring 中文文档社区版
Spring 中文文档原创 2024-11-29 22:28:31 · 186 阅读 · 0 评论 -
Spring 重写内置 Bean(Controller、Service 等)
我们可以自定义一个注解,然后使用该注解来很方便的在任何地方来排除需要排除的类。/*** 自定义注解,用来排除原本会在spring上下文中的bean。* 一般用于删除一个不可以修改的Bean,然后自定义一个类继承原有类然后重写特定的方法取代原来的类* @author 单红宇*/@ComponentClass原创 2024-11-28 14:25:44 · 443 阅读 · 0 评论 -
Spring Bean 的 Scope 作用域
Singleton作用域默认作用域。在容器启动时被实例化一次。整个应用生命周期内只存在一个实例。Prototype作用域每次请求时都会创建一个新的实例(也是每次请时才会创建,一个被定义为该作用域的类如果没有在任何地方使用它,那么你可以认为它和一个普通的Java类没有区别)。请求的方式包括注入该Bean到其他Bean里,每注入一个地方都是一个独立的Bean。或者使用方式获取Bean的时候。容器启动时不会自动实例化。容器在创建Bean后不再管理其生命周期。原创 2024-10-29 16:30:31 · 547 阅读 · 0 评论 -
Spring AOP 中定义切入点 @target 与 @within 的区别
另外需要注意的是,它俩是用于匹配类的,不适用在接口上标注注解的场景。匹配被设定注解标注的类,以及它的所有子类。仅匹配被设定注解标注的类,不包含其子类。不仅匹配该类,所有继承自。原创 2023-12-26 15:07:49 · 804 阅读 · 0 评论 -
SpringBoot 导入其他配置文件
文件,如果我们希望再定义一个独立的配置文件用来配置特定业务数据,而不希望把这些配置内容都堆积在 application 配置文件中,实现这个需求,我们直接使用配置文件中的。默认情况下,springboot 初始的项目中都有一个。原创 2023-11-22 15:28:29 · 449 阅读 · 0 评论 -
Spring @DependsOn 和 @ConditionalOnBean 的区别
最终两个实例都会创建,它用来控制当前Bean 一定在 DependsOn 所指向的Bean后面实例化。只有当所指向的Bean的实例存在时,才创建当前Bean,否则不创建。即要么都有,要么都无。1、都是当前bean实例化依赖另外的bean实例。在 Spring 中,注解。原创 2023-10-09 19:23:13 · 901 阅读 · 0 评论 -
Spring 实现覆盖容器中Bean的注解实现 @OverrideBean
项目开发中,有时第三方框架会自动注入Bean到Spring容器中,当我们有修改对应内置Bean实现的需求时,可以采用偷梁换柱的方式来重写内置的Bean,使用这种方式需要注意以下两点:1、对应的Bean在其他地方使用时,是基于接口注入的。2、如果不是基于接口注入的Bean,你可能需要同包名同类名的这种方式重写(可能会有问题,不推荐)。从以上2点我们还可以得出一个结论,那就是“基于接口编程”的好处。具体实现参考一下代码(代码片段,仅供参考,根据实际使用场景修改后使用):(END)...原创 2022-06-06 14:18:25 · 1340 阅读 · 0 评论 -
Spring Boot 根据文件扩展名获取 contentType
Spring Boot 根据文件扩展名获取 contentType 的方式,如下代码所示: String filename = "hello.png"; Optional<MediaType> mediaType = MediaTypeFactory.getMediaType(filename); mediaType.ifPresent(type -> response.setContentType(type.toString()));以上代码根据文件名(可以是原创 2022-05-19 15:19:37 · 2893 阅读 · 0 评论 -
Spring @Configuration proxyBeanMethods=false
开门见山,本文没有原理只有结果,要点如下:1、proxyBeanMethods=true,Full 全模式,如不指定则默认为 true,@Bean 修饰的方法会被代理。2、proxyBeanMethods=false,Lite 轻量级模式,@Bean 修饰的方法不会被代理。。3、仔细观察 proxyBeanMethods 这个词语,顾名思义,是代理方法的(仅指代被 @Bean 注解的方法哦),所以它的作用肯定是跟当前这个 @Configuration 中的 Bean方法有关的。4、在同一个 @Con原创 2021-11-04 12:29:03 · 3197 阅读 · 1 评论 -
spring @Transactional 传播机制(参数 propagation )
@Transactional 的参数 propagation 是描述当前方法在被其他方法调用时,自己对待事务的立场。参数说明@Transactional(propagation = Propagation.REQUIRED)如果当前不存在事务,子方法就自己开启事务。父方法如果有事务,它就跟随父方法的事务被包裹其中。总之 REQUIRED 就是必须运行在事务中@Transactional(propagation = Propagation.SUPPORTS)如果当前存在了事务,原创 2021-10-28 14:44:04 · 870 阅读 · 1 评论 -
Spring Bean的生命周期
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁。而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作转载 2021-05-10 20:00:44 · 407 阅读 · 0 评论 -
Spring Bean 的重写与覆盖
在基于 Spring 框架开发的时候,有的时候我们依赖的库会内置一些被 Spring 管理的 Bean。场景1接口 Test 有一个实现类 TestImpl ,在 TestImpl上 使用了 @Service 或者 @Component 注解,我们在其他地方使用的时候是通过 @Autowired 来注入 Test 接口的方式来使用的。这个 Test 和实现是被封装后的一个 jar 包库,现在新的代码工程在依赖这个 jar 包之后,假设 Spring 会自动将 Test 及其实现类进行初始化并载入 Sp原创 2021-04-26 16:27:40 · 2249 阅读 · 2 评论 -
Spring Authorization Server(授权服务器)授权处理流程原理过程
自2020年4月 Spring Authorization Server 被发起以来,时至今日已发布 0.1.0 版本。至于为什么要另起炉灶这里不做赘述,详见官方初始公告都有说明。初始公告https://spring.io/blog/2020/04/15/announcing-the-spring-authorization-server源代码https://github.com/spring-projects-experimental/spring-authorization-server下面是原创 2021-03-05 14:14:36 · 5217 阅读 · 0 评论 -
关于Spring Bean的生命周期中几个常用方法(@PostConstruct、@PreDestroy 等)的执行顺序
按如下顺序执行:1、初始化顺序构造方法()BeanPostProcessor.postProcessBeforeInitialization()@PostConstructInitialingBean.afterPropertiesSet()BeanPostProcessor.postProcessAfterInitialization()2、关闭服务容器后@PreDestroyDisposableBean.destroy()(END)...原创 2020-08-10 16:50:13 · 2664 阅读 · 1 评论 -
Spring AOP之ProceedingJoinPoint和JoinPoint区别(获取各对象)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象
现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制。基础知识和原理类大家搜索spring aop/aspectj,有大量现成的可以参考,基本上只要理解了jdk动态代理、cglib字节码动态生成代理就足够了,而且必须知道这个代理类是spring托管的(如果是自己创建的代理类,是无法被拦截的,此时只能使用过滤器/拦截器机制,他们本身是链式的,跟代理无关)。import org.aspectj.lang.reflect.SourceLocation; public interface转载 2020-05-28 16:46:48 · 3245 阅读 · 0 评论 -
springmvc 集成 eureka 和 feign 调用
有没有小伙伴有这个需求的(如题)我这边项目用上了,并做了代码整理,需要的小伙伴可以去用了,所有源码详见:【封装工程】https://gitee.com/catoop/feign-spring-mvc-starter【使用工程】https://gitee.com/catoop/springmvc-test-eurekfeign使用起来简单明了。(END)...原创 2019-11-12 11:31:31 · 4566 阅读 · 3 评论 -
Spring Boot 日志记录 SLF4J
在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了。 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗。 而Log4j 更为灵活在性能上也相比 System.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志。 使用 System.out 是在当前线程执行的,写原创 2016-01-12 09:25:28 · 65459 阅读 · 13 评论 -
SpringBoot AOP 拦截器 Aspect
常用用于实现拦截的有:Filter、HandlerInterceptor、MethodInterceptor第一种Filter属于Servlet提供的,后两者是Spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行。 实现一个HandlerInterceptor可以实现接口HandlerIntercep原创 2017-05-10 15:59:51 · 26444 阅读 · 7 评论 -
Spring Boot 基于注解的 Redis 缓存使用
看文本之前,请先确定你看过上一篇文章《Spring Boot Redis 集成配置》并保证 Redis 集成后正常可用,因为本文是基于上文继续增加的代码。一、创建 Caching 配置类RedisKeys.javapackage com.shanhy.example.redis;import java.util.HashMap;import java.util.Map;import javax.a原创 2017-05-06 18:14:59 · 14230 阅读 · 0 评论 -
Spring Boot Redis 集成配置
Spring Boot 熟悉后,集成一个外部扩展是一件很容易的事,集成Redis也很简单,看下面步骤配置:一、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId>原创 2017-05-06 18:14:19 · 15731 阅读 · 5 评论 -
Spring SmartLifecycle 在容器所有bean加载和初始化完毕执行
在使用Spring开发时,我们都知道,所有bean都交给Spring容器来统一管理,其中包括没一个bean的加载和初始化。 有时候我们需要在Spring加载和初始化所有bean后,接着执行一些任务或者启动需要的异步服务,这样我们可以使用 SmartLifecycle 来做到。SmartLifecycle 是一个接口。当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应原创 2017-05-06 17:52:17 · 23968 阅读 · 3 评论 -
Spring Boot 自定义PropertySourceLoader
SpringBoot 的配置文件内置支持 properties、xml、yml、yaml 几种格式,其中 properties和xml 对应的Loader类为 PropertiesPropertySourceLoader ,yml和yaml 对应的Loader类为 YamlPropertySourceLoader。 观察这2个类可以发现,都实现自接口 PropertySourceLoader 。所原创 2017-05-04 09:22:11 · 11975 阅读 · 0 评论 -
SpringBoot AOP 记录WEB请求日志
接上一篇文章: http://blog.csdn.net/catoop/article/details/71541612实现AOP的切面主要有以下几个要素:使用@Aspect注解将一个java类定义为切面类 使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。 根据需要在切入点不同位置的切入内容 使用@Before在切入点原创 2017-05-10 17:52:29 · 11896 阅读 · 4 评论 -
Spring Boot 部署与服务配置
Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到独立的web容器中(Tomcat、weblogic等等),当然在此之前你要对程序入口做简单调整。项目构建我们使用Maven或Gradle,这将使项目依赖、jar包管理、以及打...原创 2016-01-26 17:32:25 · 184772 阅读 · 19 评论 -
Spring日志输出级别的热更新
这个问题是我曾经的一个问题,虽然比较容易解决,但是一直没有去写下来。问题是这样的:一般在开发环境下使用DEBUG级别的日志输出是为了方便查看问题,而在线上一般都使用INFO、WARN、ERROR级别的日志,主要记录业务操作或者错误的日志。下面两种场景:1、针对上面问题所述的情况,我们正常的操作是这样的:》开发的时候本地修改日志输出级别,如果打的包是上生产环境的包(不管你用手工还是CI打包...原创 2019-07-03 09:29:36 · 3724 阅读 · 0 评论 -
SpringBoot mybatis批量插入数据库(去重场景)
1、用户邀请码表,里面存邀请码和关联的用户编号,每次有用户注册,就领取(关联)一个邀请码。邀请码都是系统提前生成空挡在表里待分配的(不要问为什么,目前业务就是这样设计的)。2、系统初始化的时候,或者空闲的邀请码快不够用的时候,会需要追加生成一批邀请码入库。一般系统上线的时候直接入库几十万或者几百万妥妥了。2、Service 中,使用Java程序生成不重复的值,然后按1000一批的方式,分割Controller提交的总数,多次执行。1、在 Controller 请求,调用Service。原创 2019-07-05 09:12:02 · 10779 阅读 · 0 评论 -
SpringBoot validator 完美实现+统一封装错误提示
1、杜绝通篇 if else 参数判断!!!2、普通参数方式3、实体对象参数方式效果参数不合法,自动使用统一异常返回错误,例如:{ "code": "-3", "message": "参数{age}最小18"}实现代码代码一次性给全,主要包含如下几个Java类,拿过去拷贝到项目中就能用:1、ValidatorController2、ValidatorVo3、...原创 2019-07-10 19:23:21 · 23367 阅读 · 3 评论 -
注解@Slf4j
在你了解这个注解之前,你的日志使用和输出的方式应该是下面这样的:public class TestConfigure { private Logger logger = LoggerFactory.getLogger(TestConfigure.class); public Object test(Student student, Teacher teacher) { logger...原创 2019-07-27 19:49:32 · 1600 阅读 · 0 评论 -
Spring@Configuration和@Component区别,简单直观
spring常用注解 @Component 大家都不陌生,用来注解一些公共的服务类。在springboot 中,@Configuration 进入了大家的视界,此时你有没有一个小小的疑问 “这俩到底有什么具体区别”,本文一个示例完美给出答案。代码类:import org.springframework.context.annotation.Bean;import org.springfra...原创 2019-07-27 17:41:39 · 5281 阅读 · 7 评论 -
Spring计时秒表StopWatch
代码中常规的耗时处理方法为: long start = System.currentTimeMillis(); log.info("耗时{}毫秒", System.currentTimeMillis() - start);Spring 提供了更好的一种实现方法,代码示例如下: StopWatch watch = new StopWatch("耗时示例"); watch.start("开...原创 2019-07-28 00:08:45 · 1836 阅读 · 1 评论 -
Spring Bean 的生命周期
1、创建(调用构造函数)2、set属性(set方法注入属性)3、判断是否实现BeanNameAware接口,并调用接口的setBeanName方法4、判断是否实现BeanFactoryAware接口,并调用接口的setBeanFactory方法5、判断是否实现ApplicationContextAware接口,并调用接口的setApplicationContext方法6、判断是否实现Be...原创 2019-08-16 23:23:26 · 914 阅读 · 0 评论 -
Shiro Ajax请求没有权限返回JSON,没有登录返回JSON
本文基于Shiro权限注解方式来控制Controller方法是否能够访问。 例如使用到注解: @RequiresPermissions 来控制是否有对应权限才可以访问 @RequiresUser 来控制是否存在用户登录状态才可以访问想了解Shiro是如何通过注解来控制权限的,可以查看源码 AopAllianceAnnotationsAuthorizingMethodInterceptor ,其原创 2017-04-04 20:59:50 · 25202 阅读 · 10 评论 -
Shiro报错No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.
问题描述: 项目使用 SpringMVC 并使用 Shiro 来管理Session控制权限。经常会不定期的发现异常:org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.原创 2017-03-18 16:32:41 · 54797 阅读 · 13 评论 -
Spring Boot 过滤器、监听器
上一篇文章已经对定义Servlet 的方法进行了说明,过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下上一篇文章:http://xxxxxx.xxx.xxx 本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener。过滤器(Filter)文件MyFilter.javapackage o原创 2016-01-12 09:20:33 · 73673 阅读 · 32 评论 -
Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。很简单,只需要一个类就可以,无需其他配置。 创建实现接口 CommandLineRunner 的类package org.springboot.sample.runner;import org原创 2016-01-12 09:24:33 · 94938 阅读 · 23 评论 -
Spring Boot 静态资源处理
Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。建议大家使用Spring Boot的默认配置方式,如果需要特殊处理的再通过配置进行修改。如果想要自己完全控制WebMVC,就需要在@Configuration注解的配置类上增加@EnableWebMvc(@SpringBootApplication 注解的程序入口类已经包含@原创 2016-01-12 09:23:50 · 207724 阅读 · 31 评论 -
Spring Boot 拦截器
上一篇对过滤器的定义做了说明,也比较简单。过滤器属于Servlet范畴的API,与Spring 没什么关系。 Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前原创 2016-01-12 09:21:48 · 160432 阅读 · 38 评论