Spring
文章平均质量分 52
Spring 技术经验分享
catoop
性格开朗外向,积极进取充满热情,为人诚恳做事用心,爱好手工实践和大自然。有较强的自学意识创新意识和进取精神。喜欢分享技术收获,虽然是一个知识的搬运工,但对技术孜孜不倦,什么都想搞什么都想做的劲头小伙,善于灵活的运用技术优雅的解决问题,善于表达乐于沟通,一切只因心中那殿力量努力向上。
展开
-
Spring AOP 中定义切入点 @target 与 @within 的区别
另外需要注意的是,它俩是用于匹配类的,不适用在接口上标注注解的场景。匹配被设定注解标注的类,以及它的所有子类。仅匹配被设定注解标注的类,不包含其子类。不仅匹配该类,所有继承自。原创 2023-12-26 15:07:49 · 711 阅读 · 0 评论 -
SpringBoot 导入其他配置文件
文件,如果我们希望再定义一个独立的配置文件用来配置特定业务数据,而不希望把这些配置内容都堆积在 application 配置文件中,实现这个需求,我们直接使用配置文件中的。默认情况下,springboot 初始的项目中都有一个。原创 2023-11-22 15:28:29 · 325 阅读 · 0 评论 -
Spring @DependsOn 和 @ConditionalOnBean 的区别
最终两个实例都会创建,它用来控制当前Bean 一定在 DependsOn 所指向的Bean后面实例化。只有当所指向的Bean的实例存在时,才创建当前Bean,否则不创建。即要么都有,要么都无。1、都是当前bean实例化依赖另外的bean实例。在 Spring 中,注解。原创 2023-10-09 19:23:13 · 642 阅读 · 0 评论 -
Spring 实现覆盖容器中Bean的注解实现 @OverrideBean
项目开发中,有时第三方框架会自动注入Bean到Spring容器中,当我们有修改对应内置Bean实现的需求时,可以采用偷梁换柱的方式来重写内置的Bean,使用这种方式需要注意以下两点:1、对应的Bean在其他地方使用时,是基于接口注入的。2、如果不是基于接口注入的Bean,你可能需要同包名同类名的这种方式重写(可能会有问题,不推荐)。从以上2点我们还可以得出一个结论,那就是“基于接口编程”的好处。具体实现参考一下代码(代码片段,仅供参考,根据实际使用场景修改后使用):(END)...原创 2022-06-06 14:18:25 · 1219 阅读 · 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 · 2548 阅读 · 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 · 3088 阅读 · 1 评论 -
spring @Transactional 传播机制(参数 propagation )
@Transactional 的参数 propagation 是描述当前方法在被其他方法调用时,自己对待事务的立场。参数说明@Transactional(propagation = Propagation.REQUIRED)如果当前不存在事务,子方法就自己开启事务。父方法如果有事务,它就跟随父方法的事务被包裹其中。总之 REQUIRED 就是必须运行在事务中@Transactional(propagation = Propagation.SUPPORTS)如果当前存在了事务,原创 2021-10-28 14:44:04 · 659 阅读 · 1 评论 -
Spring Bean的生命周期
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁。而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作转载 2021-05-10 20:00:44 · 369 阅读 · 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 · 1887 阅读 · 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 · 5000 阅读 · 0 评论 -
关于Spring Bean的生命周期中几个常用方法(@PostConstruct、@PreDestroy 等)的执行顺序
按如下顺序执行:1、初始化顺序构造方法()BeanPostProcessor.postProcessBeforeInitialization()@PostConstructInitialingBean.afterPropertiesSet()BeanPostProcessor.postProcessAfterInitialization()2、关闭服务容器后@PreDestroyDisposableBean.destroy()(END)...原创 2020-08-10 16:50:13 · 2593 阅读 · 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 · 3106 阅读 · 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 · 4524 阅读 · 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 · 11839 阅读 · 0 评论 -
Spring SmartLifecycle 在容器所有bean加载和初始化完毕执行
在使用Spring开发时,我们都知道,所有bean都交给Spring容器来统一管理,其中包括没一个bean的加载和初始化。 有时候我们需要在Spring加载和初始化所有bean后,接着执行一些任务或者启动需要的异步服务,这样我们可以使用 SmartLifecycle 来做到。SmartLifecycle 是一个接口。当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应原创 2017-05-06 17:52:17 · 23842 阅读 · 3 评论 -
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 · 15638 阅读 · 5 评论 -
SpringBoot AOP 记录WEB请求日志
接上一篇文章: http://blog.csdn.net/catoop/article/details/71541612实现AOP的切面主要有以下几个要素:使用@Aspect注解将一个java类定义为切面类 使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。 根据需要在切入点不同位置的切入内容 使用@Before在切入点原创 2017-05-10 17:52:29 · 11816 阅读 · 4 评论 -
Shiro Ajax请求没有权限返回JSON,没有登录返回JSON
本文基于Shiro权限注解方式来控制Controller方法是否能够访问。 例如使用到注解: @RequiresPermissions 来控制是否有对应权限才可以访问 @RequiresUser 来控制是否存在用户登录状态才可以访问想了解Shiro是如何通过注解来控制权限的,可以查看源码 AopAllianceAnnotationsAuthorizingMethodInterceptor ,其原创 2017-04-04 20:59:50 · 25012 阅读 · 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 · 54617 阅读 · 13 评论 -
Spring计时秒表StopWatch
代码中常规的耗时处理方法为: long start = System.currentTimeMillis(); log.info("耗时{}毫秒", System.currentTimeMillis() - start);Spring 提供了更好的一种实现方法,代码示例如下: StopWatch watch = new StopWatch("耗时示例"); watch.start("开...原创 2019-07-28 00:08:45 · 1740 阅读 · 1 评论 -
Spring Boot 文件上传、批量上传
使用SpringBoot进行文件上传的方法和SpringMVC差不多,本文单独新建一个最简单的DEMO来说明一下。 主要步骤包括: 1、创建一个springboot项目工程,本例名称(demo-uploadfile)。 2、配置 pom.xml 依赖。 3、创建和编写文件上传的 Controller(包含单文件上传和多文件上传)。 4、创建和编写文件上传的 HTML 测试页面。 5、文件原创 2017-03-11 13:56:21 · 58706 阅读 · 9 评论 -
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 · 14166 阅读 · 0 评论 -
SpringBoot AOP 拦截器 Aspect
常用用于实现拦截的有:Filter、HandlerInterceptor、MethodInterceptor第一种Filter属于Servlet提供的,后两者是Spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行。 实现一个HandlerInterceptor可以实现接口HandlerIntercep原创 2017-05-10 15:59:51 · 26120 阅读 · 7 评论 -
Spring Boot 部署与服务配置
Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到独立的web容器中(Tomcat、weblogic等等),当然在此之前你要对程序入口做简单调整。项目构建我们使用Maven或Gradle,这将使项目依赖、jar包管理、以及打...原创 2016-01-26 17:32:25 · 184314 阅读 · 19 评论 -
Spring日志输出级别的热更新
这个问题是我曾经的一个问题,虽然比较容易解决,但是一直没有去写下来。问题是这样的:一般在开发环境下使用DEBUG级别的日志输出是为了方便查看问题,而在线上一般都使用INFO、WARN、ERROR级别的日志,主要记录业务操作或者错误的日志。下面两种场景:1、针对上面问题所述的情况,我们正常的操作是这样的:》开发的时候本地修改日志输出级别,如果打的包是上生产环境的包(不管你用手工还是CI打包...原创 2019-07-03 09:29:36 · 3537 阅读 · 0 评论 -
SpringBoot mybatis批量插入数据库(去重场景)
本文记录一个实例:1、用户邀请码表,里面存邀请码和关联的用户编号,每次有用户注册,就领取(关联)一个邀请码。邀请码都是系统提前生成空挡在表里待分配的(不要问为什么,目前业务就是这样设计的)。2、系统初始化的时候,或者空闲的邀请码快不够用的时候,会需要追加生成一批邀请码入库。一般系统上线的时候直接入库几十万或者几百万妥妥了。代码实现步骤:1、在 Controller 请求,调用Service...原创 2019-07-05 09:12:02 · 10572 阅读 · 0 评论 -
SpringBoot validator 完美实现+统一封装错误提示
1、杜绝通篇 if else 参数判断!!!2、普通参数方式3、实体对象参数方式效果参数不合法,自动使用统一异常返回错误,例如:{ "code": "-3", "message": "参数{age}最小18"}实现代码代码一次性给全,主要包含如下几个Java类,拿过去拷贝到项目中就能用:1、ValidatorController2、ValidatorVo3、...原创 2019-07-10 19:23:21 · 21568 阅读 · 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 · 1540 阅读 · 0 评论 -
Spring@Configuration和@Component区别,简单直观
spring常用注解 @Component 大家都不陌生,用来注解一些公共的服务类。在springboot 中,@Configuration 进入了大家的视界,此时你有没有一个小小的疑问 “这俩到底有什么具体区别”,本文一个示例完美给出答案。代码类:import org.springframework.context.annotation.Bean;import org.springfra...原创 2019-07-27 17:41:39 · 5222 阅读 · 7 评论 -
Spring Bean 的生命周期
1、创建(调用构造函数)2、set属性(set方法注入属性)3、判断是否实现BeanNameAware接口,并调用接口的setBeanName方法4、判断是否实现BeanFactoryAware接口,并调用接口的setBeanFactory方法5、判断是否实现ApplicationContextAware接口,并调用接口的setApplicationContext方法6、判断是否实现Be...原创 2019-08-16 23:23:26 · 886 阅读 · 0 评论 -
Spring Boot 集成Shiro和CAS
请大家在看本文之前,先了解如下知识点: 1、Shiro 是什么?怎么用? 2、Cas 是什么?怎么用? 3、最好有Spring基础可以先看看这两篇文章,按照这2篇文章的内容做一遍: Spring Boot Shiro 权限管理 CAS单点登录首先看一下下面这张图: 第一个流程是单纯使用Shiro的流程。 第二个流程是单纯使用Cas的流程。 第三个图是Shiro集成Cas后的流程。【流原创 2016-01-17 23:03:19 · 68566 阅读 · 34 评论 -
SpringMVC集成Swagger
此前写过一个关于SpringBoot集成Swagger的帖子,因为有的项目是SpringMVC的,所以也简单整理了一下,基本一致。本例使用的是Spring 4.1.6版本1、添加POM依赖 <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId>原创 2017-02-28 19:42:46 · 3298 阅读 · 1 评论 -
Spring Boot 集成Swagger
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。更多关于Swagger的作用,相信大家百度一下能了解的更全面,本文以SpringBoot中集成Swa原创 2016-02-15 16:02:25 · 77056 阅读 · 19 评论 -
Spring Boot 静态资源处理
Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。建议大家使用Spring Boot的默认配置方式,如果需要特殊处理的再通过配置进行修改。如果想要自己完全控制WebMVC,就需要在@Configuration注解的配置类上增加@EnableWebMvc(@SpringBootApplication 注解的程序入口类已经包含@原创 2016-01-12 09:23:50 · 206751 阅读 · 31 评论 -
Spring Boot 拦截器
上一篇对过滤器的定义做了说明,也比较简单。过滤器属于Servlet范畴的API,与Spring 没什么关系。 Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前原创 2016-01-12 09:21:48 · 160042 阅读 · 38 评论 -
Spring Boot Servlet
上一篇我们对如何创建Controller 来响应JSON 以及如何显示数据到页面中,已经有了初步的了解。 Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet、Filter、Listener、Interceptor 等等。当使用Spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所原创 2016-01-12 09:19:46 · 88958 阅读 · 19 评论 -
Spring Boot 入门
一、简介Spring 官方网站本身使用Spring 框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系。 随着Spring 3.0的发布,Spring IO团队主键开始摆脱XML配置文件,并且在开发过程中大量使用“约定优先配置”(convention over configuration)的思想来摆脱Spring框架中各种复杂的配置,衍生了Java原创 2016-01-12 09:17:19 · 105955 阅读 · 38 评论 -
Spring Boot JPA 连接数据库
本文将介绍如何在Spring Boot 工程中添加JPA作为持久化方式。修改 pom.xml 依赖与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 修改为 spring-boot-starter-data-jpa 即可,当然数据库驱动包也是不可少的,如下: <!-- MYSQL --> <dependency> <groupId>mysql</group原创 2016-01-13 09:41:51 · 47512 阅读 · 11 评论 -
Spring Boot Controller
接上篇文章,HelloWorld程序中我们已经创建了一个HellController,里面包含了响应JSON的方法,本文针对Controller再做一下讲解。回顾上篇文章,我们在Controller中使用 @RestController 注解,该注解是Spring 4.0引入的。查看源码可知其包含了 @Controller 和 @ResponseBody 注解。我们可以理解为 @Controller原创 2016-01-12 09:18:44 · 82052 阅读 · 50 评论 -
Spring Boot 日志记录 SLF4J
在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了。 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗。 而Log4j 更为灵活在性能上也相比 System.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志。 使用 System.out 是在当前线程执行的,写原创 2016-01-12 09:25:28 · 65354 阅读 · 13 评论