- 博客(19)
- 收藏
- 关注
原创 invokeBeanFactoryPostProcessors方法
最后这里就是获取并遍历BeanDefinitionRegistryPostProcessor了,直到reiterate为false,也就是新的BeanDefinitionRegistryPostProcessor没有再注册新的BeanDefinitionRegistryPostProcessor(最后一次遍历的时候,类名全包含在processedBeans中,就是前面已经都执行过了的,就解锁了),这里所有的postProcessBeanDefinitionRegistry就执行完了。
2024-02-21 15:40:10
373
原创 @Autowired注解原理
核心类#后置处理器#AutowiredAnnotationBeanPostProcessor#最终对象获取是通过#this.beanFactory.getBean()方法获取的。后置处理器方法#postProcessProperties。checkElements集合在前面准备工作中已经收集好。通过反射给加了@Autowired注解的自动赋值。收集类的@Autowired注解信息。
2024-02-20 15:08:03
372
原创 搭建jenkins部署java项目
1,保证服务器的jdk,maven与git安装完成,且环境变量设置正确。XX:MetaspaceSize=1024m的大小要足够大,不然可能会报异常溢出的可能。pipeline script,如图所示,主要是写构建的时候,执行的脚本代码。接着拉下去,看到流水线这里。这里定义下面的是有两个选择项目的。接着选择如图勾选丢弃旧的构建 ,天数随便选7即可。使用war包运行jenkins的情况。选择流水线然后点确认。最后点击生成流水线脚本即可。再编辑下图的选择,即可。两个选项选择一个即可。点击蓝色的流水线语法,
2023-06-19 16:35:38
1749
原创 @Transaction注解使用隔离,多线程情况下,数据库查询连接事务的一个问题
当第一次调用的时候,在第一个线程中调用逻辑,获取订单后,改变订单的预约状态,即改变为已预约的状态,最后提交事务,释放锁,然后多点的预约订单的线程运行的时候,一样去数据库查询符合预约条件的订单,这个时候,虽然上一个线程已经提交了事务,在navicat中查询也能正常查询到第一个线程提交的订单的状态。但是如果这里@Transaction注解的隔离级别使用的是默认的,第二个线程就会产生脏读,导致第二个线程去预约订单的时候,查询的可预约的订单就会包含上一个线程已经预约提交了的订单。具体业务遇到的问题。
2023-06-15 16:18:11
300
原创 SpringMvc零配置五
supports的逻辑其实很简单,就是判断handler这个对象的类型,比如如果是HandlerMethod则,则返回HandlerMethod匹配的HandlerAdatper(即AbstractHandlerMethodAdapter),其它的handlerAdapter的supports逻辑可能不一样,但是道理都是一样的,就是去判断handler对象的类型是否与它的supports方法中写的逻辑匹配。所有的参数解析,都是从request对象中获取值的。不同的返回值处理器,这里标志的值的设置是不同的。
2022-10-10 16:04:41
145
1
原创 SpringMvc零配置四
获取完method与requestmapping的映射maps后,接着就是遍历map,去建立uri与handlerMethod的映射,完整代码可以看上面的代码。getMappingForMethod(),就是在这个方法中整合了方法与类上面的RequestMapping注解信息的。这个HandlerMapping是建立url与HandlerMethod的映射关系,因为一个类中,是由多个方法的,所以只需要建立url与对象本身的映射关系就好了。到这里的问题是this.urlLookup这个对象的值是怎么来的。
2022-10-09 18:17:56
153
原创 SpringMvc零配置三
下面是初始化handlerMapping的代码,在FrameworkServlet中有一个ContextRefreshListenner内部类,当spring容器启动完成以后,就会触发这个onApplicationEvent方法。WebMvcConfigurationSupport类,HandlerMapping的实现类就是在这个类中,通过加了@Bean的注解的方法实例化的。而当钩子方法勾到的时候,就会像上面的代码一样,去获取this.configurers然后调用到我们自己写的方法。
2022-10-09 12:15:24
189
原创 SpringSecurity OAuth2过滤器源码解读。
chain.doFilter源码。2,当用户访问时,比如(/oauth/token)uri时,第一个拦截的filter是ClientCredentialsTokenEndpointFilter,而拦截的方法,在其父类AbstractAuthenticationProcessingFilter的doFilter方法中。3,requiresAuthentication(request,response)方法,该方法主要是进行uri路径的匹配,只有当访问的uri是/oauth/token时,才会返回true。..
2022-07-31 22:45:21
2306
原创 JDK动态代理
生成代理对象的时候会调用jdk自动生成的代理类的构造方法,将传入的InvocationHandler赋值给了Proxy的属性h。当代理类调用方法时,就会去调用程序员自己写的invocationHandler的invoke方法的逻辑,即代码super.h.invoke方法的调用。 obj为生成的代理类,firstInstance根据传入的obj代理类去生成代理对象。setThreadCallbacks方法将程序员写的callbacks放到代理类的对象ThreadLocal属性中。 ReflectUtils.n
2022-07-12 14:00:41
102
原创 SpringMVC整个Tomcat底层原理
SpringMVC先启动Tomcat等服务器。Tomcat只关心容器里面的servelt,当有请求访问的时候,Tomcat中的tuling-web项目根据app这个路径去找对应的servelt。由第一张图片可以知道app路径映射的servlet是DispatcherServlet。Tomcat容器根据请求路径去构造一个HttpReuqest对象,作为DispatcherServlet的请求参数,DispatcherServlet拦截后,先获取Controller注解的bean,然后遍历找到匹配的mappin
2022-07-12 13:59:44
209
原创 CountDownLatch
一、概念CountDownLatch可以使一个或多个线程等待其他线程各自执行完毕后再执行。CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。二、常用方法说明CountDownLatch(int count):构造方
2022-07-12 13:58:35
134
原创 JVM与JMM
常见关于JVM的问题。JVM目录JVM的位置JVM体系结构类加载器ClassLoader Bootstrap启动类加载器在java中打印出来是null。第一个与第二个会报空指针错误,因为object.getClass().getClassLoader()获取的是Bootstrap启动类加载器,而这个加载器是c++的,在java中为null。JVM的双亲委派机制与沙箱安全机制双亲委派机制:当需要加载一个类的时候,先去JVM的顶层Bootstrap启动类加载器中查找,找到就用,找不到就去extention扩展类
2022-07-09 11:24:06
273
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人