spring
文章平均质量分 82
追逐消失的记忆
这个作者很懒,什么都没留下…
展开
-
@ConfigurationProperties注解的工作原理
@ConfigurationProperties是springboot新加入的注解,主要用于配置文件中的指定键值对映射到一个java实体类上。那么它是怎么发挥作用的呢?下面我们将揭开@ConfigurationProperties的魔法。1 概述ConfigurationPropertiesBindingPostProcessor这个bean后置处理器,就是来处理bean属性的绑定的,这个bean后置处理器后文将称之为properties后置处理器。你需要知道以下几件事:ioc容器context的e转载 2021-11-22 14:43:16 · 2642 阅读 · 0 评论 -
spring 对于bean的增强,BeanPostProcessor
在当前使用spring框架中经常存在对spring原有注册的bean需要进行增强就需要使用到BeanPostProcessor接口。在spring框架体系下,我们通过实现BeanPostProcessor接口降需要增强的业务接入到spring体系中,有spring容器在启动的过程中会通过getBeanNamesForType 来加载所有实现过BeanPostProcessor接口的类。从而在通过postProcessBeforeInitialization、postProcessAfterInitiali原创 2021-09-07 14:09:54 · 1070 阅读 · 0 评论 -
dubbo Filter 过滤器(拦截器)
dubbo filter是在spring的filter的延伸,通过dubbo 的filter的实现可可以控制dubbo进行服务调用时的上下文RpcContext.getContext() 获取当前dubbo服务运行线程的上下文快照1、定义Filter实现com.alibaba.dubbo.rpc.Filter接口。添加Activate,其注解含义如下:group :所属组 例如消费者、服务提供者 啥的order :多个Filter的执行顺序 (越小越早)package com.test.wang原创 2021-08-26 14:38:31 · 3410 阅读 · 0 评论 -
Filter中抛出异常的处理
Feileimport java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.LinkedList;import java.util.List;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax原创 2021-07-16 09:51:20 · 3543 阅读 · 0 评论 -
spring 多数据源
spring支持DataSourece通用配置#============================================================================# MySQL#============================================================================jdbc.mysql.driver=com.mysql.jdbc.Driverjdbc.mysql.url=jdbc:mysql:原创 2021-05-24 16:26:42 · 502 阅读 · 3 评论 -
spring Transactional引出的AOP切面动态代理
在说明spring 中@Transactional的使用前,我们先看下被@Transactional注解的方法的调用链从上图可以看到方法testInternationalize()所调用的对象其实sun创建的Proxy的一个bean,并不是testInternationalize()方法所在接口实现类的真实bean,而是通过spring框架进行增强的proxy bean (spring 所创建的bean可能存在多层的AOP拦截,因此其调用的根本原理也就是依据JdkDynamicAopProxy 的原创 2021-05-08 16:50:54 · 525 阅读 · 0 评论 -
Dubbo负载均衡方式自定义拓展
由于项目需求特殊,需要在dubbo中实现一种能指定远程地址的分发机制,使用了dubbo留出来的扩展点的方法实现了这个功能,也就是实现了AbstractLoadBalance接口,并重写了doSelect方法,在doSelect方法实现中,根据调度服务方法传进的参数也就是指定的远程主机的ip地址和端口进行了过滤,最终返回满足该条件的Invoker作为最终的返回值给调用端,在通过SPI机制将拓展服务负载均衡方式加载到dubbo的服务体系中主要是在dubbo-2.8.4.jar\META-INF\dubbo\原创 2020-11-05 17:42:18 · 720 阅读 · 0 评论 -
dubbo集群容错之loadbalance负载均衡 源码解析
首先我们看看LoadBalancepackage com.alibaba.dubbo.rpc.cluster;import java.util.List;import com.alibaba.dubbo.common.URL;import com.alibaba.dubbo.common.extension.Adaptive;import com.alibaba.dubbo.common.extension.SPI;import com.alibaba.dubbo.rpc.Invocatio原创 2020-11-05 17:20:35 · 567 阅读 · 0 评论 -
Spring初始化后Bean进行bean的增强方式
后处理Bean也称之为Bean的后处理器,作用是:在Bean初始化的前后,对Bean对象进行增强。它既可以增强一个指定的Bean,也可以增强所有的Bean,底层很多功能(如AOP等)的实现都是基于它的,Spring可以在容器中直接识别调用。【示例】要对“所有”的bean的初始化的时候进行增强(打印一句话)第一步:创建MyBeanPostProcessor类,实现接口BeanPostProcessor//后处理bean,:用来对bean进行功能增强,可以实现,对所有,或某个bean的初始.原创 2020-10-26 09:46:48 · 3031 阅读 · 0 评论 -
Spring 方法级别参数校验 之MethodValidationPostProcessor
你在书写业务逻辑的时候,是否会经常书写大量的判空校验。比如Service层或者Dao层的方法入参、入参对象、出参中你是否都有自己的一套校验规则?比如有些字段必传,有的非必传;返回值中有些字段必须有值,有的非必须等等~若你追求干净的代码,甚至有代码洁癖,如上众多if else的重复无意义劳动无疑是你的痛点,那么本文应该能够帮到你。 Bean Validation校验其实是基于DDD思想设计的,我们虽然可以不完全的遵从这种思考方式编程,但是其优雅的优点还是可取的,本文将介绍Spring为此提供的解决方案~转载 2020-10-22 16:28:33 · 4487 阅读 · 1 评论 -
mysql insert 偶出现Deadlock死锁场景分析
有一张表A,先删除数据,如果影响行数为0,则执行INSERT插入数据。很常见的场景,在生产上也跑了很久,没有出现什么问题。但是有一次在测试环境做压测时居然出现了死锁,Deadlock found when trying to get lock; try restarting transaction因为对mysql锁不熟悉,为什么insert也会死锁,不是一般在update的时候会死锁吗? 很好奇,于是开始寻找原因…mysql锁是跟数据库设置的隔离级别有关系的,不同的隔离级别,锁也各不相同,只要是原创 2020-10-20 11:33:00 · 770 阅读 · 0 评论 -
spring aop切面实现对bean增强的过程
spring的两大核心就是ioc和aop。在关于ioc依赖注入的文章中,我们了解了如何根据BeanDefinition创建Bean,然后在BeanPostProcessor中处理@Autowired和@Resource两个注解,自动注入Bean。本文将讲解另外一块核心内容,aop切面。注册AnnotationAwareAspectJAutoProxyCreator 触发AnnotationAwareAspectJAutoProxyCreator...转载 2020-09-27 16:31:42 · 2237 阅读 · 0 评论 -
CGLIB动态代理在Spring AOP应用中的运用
首先子这里我同个一个实例引入CGLIB在spring AOP中的使用业务启动测试类import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import com.wangyong.learn.project.spring.test.BaseTest;/** * @author Administrator */public class TesAopt extends Base原创 2020-09-25 15:19:21 · 289 阅读 · 0 评论 -
Dubbo理解概括
这段时间学习了下公司关于dubbo的使用,以API的形式接入dubbo服务1、通过加载poperties的形式将系统的配置 信息加载到System环境变量中2、通过@Bean的形式注册duboo的基础配置信息ApplicationConfig、RegistryConfig、ProtocolConfig、ProviderConfig、ConsumerConfig等信息3、而服务的暴露和引用则可以通过private Object referService(Object bean,Class&.原创 2020-08-10 15:15:03 · 471 阅读 · 0 评论 -
spring 容器为什么能够解析注解需要干的事情
在常见的spring使用的项目中,我们经常大量使用到注解如:@Autowired、@Component、@Bean等这些注解的。从之前的spring容器启动(2.1.6版本)过程中,知道spring加载bean的工厂主要是在ConfigurableApplicationContext是实现类AnnotationConfigApplicationContext中的 beanFactory (AnnotationConfigApplicationContext 的父类GenericApplicationCo原创 2020-08-06 16:56:58 · 306 阅读 · 0 评论 -
spring.factories 与 注解的联合使用案例
在阅读spring-boot相关源码时,常常见到spring.factories文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:“明明自动配置的类已经打上了@Configuration的注解,为什么还要写spring.factories文件?”这个话题需要从@SpringBootApplication注解开始说起。查看@SpringBootApplication源码,我们能看到继承的以下注解:@Target(ElementType.TYPE)@Re转载 2020-07-28 10:55:06 · 1243 阅读 · 0 评论 -
Spring Factories
Spring Boot中有一种非常解耦的扩展机制:Spring Factories。这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的。什么是 SPI机制SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java SPI机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的转载 2020-07-28 10:46:02 · 266 阅读 · 0 评论 -
redis分布式锁事务解决方案
通常我们使用redisTemplate 的setIfAbsent()方法进行加锁,在到使用expire()方法进行设置超时时间的是时候,两个操作时使用两个链接不在一个事务中,当存在客户端setIfAbsent()加锁成功后服务中断,expire()无法进行超时设置,导致死锁的情况。针对以上情况可以采取两种解决方案:方案一:将锁的超时间放在锁(key)的值(里面),及redis客户端在获取锁的时将客户端获取锁的时间加上超时时间形成失效时间点形成一个key-value的数据存在redis中,当客户端原创 2020-07-24 11:30:07 · 3125 阅读 · 1 评论 -
spring是怎样管理mybatis的及注入mybatis mapper bean的
1.spring启动mybatis的两个重要类:SqlSessionFactoryBean和MapperFactoryBean,这两个类都是org.mybatis.spring jar包的。是用来启动mybatis的关键,spring为什么能识别这两个类?因为这两个类实现了spring的接口。这里面的重点就是 org.mybatis.spring.SqlSessionFactoryBean 与 org.mybatis.spring.mapper.MapperFactoryBean[b] 实现了 sp原创 2020-07-10 15:39:33 · 1360 阅读 · 1 评论 -
Spring中的InitializingBean接口的使用
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。测试,如下:package com.wangyong.learn.project.init.beans;import org.springframework.beans.factory.InitializingBean;/** * spring bean的拓展 * * @author wy */publi原创 2020-07-10 15:13:50 · 286 阅读 · 0 评论 -
java动态代理Proxy.newProxyInstance
利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现,spring aop就是此原理。在spring中主要处理业务思路的两种方式,一、通过动态代理的原理,使需要进行切面处理的业务。通过代理技术将需要切入的业务前...原创 2019-12-03 16:59:27 · 2810 阅读 · 0 评论 -
SpringBoot之自定义注解(基于BeanPostProcessor接口实现)
步骤使用@interface 自定义注解 编写注解处理类,实现BeanPostProcessor接口原理实现BeanPostProcessor接口的类即为Bean后置处理器,Spring加载机制会在所有Bean初始化的时候遍历调用每个Bean后置处理器。其顺序为:Bean实例化-》依赖注入-》Bean后置处理器-》@PostConstruct缺陷只有在会示例化成Bean的类中...转载 2019-09-04 15:35:03 · 1909 阅读 · 0 评论 -
dubbo框架原理说明---第一章
一、dubbo定义1、dubbo官方定义:DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案2、主要实现逻辑方案:使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和spring框架无缝集成。是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。3、主要...转载 2019-03-19 13:29:21 · 234 阅读 · 0 评论 -
数据一致性
在高并发的场景里,如何保证一个业务事务的数据一致性非常重要在高并发的业务场景中通常出现这样的现象T1读数据B(sql1)T2读数据B(sql2)T1修改数据B(sql3)(数据库会自动对事务加上排他锁)T2修改数据B(sql4)(数据库会自动对事务加上排他锁)在这样的场景中通常会出现几种情况:1、不加锁的条件下,T2修改产生脏数据。或者当T2修改以查询的结果为条件则修改...原创 2018-12-13 10:52:37 · 2858 阅读 · 0 评论 -
Dubbo源码分析——服务发布
了解服务发布Dubbo官方文档说明了服务提供者暴露服务的主过程,如图所示:首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过ProxyFactory类的 getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转化。接下来就是Invoker转换到Export...转载 2019-08-28 17:34:52 · 192 阅读 · 0 评论 -
dubbo源码--如何与spring无缝对接
官方api说明:Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于Spring 的 Schema 扩展进行加载。在使用dubbo的时候会有两个配置文件,provider.xml和consumer.xml文件。dubbo是怎么解析这两个xml的呢?细心的你估计看到了,这...转载 2019-08-28 16:27:41 · 520 阅读 · 0 评论 -
spring 容器加载源文案解释(第三章AbstractApplicationContext)
AbstractApplicationContextpackage org.springframework.context.support;/** 抽象实现{@link org.springframework.context. context}*接口。 不强制要求配置使用的存储类型;简单的实现公共上下文功能。使用模板方法设计模式,*需要具体的子类来实现抽象方法。** 与普通的Bean...原创 2019-08-13 19:20:56 · 571 阅读 · 0 评论 -
spring ioc理解
一直对于spring 的ioc的理论描述概念比较模糊,不能有一个系统的认识,于是这段时间通过翻阅书籍以及网上查询资料有了一个比较系统性的解释。spring的ioc描述又名DI(Dependency Injection)依赖注入。其意思是将调用者需要的对象的依赖关系交由第三方进行管理,以及注入。通过翻阅书籍理解IOC的原理是:将业务场景(business)、业务场景进行行为操作...原创 2019-01-15 16:22:55 · 652 阅读 · 0 评论 -
spring启动加载bean的过程
参考网站:https://blog.csdn.net/aini201/article/details/77097314当Web应用启动时,contextInitialized方法会执行载入根上下文(IOC容器):(1)spring的web项目启动的时候会,启动我们常用的监听类。 <context-param><param-name>contextCo...原创 2019-01-11 17:32:27 · 1944 阅读 · 0 评论 -
通过tomcat容器启动spring容器的启动过程
参考网站:https://www.cnblogs.com/RunForLove/p/5688731.html通过对spring源码的解读,跟踪spring容器的启动过程,掌握SpringMVC是如何工作的;掌握Spring源码的设计和增强阅读源码的技巧。为可持续性的使用spring框架高效集成开发,解决系统一些疑难杂症提供强有力的支撑。一、需要掌握的理论业务点:1、Web容器初始化过程...原创 2019-01-11 16:40:50 · 9812 阅读 · 2 评论 -
通过ServletContextListener监听进行数据的初始化
2、由于web容器在启动的过程中实现了对ServletContextListener这个接口的监听,当程序中有ServletContextListener这个接口被实例化的时候,web容器会让其运行contextInitialized()这个方法package com.wangyong.app.web.listener;import com.wangyong.app.sys.facade...原创 2019-01-11 16:24:58 · 1105 阅读 · 0 评论 -
数据脏读造成业务处理失败
一、在程序中通常一个事务分为N数据操作操作步骤,包括读写操作因此通常会产生,在并发的场景中由于数据的脏读导致业务修改失败,在分布式是系统对于解决数据的一致性产生极大的成本通常会采取事务隔离机制来处数据的一致性:事务隔离五种级别: TRANSACTION_NONE 不使用事务。 TRANSACTION_READ_UNCOMMITTED 允许脏读。 ...原创 2018-12-12 18:15:48 · 259 阅读 · 0 评论 -
spring事务配置
在开发中需要操作数据库,进行增、删、改操作的过程中属于一次操作,如果在一个业务中需要更新多张表,那么任意一张表的更新失败,整个业务的更新就是失败,这时那些更新成功的表必须回滚,否则业务会出错,这时就要用到事务,即这个业务的操作属于一个事务,事务具有原子性、隔离性、一致性、持续性。这时便用到了事务,事务控制的目的是保证一组操作要么全部成功,要么全部失败。spring提供了对事务的支持,在spring...原创 2018-12-12 15:27:17 · 115 阅读 · 0 评论 -
spring事物篇提交控制
一、MySQL数据库事务自动提交 对于mysql数据库,默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式,下面是查看方式: 查看是否自动提交命令(ON表示开启自动提交,值为1,OFF表...原创 2018-12-12 15:15:29 · 1773 阅读 · 0 评论 -
java web 服务的web.xml详解
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="原创 2018-10-10 11:25:37 · 164 阅读 · 0 评论 -
java web跨域解决方案
跨域问题产生的原因是由于在浏览器的访问域名为A网站时,A网站的页面访问B域名的网络请求时,使用A的域名请求B的业务两个请求为服务不在同一域名下从而产生的问题。(通常在Ifream,ajax请求外网服务器产生该问题出现)具体解决机制为:B域名下服务允许A域名下的网页内部请求B的服务解决方案为一、注解方式 推荐这种方法,简单快捷,但Spring版本需要4.2以上,只需在...原创 2018-10-12 14:57:13 · 4415 阅读 · 0 评论 -
spring 容器几种启动方式
1、spring ioc容器web项目中通过servlet机制启动spring容器具体启动实现方式:<!-- Spring监听器 --><listener> <description>Spring监听器</description> <listener-class>org.springframework.web....原创 2019-01-31 16:05:27 · 2528 阅读 · 0 评论 -
diapatcherServlet的初始化过程
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源。 https://blog.csdn.net/qq_38410730/article/details/79426673参考网址:https://blog.csdn.net/qq_38410730/article/details/79426673DispatcherServlet实现了Servlet接口的实现类。Servlet的生命...原创 2019-01-22 15:43:34 · 529 阅读 · 0 评论 -
DispatcherServlet 请求处理流程
子容器创建完成后,当有请求到来时,DispatcherServlet就可以进行分发处理了。我们首先根据Servlet规范查找doService()方法,这个方法在DispatcherServlet本身就有实现:@Override protected void doService(HttpServletRequest request, HttpServletResponse response)...转载 2019-01-22 16:12:44 · 882 阅读 · 0 评论 -
spring 容器加载源文案解释(第二章ContextLoader )
package org.springframework.web.context;/*** 为根应用程序上下文执行实际的初始化工作。* Called by {@link ContextLoaderListener}.** 在{@code web中查找{@link #CONTEXT_CLASS_PARAM "contextClass"}参数。* 返回到{@link org.s...原创 2019-08-13 19:16:49 · 916 阅读 · 0 评论