spring
文章平均质量分 79
spring框架
拾光师
瞧一瞧,看一看,好吃还不贵。量大管饱
多年java开发经验,现征战于互联网广告行业
分享各种java相关知识,每周至少五更
展开
-
restTemplate拦截器ClientHttpRequestInterceptor
restTemplate提供了一个拦截器链来对请求和响应做一些定制化的操作,只需要实现ClientHttpRequestInterceptor接口中的intercept方法。restTemplate拦截器ClientHttpRequestInterceptor。然后配置RestTemplate的时候将拦截器添加进去。原创 2024-05-08 09:55:38 · 633 阅读 · 0 评论 -
restTemplate解析401异常失败
这时候需要在创建restTemplate的时候更改requestFactory,使用HttpComponentsClientHttpRequestFactory。如果使用restTemplate默认构造器的话,在进行错误解析的时候,使用。restTemplate解析401异常失败。原创 2024-05-07 10:09:26 · 227 阅读 · 0 评论 -
spring事务源码分析
事务源码分析<!-- 启用事务注解 --><tx:annotation-driven transaction-manager="transactionManager"/>与AOP的标签解析相同,tx:annotation-driven标签也是自定义标签,http://www.springframework.org/schema/tx找到对应的handler是TxNamespaceHandlerhttp\://www.springframework.原创 2024-05-06 10:59:22 · 302 阅读 · 0 评论 -
spring源码分析之AOP开启注解
而在registerBeanPostProcessors(beanFactory)中会去进行注册BeanPostProcessor,在上面解析xml注册的AnnotationAwareAspectJAutoProxyCreator的结构还挺复杂,实现的重要的两个接口都标出来了,实现了BeanPostProcessor和BeanFactoryAware两个接口。即进行自定义标签的解析,会去META-INF/spring.handlers中寻找对应的handler,该标签的namespace是。原创 2024-05-05 08:59:43 · 1260 阅读 · 1 评论 -
spring如何解决循环依赖
对于setter注入造成的循环依赖,spring采用的是提前暴露刚完成的构造器实例化但未完成setter方法注入的bean来实现的,而且只能解决单例作用域的bean。三级缓存 singletonFactories 提前暴露的一个单例工厂,二级缓存的对象就是通过这个单例工厂创建的。看上去好像二级缓存就可以解决循环依赖了,三级缓存的对象工厂的意义是什么呢?来看一下不管有没有循环依赖,都会创建好一个对象,然后放入到三级缓存中。也就是做了个延迟代理的作用,在二级缓存里存放的其实是代理过的对象。原创 2024-05-04 23:50:46 · 916 阅读 · 0 评论 -
spring源码分析之获取bean
transformedBeanName方法,对传入的beanName进行转换,因为传入的name不一定是beanName,也可能是FactoryBean,检查name的前缀是不是&,如果是别名的话,从aliasMap中获取真正的beanName。getObjectForBeanInstance方法,进行bean的实例化,缓存中记录的是最原始的bean状态,对于FactoryBean需要再次进行处理。isPrototypeCurrentlyInCreation方法,原型的依赖检查。依赖注入是在这里进行的。原创 2024-05-03 07:56:52 · 353 阅读 · 0 评论 -
ProxyFactoryBean的作用
ProxyFactoryBean是spring ioc环境中创建AOP应用的底层方法,通过它完成了对AOP的封装。ObjenesisCglibAopProxy获取代理。JdkDynamicAopProxy获取代理。原创 2024-05-02 09:29:40 · 263 阅读 · 0 评论 -
BeanDefinition属性
AbstractBeanDefinition是一个抽象类,定义了BeanDefinition中对应的get/set方法的属性。可以动态设置父Bean,同时兼具了RootBeanDefinition和ChildBeanDefinition的功能。可以让子BeanDefinition定义拥有从父BeanDefinition那里继承配置的能力。接口,表示注解类型的BeanDefinition,拥有获取元数据和方法元数据的能力。BeanDefinition是用来描述一个Bean实例的,包括属性值、构造方法。原创 2024-05-01 23:43:56 · 25 阅读 · 0 评论 -
spring源码分析之上下文构建
org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory方法,关闭原始的beanFactory,并创建新的BeanFactory。调用的是org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean,其内实际调用的是doCreateBean。原创 2024-04-30 10:20:12 · 512 阅读 · 0 评论 -
spring Bean的实例化过程
然后使用BeanFactoryPostProcessor来完成对bean的增强,BeanFactoryPostProcessor是一个接口,有很多的实现类。如PropertySourcesPlaceholderConfigurer来完成配置中的${…Bean的实例化过程。原创 2024-04-29 10:10:24 · 324 阅读 · 1 评论 -
使用Spel表达式
前两天在完成一个需求的时候需要读取对象中某注解内的表达式来进行解析,其实两个反射可以解决这个问题。突然想到spring中spel表达式不就是用来解析表达式的吗?干脆用spel表达式来进行解析吧。当然Spel的强大远不止于此,只不过我目前只用到了模板表达式,后续如果用到别的在进行补充。先说明一下我这种场景使用的是模板表达式。原创 2024-04-28 10:02:21 · 208 阅读 · 0 评论 -
spring配置双数据源
配置好了数据源之后,需要进行定义动态数据源,继承AbstractRoutingDataSource,AbstractRoutingDataSource是基于特定的查找key路由到特定的数据源。配置是都搞定了,那怎么切换呢,可以看到在动态数据源中其实是根据key来进行路由获取数据源的,其实就是怎么改变这个key,而且是动态改变,就用spring aop来进行解决吧。前段时间有个需求,需要将数据存到两个数据库中,一个库中存放主信息,一个库中存放特殊信息,看来是要使用双数据源了,搞起来吧。原创 2024-04-27 10:40:28 · 339 阅读 · 1 评论 -
spring自定义属性编辑器
属性编辑器用来解析bean的配置文件中的属性标签,spring的BeanWrapperImpl默认会注册CustomCollectionEditor(集合)、CustomMapEditor(Map)、CurrencyEditor(货币)、ByteArrayPropertyEditor等,可以使用。实现了BeanFactoryPostProcessor接口,由spring容器自动检测并执行。方法,负责向spring容器注册属性编辑器。实现类作为bean进行注册。这个bean,并写入属性。原创 2024-04-26 11:14:01 · 1023 阅读 · 0 评论 -
spring引入外部属性文件
这样配置当然也可以,只是要去修改spring配置文件的时候由于spring的配置文件内容太多,不太方便,所以有时候会引入外部的属性文件。有时候我们并不想把所有的配置信息都放到spring的配置文件中,这样的话也不太好维护,比如说数据库的信息。会生成一个PropertySourcesPlaceholderConfigurer类来解析占位符。db.properties属性文件。spring引入外部属性文件。原创 2024-04-25 14:16:14 · 208 阅读 · 0 评论 -
spring的扩展接口
它扩展自BeanFactoryPostProcessor,在执行BeanFactoryPostProcessor的功能前,提供了可以添加bean definition的能力,允许在初始化一般bean前,注册额外的bean。例如可以在这里根据bean的scope创建一个新的代理bean。如果对象实例实现了BeanFactoryAware接口,BeanFactory容器会将自身通过调用setBeanFactory方法传递给该对象实例,使得该对象实例拥有了BeanFactory的实例引用,原创 2024-04-24 21:31:06 · 1138 阅读 · 0 评论 -
spring bean的作用域
https://zhhll.icu/2021/框架/spring/基础/13.spring bean的作用域/](https://zhhll.icu/2021/框架/spring/基础/13.spring bean的作用域/)singleton单例:这种 bean 范围是默认的,确保不管接受到多少个请求,每个容器中只有一个 该bean 的实例,单例的模式由 bean factory 自身来维护,在加载spring配置文件时就会创建对象。spring bean的作用域。原创 2024-04-23 10:16:45 · 256 阅读 · 0 评论 -
spring事务失效场景
Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。首先spring的事务是使用AOP来实现的,而AOP的底层是代理(JDK代理或者CGLIB代理),所以事务失效就想什么时候不能进行代理。类,去掉与此次无关的代码。原创 2024-04-22 10:14:38 · 400 阅读 · 0 评论 -
spring注解整理
Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型,如果使用name属性,则使用byName的自动注入策略;适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。使用@Bean来标注方法以此来进行bean的实例化,bean的类型是返回类型,bean的id默认是方法名称,可以使用@Bean注解来自定义bean的id以及初始化方法、销毁方法。原创 2024-04-21 15:20:05 · 1046 阅读 · 0 评论 -
web应用使用spring
对于java而言,使用最多的还是web开发,如何在web应用中使用spring呢,web应用中没有main方法,而且必须在servlet容器加载时就创建spring的IOC容器,之前在学习Servlet的时候有讲到一个Servlet监听器,可以监听ServletContext、HttpSession、ServletRequest等对象的创建和销毁。所以可以实现ServletContextListener接口,重写contextInitialized方法来实现spring的IOC容器的创建。原创 2024-04-20 10:51:46 · 436 阅读 · 0 评论 -
spring事件监听
可以实现ApplicationListener来自定义事件,如果一个 bean 实现了 ApplicationListener 接口,当一个 ApplicationEvent 被发布以后,bean 会自动被通知。当容器调用 ConfigurableApplicationContext的close()方法关闭ApplicationContext时触发该事件。当容器调用ConfigurableApplicationContext的 Start()方法开始/重新开始容器时触发该事件。spring中定义的事件。原创 2024-04-18 10:08:30 · 513 阅读 · 0 评论 -
spring事务处理
REPEATABLE_READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读仍存在(Mysql默认的事务隔离级别)SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但是性能低下。PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行,被嵌套的事务可从当前事务中单独地提交或回滚;原创 2024-04-17 09:51:57 · 707 阅读 · 0 评论 -
Spring AOP详解
Spring AOP中使用的是动态代理。AOP的核心是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切的功能,在SpringAOP中,切面通过@Aspect注解,也可以使用XML配置。动态代理不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。after 后置通知AfterAdvice,在方法执行之后调用,无论方法执行是否成功,所以后置通知无法获取到返回结果@After。原创 2024-04-16 10:11:35 · 262 阅读 · 0 评论 -
spring依赖注入
在《spring揭秘》中提到接口注入,实现某个接口,该接口中会声明一个方法,该方法的参数就是所依赖的对象类型,当然这种方式过于繁琐,早就被淘汰了,毕竟是spring2.5。Spring IOC本质是创建类实例的工厂,并且对类实例进行管理,负责创建对象,管理对象,装配对象,配置对象,并且管理这些对象的整个生命周期。但是我们真正只是需要调用该依赖对象做某些事情,只要在用的时候,该对象是可以调用的就可以,该对象是主动获取还是别人送过来并没有太大的区别。在没有依赖注入之前,我们想要什么都需要自己主动地去获取。原创 2024-04-15 09:56:23 · 357 阅读 · 0 评论 -
bean的生命周期
Bean后置处理器是一种特殊的Bean,这种特殊的Bean并不对外服务,主要负责对容器中的其他Bean执行后处理,例如容器中的目标Bean生成代理等。spring bean factory负责管理在spring容器中被创建的bean的生命周期,有两组回调(初始化之后调用的回调和销毁之前调用的回调),框架内提供了四种方式来管理bean的生命周期事件。如果bean实现InitializingBean接口,调用InitializingBean的afterPropertiesSet()方法,原创 2024-04-14 12:07:53 · 1225 阅读 · 0 评论 -
spring bean的继承和依赖
既然spring提供了继承,那么也就存在了专门用于被继承的bean,而不进行实例化,这种bean被称为抽象bean,使用abstract="true"表明这是一个抽象bean。有时候需要保证bean实例化的先后顺序,在创建一个bean的时候必须保证另外一个bean也被创建,如果另一个bean不存在,则无法正常实例化该bean。spring除了提供了一般的配置bean的方式之外,还实现了java中继承的特性,设置bean的父子关系,这样对于一些重复的配置就可以进行省略。bean的继承和依赖。原创 2024-04-13 14:26:24 · 455 阅读 · 0 评论 -
spring配置bean
使用静态工厂方法创建bean实例时,class属性也必须指定,此时的class属性并不是指定Bean实例的实现类,而是静态工厂类,Spring通过该属性知道由哪个工厂类来创建Bean实例,还可以使用factory-method属性来指定静态工厂方法,Spring将调用静态工厂方法返回一个Bean实例,静态工厂方法需要参数的话,使用。@Resource注解可以根据类型注入,也可以根据名称注入,若使用的byName,需要提供bean的名称,如果不提供该bean的名称,则自动使用属性的名称进行匹配。原创 2024-04-12 10:20:14 · 782 阅读 · 0 评论 -
spring容器
BeanFactory可以认为是bean集合的工厂类,包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化,是spring最底层的接口,提供了最简单的容器的功能,包含了bean生命周期的控制,调用初始化方法和销毁方法,ApplicationContext应用上下文 基于BeanFactory之上构建,提供面向应用的服务,并继承了资源,消息,事件,环境,工厂五种能力常见的实现方式。spring中提供了各式各样的IOC容器的实现供用户选择和使用,使用什么样的容器取决于用户的需要。原创 2024-04-11 10:28:32 · 993 阅读 · 0 评论 -
spring框架构成
Spring Context是Spring上下文,基于Core和Beans模块之上,提供了一种类似于JNDI注册器的框架式的对象访问方法,继承了Beans的特性,为spring核心提供了大量扩展,添加了对国际化、事件传播、资源加载和对Context的透明创建的支持,实际上是一个配置文件,由Spring框架提供上下文信息,ApplicationContext接口是Context模块的关键。Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,包括JDO、Hibernate和iBatis。原创 2024-04-10 10:22:59 · 759 阅读 · 0 评论 -
restTemplate解析401异常失败
这时候需要在创建restTemplate的时候更改requestFactory,使用HttpComponentsClientHttpRequestFactory。如果使用restTemplate默认构造器的话,在进行错误解析的时候,使用。原创 2022-10-08 10:41:06 · 1115 阅读 · 0 评论 -
spring配置双数据源
原文链接 https://zhhll.icu/2021/框架/spring/基础/18.spring配置双数据源/前段时间有个需求,需要将将数据存到两个数据库中,一个库中存放主信息,一个库中存放特殊信息,看来是要使用双数据源了,来搞起来吧既然是双数据源,先不管怎么切换,配置得先搞起来动态数据源配置好了数据源之后,需要进行定义动态数据源,继承AbstractRoutingDataSource,AbstractRoutingDataSource是基于特定的查找key路由到特定的数据源。它内部维护了一组目标数原创 2022-09-20 14:52:47 · 1434 阅读 · 2 评论 -
spring自定义属性编辑器
属性编辑器是用来解析bean的配置文件中的属性标签的,spring的BeanWrapperImpl默认会注册CustomCollectionEditor(集合)、CustomMapEditor(Map)、CurrencyEditor(货币)、ByteArrayPropertyEditor等,可以使用来注册属性编辑器,实现了BeanFactoryPostProcessor接口,由spring容器自动检测并执行。原创 2022-09-15 17:40:03 · 2215 阅读 · 1 评论 -
spring引入外部属性文件
这样配置当然也可以,只是要去修改spring配置文件的时候由于spring的配置文件内容太多,不太方便,所以有时候会引入外部的属性文件。有时候我们并不想把所有的配置信息都放到spring的配置文件中,这样的话也不太好维护,比如说数据库的信息。会生成一个PropertySourcesPlaceholderConfigurer类来解析占位符。db.properties属性文件。原创 2022-08-25 10:25:51 · 385 阅读 · 0 评论 -
spring的扩展接口
这时所有的bean的描述信息已经加载完毕,但是还没有进行bean初始化。它扩展自BeanFactoryPostProcessor,在执行BeanFactoryPostProcessor的功能前,提供了可以添加bean definition的能力,允许在初始化一般bean前,注册额外的bean。与BeanFactoryPostProcessor的区别是处理的对象不同,BeanFactoryPostProcessor是对beanfactory进行处理,BeanPostProcessor是对bean进行处理,原创 2022-08-23 15:15:10 · 1024 阅读 · 1 评论 -
spring bean的作用域
spring容器中bean有五种作用域- singleton单例:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个 bean 的实例,单例的模式由 bean factory 自身来维护,在加载spring配置文件时就会创建对象- prototype原型:原型范围与单例范围相反,为每一个 bean 请求提供一个实例,在调用getBean方法的时候才会创建- request请求:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean 会原创 2022-08-19 16:44:16 · 244 阅读 · 0 评论 -
spring事务失效场景
Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。首先spring的事务是使用AOP来实现的,而AOP的底层是代理(JDK代理或者CGLIB代理),所以事务失效就想什么时候不能进行代理。配置的方法非public修饰。...原创 2022-08-18 10:41:13 · 208 阅读 · 1 评论 -
spring事件监听
Spring 提供了以下 5 中标准的事件:上下文更新事件ContextRefreshedEvent该事件会在ApplicationContext 被初始化或者刷新时发布。也可以在调用 ConfigurableApplicationContext 接口中的 refresh()方法时被触发上下文开始事件ContextStartedEvent当容器调用ConfigurableApplicationContext的 Start()方法开始/重新开始容器时触发该事件。......原创 2022-08-17 12:03:10 · 266 阅读 · 1 评论 -
spring注解整理
Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型,如果使用name属性,则使用byName的自动注入策略;适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。使用@Bean来标注方法以此来进行bean的实例化,bean的类型是返回类型,bean的id默认是方法名称,可以使用@Bean注解来自定义bean的id以及初始化方法、销毁方法。..原创 2021-03-01 09:16:51 · 333 阅读 · 2 评论 -
web应用使用spring
对于java而言,使用最多的还是web开发,如何在web应用中使用spring呢,web应用中没有main方法,而且必须在servlet容器加载时就创建spring的IOC容器,之前在学习Servlet的时候有讲到一个Servlet监听器,可以监听ServletContext、HttpSession、ServletRequest等对象的创建和销毁。所以可以实现ServletContextListener接口,重写contextInitialized方法来实现spring的IOC容器的创建。...原创 2021-02-28 12:24:27 · 360 阅读 · 3 评论 -
spring事务
一个事务要么同时成功,要么同时失败。- Atomic原子性 事务是由一个或多个活动组成的一个工作单元。原子性确保事务中的所有操作全部发生或全部不发生- Consistent一致性 一旦事务完成,系统必须确保它所建模的业务处于一致的状态- Isolated隔离性 事务允许多个用户对数据进行操作,每个用户的操作不会与其他用户纠缠在一起,多个事务之间数据要相互隔离- Durable持久性 一旦事务完成,事务的结果应该持久化...原创 2021-02-27 10:12:41 · 713 阅读 · 1 评论 -
Spring AOP
AOP的核心是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切的功能,在SpringAOP中,切面通过@Aspect注解,也可以使用XML配置。动态代理不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类(通过。的方式做的动态代理,如果某个类被标记为final,无法使用CGLIB做动态代理)...原创 2021-02-26 08:47:24 · 229 阅读 · 2 评论