spring
虎哥和你一起学编程
路漫漫其修远兮吾将上下而求索
展开
-
spring事件机制
通过applicationContext.publishEvent这种方式发送的事件,默认是同步处理,如果在listener那里通过加上@Async则可以变成异步处理。原创 2022-02-08 09:44:48 · 337 阅读 · 0 评论 -
Spring @Scheduled的坑
spring的定时任务有两个坑: 1.单线程执行,多个定时任务不能同时执行 2.如果当前定时任务还没有结束,那么下一次定时任务的时间到了也不会触发。 解决办法: 加上@EnableAsync注解...原创 2021-12-23 14:24:22 · 1108 阅读 · 0 评论 -
Spring三级缓存解决循环依赖问题
一个bean的声明周期包含实例化和初始化两个过程,通过暴露早期bean的方式可以解决循环依赖的问题。 三个缓存如下 /** Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** Cache of single...原创 2021-11-27 21:47:16 · 103 阅读 · 0 评论 -
FactoryBean
beanFactory通常与FactoryBean容易混淆,今天我就来讲解一下FactoryBean.spring容器中有两种类型的Bean,一种是普通的Bean,一种是工厂bean.FactoryBean的存在的目的是方便我们创建一些复杂的对象,如果是单例的,会帮我们将单例对象放入容器中。 eg:1.定义User类public class User { private Integer id; private String name; p...原创 2021-11-13 15:29:52 · 232 阅读 · 0 评论 -
beandefinition的full模式与lite模式
beanDefinition有full模式与lite模式,当被@configuration注解标记时为full模式,否则为lite模式。full模式下可以表示bean之间的依赖关系,注入的是容器中被cglib代理的bean.而lite模式下注入的是类本身。原创 2021-11-04 12:55:30 · 364 阅读 · 0 评论 -
RestTemplate没有自动装配Bean
springBoot1.4版本之前,springboot会自动装配一个RestTemplate的Bean,1.4之后需要自己声明一个RestTemplate。通过RestTemplateBuilder来构建。 @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); }...原创 2021-08-02 11:04:31 · 2153 阅读 · 0 评论 -
使用AopContext.currentProxy()获取当前类的代理类
当我们在service方法里面进行方法的自调用时,会发生事务失效的情况,这个时候可以通过AopContext.currentProxy()来获取当前类的代理类。 AopContext.currentProxy()是通过ThreadLocal来实现的。 /** * Class containing static methods used to obtain information about the current AOP invocation. * * &...原创 2021-05-19 17:53:26 · 3641 阅读 · 0 评论 -
spring手动回滚事务
spring除了使用声明式事务外,还可以手动操作事务的回滚和提交,只是不推荐使用,因为这样和业务代码和事务耦合性太大。 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();...原创 2021-04-26 11:59:35 · 198 阅读 · 0 评论 -
spring使用命令行参数
平常我们在启动springboot应用时可以使用main方法的args参数,在命令行我们可以使用 --key=value方式来传递参数,底层源码如下: /** * Parse the given {@code String} array based on the rules described {@linkplain * SimpleCommandLineArgsParser above}, returning a fully-populated * {@l...原创 2021-04-19 16:07:23 · 591 阅读 · 0 评论 -
@Async自带的线程池导致的oom
我们平常如果想使用spring自带的线程池,可以使用@EnableAsync,然后在需要异步调用的方法上加上@Async即可异步调用。但是spring调用异步方法的默认的线程池SimpleAsyncTaskExecutor却并不是真正意义上的线程池,它会为每一个任务都创建一个线程,这样当我们一次性有很多的任务来时,就会创建大量的线程,可能造成OOM. /** * {@link TaskExecutor} implementation that fires up ...原创 2021-04-07 20:25:32 · 700 阅读 · 0 评论 -
@Repository和@Mapper的区别
@Repository和@Mapper都是用在dao层上的注解,标记为持久层,不过使用上也会有区别 @Repository是spring的注解,标记为一个bean,配合mybatis时需要配置@MapperScan @Mapper是mybatis的注解,不需要额外的@MapperScan扫描....原创 2021-01-15 14:41:19 · 2040 阅读 · 0 评论 -
使用DeferredResult异步处理请求
我们在实际开发的过程中,可能会遇到需要长轮循的情况。 长轮询指的是客户端向服务端发送一个请求,然后服务端将该请求hold住,另起线程进行处理,处理完后,再返回结果,从而提高服务器的处理能力,但是对于浏览器来说还是同步的,需要等待服务端返回。 可以使用Callable或者DeferredResult进行异步响应。 下面就来演示一下使用spring提供的DeferredResult来提供一个异步处理的接口。 @GetMapping("test") ...原创 2020-09-08 21:45:37 · 916 阅读 · 0 评论 -
关闭jvm和spring容器时添加钩子
平常我们在jvm的时候,如果想做点儿事情怎么办呢,其实很多的框架都为我们预留了钩子(Hook)这种东西,就是为了扩展性,能满足一些需求。先看一下jvm的钩子 public class Test { public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("jvm s...原创 2020-05-31 19:42:55 · 1147 阅读 · 0 评论 -
JDK动态代理与cglib
JDK 动态代理是java提供的,spring aop默认就是使用jdk动态代理来实现的,但是JDK动态代理需要类实现接口,底层是通过实现相同的接口,而cglib需要导入cglib的jar,它能够代理没有实现接口的类,底层是生成被代理类的子类。 在我们平常使用spring来依赖注入时,经常会用到两个注解@Autowired和@Resource,其中@Autowired...原创 2018-03-23 23:56:35 · 121 阅读 · 0 评论 -
spring中事务的传播行为
之前在学习到spring的事务的时候,一直不知道传播行为是什么意思。后来偶然的一次,看到有一位老师讲到了spring的事务的传播行为才恍然大悟。 首先spring帮我们来管理事务是通过aop的形式,这个也是aop要解决的核心问题之一。就是帮我们从重复的代码中解救出来,通常如果一个service如果加入了事务,那么在aop帮我们在进入service的这个方法之前呢就会为我...原创 2018-03-24 23:54:01 · 243 阅读 · 0 评论 -
Spring在非controller中获取request对象
在Controller中,我们可以直接在参数中加上HttpServletRequest request,springMVC就会自动将request绑定进参数,而如果我们想在其他地方获取request就要如下这么做了。 首先在web.xml中添加一个监听器,针对request级别的,要和ContextLoaderListener区分开, <listener>...原创 2018-03-20 23:19:58 · 1544 阅读 · 0 评论 -
编程式事务和声明式事务
spring提供了两种方式来为我们的逻辑层加上事务,一种是编程式事务,另一种是声明式事务。 编程式事务指的是在代码里面显式的开启事务,并关闭事务。这种做法控制粒度更细,但是对代码的侵入性更大。 声明式事务是通过注解或者xml的形式,通过aop的方式,为我们的逻辑层加上事务。 在我们的逻辑层,可能会存在多个配有事务的service之间相互调用,这个就是事务的嵌套。spring...原创 2018-03-25 23:51:40 · 336 阅读 · 0 评论 -
Aop多个切面切同一个地方的优先级问题
以前就想过这个问题,如果多个切面切了同一个地方,那么多个切面的优先级是怎么样的呢,只不过这个念头以前在大脑里面一闪而过,没有深究,今天看了一个视频讲到了这个问题。我才知道任何细节其实背后都隐藏着知识点,伟大的spring其实早就想到了这一点。它给我们提供了一些解决办法让我们来管理多个切面切同一个地方时的优先级。 第一种办法是用@Order()注解,括号里面可以填写一个>=0的整数,...原创 2018-04-01 21:29:49 · 4676 阅读 · 0 评论 -
祥解spring事务的隔离级别
spring提供了编程式事务和声明式事务两种方式来管理事务。编程式的事务控制的粒度更细,可以达到代码块级别,而声明式事务只能到达方法级别,不过可以通过变通,例如将需要事务的代码块,抽离出一个方法来达到细粒度的控制。 为了界定多个事务的边界,spring提供了以下的传播级别: propagation_required:默认级别,如果当前存在事务,则加入当前事务,如果当前不存在事务,则创建一...原创 2018-03-26 23:47:26 · 165 阅读 · 0 评论 -
spring在代码里面获取xml配置文件的属性
我们通常在xml里面配置一些经常会变化的参数,达到简单配置的目的。有的时候我们需要在程序中获取到这些配置的属性,这个时候就要用到PropertyPlaceHolder相关的类了。 首先来个xml文件 test.xml use=aaapass=bbb然后写个配置类 MyPropertyHolderpublic class MyPropertyHolder extends Prop...原创 2018-04-11 23:46:57 · 1827 阅读 · 0 评论 -
Spring的后置处理器
先来讲一下junit配置spring进行单元测试,因为我们的demo就是在这种环境下测试的. 首先用maven引入两个依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <vers...原创 2018-03-13 23:05:47 · 1188 阅读 · 1 评论