20 | Spring框架:框架帮我们做了很多工作也带来了复杂度
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Spring框架的复杂性主要体现在IoC和AOP的灵活性、Spring Boot的自动配置以及Spring Cloud模块的多版本带来的挑战。本文通过两个案例展示了Spring框架的复杂性:一是配置AOP切入Spring Cloud Feign组件失败,二是Spring Boot程序的文件配置被覆盖。Spring框架借助IoC和AOP实现了修改、拦截Bean的定义和实例的灵活性,导致执行的代码流程不是串行的。Spring Boot的自动配置省去了手动配置的麻烦,但也增加了一些黑盒,提升了复杂度。另外,Spring Cloud模块多版本和Spring Boot 1.x和2.x的区别也增加了二次开发的兼容性成本。通过实际案例和代码分析,本文深入浅出地解释了Spring框架中配置优先级的问题,以及Spring环境中的配置源和查询过程。通过对Spring框架中的Property和Profile的抽象,以及对Environment接口的实现和配置源的分析,帮助读者更好地理解Spring框架中的配置优先级和查询过程。整体而言,本文通过深入的技术分析,帮助读者更好地理解Spring框架的复杂性和解决问题的方法。
《Java 业务开发常见错误 100 例》,新⼈⾸单¥59
全部留言(12)
- 最新
- 精选
- Darren置顶第一个问题: 切入点指示符 Spring AOP 支持10种切点指示符:execution、within、this、target、args、@target、@args、@within、@annotation、bean下面做下简记(没有写@Pointcut(),请注意): execution: 用来匹配执行方法的连接点的指示符。 用法相对复杂,格式如下:execution(权限访问符 返回值类型 方法所属的类名包路径.方法名(形参类型) 异常类型) e.g. execution(public String com.darren.hellxz.test.Test.access(String,String)) 权限修饰符和异常类型可省略,返回类型支持通配符,类名、方法名支持*通配,方法形参支持..通配 within: 用来限定连接点属于某个确定类型的类。 within(com.darren.hellxz.test.Test) within(com.darren.hellxz.test.) //包下类 within(com.darren.hellxz.test..) //包下及子包下 this和target: this用于没有实现接口的Cglib代理类型,target用于实现了接口的JDK代理目标类型 举例:this(com.darren.hellxz.test.Foo) //Foo没有实现接口,使用Cglib代理,用this 实现了个接口public class Foo implements Bar{...} target(com.darren.hellxz.test.Test) //Foo实现了接口的情况 args: 对连接点的参数类型进行限制,要求参数类型是指定类型的实例。 args(Long) @target: 用于匹配类头有指定注解的连接点 @target(org.springframework.stereotype.Repository) @args: 用来匹配连接点的参数的,@args指出连接点在运行时传过来的参数的类必须要有指定的注解 @Pointcut("@args(org.springframework.web.bind.annotation.RequestBody)") public void methodsAcceptingEntities() {} @within: 指定匹配必须包括某个注解的的类里的所有连接点 @within(org.springframework.stereotype.Repository) @annotation: 匹配那些有指定注解的连接点 @annotation(org.springframework.stereotype.Repository) bean: 用于匹配指定Bean实例内的连接点,传入bean的id或name,支持使用*通配符 切点表达式组合 使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系 第二个问题其实不太懂,网上搜了搜,核心应该是这个方法: org.springframework.util.PropertyPlaceholderHelper#replacePlaceholders(java.lang.String, java.util.Properties) 参考链接:https://www.jianshu.com/p/5fecf71024af
作者回复: 第二个问题,我给了我的实现:https://github.com/JosephZhu1983/java-common-mistakes/tree/master/src/main/java/org/geekbang/time/commonmistakes/springpart2/custompropertysource
2020-04-28233 - hellojd我也经常看框架源码,但缺失了老师的演示及溯源过程,学习到了。
作者回复: :)
2020-04-288 - 梦倚栏杆1. 配置优先级的问题,理解热加载的时候仔细的看过,知道有这么回事,老师举得这个例子:开发和运维都设置了配置,然后运维的把开发的覆盖了,这种问题如果遇到了怎么查呢?如果是同一个人统一管理还好说,不同的人谁知道谁设置了什么呢? 2. 切面不成功的内容,我卡在了切面上。切面怎么用还不太了解。
作者回复: 可以参考我文中的例子,程序启动的时候检查一下所有配置项,发现有重复配置的话发出告警
2020-04-286 - 招财老师,我现在项目中遇到了一个问题,就是用springboot的全局异常处理时,响应出去的信息,编码格式都是ISO-8859-1,试过了在配置文件中设置spring.http.encoding.charset=utf-8和过滤器中给response去setCharacterEncoding为utf-8,但是还是不行。正常响应的数据是不乱码的,只有全局异常处理出去的响应有乱码,这个应该怎么解决呀
作者回复: spring.http.encoding.charset=UTF-8 spring.http.encoding.force=true spring.http.encoding.enabled=true 试过吗?
2020-05-2131 - 旅途老师 问两个问题 1.第一个例子 去掉ribbon依赖后 ApacheHttpClient注册了bean 所以@FeignClient这里面直接就使用的ApacheHttpClient的bea 不走那个new 的代码了是吗 ? 2.第二个例子. ConfigurationPropertySourcesPropertySourcess这个类实际上一个代理 查询的走的还是其他的配置源 这么做的意义是什么?
作者回复: 1. 去掉ribbon依赖后,ApacheHttpClient的注册方式就正确了,成为了一个Bean,而不是LoadBalancerFeignClient的delegate 2、Spring这么干是为了实现relaxed binding,参考 https://spring.io/blog/2018/03/28/property-binding-in-spring-boot-2-0
2020-05-031 - jacy有个疑问,思考与讨论二中的真实数据库密码放哪呢?
作者回复: 密码可以由DBA统一管控,由DBA提供一个接口给到框架在运行时查询数据库对应的密码
2021-05-10 - 龙猫这节课有点难度啊2020-06-0711
- 汝林外史感觉就在等最后的解决方案,然后戛然而止了。。。2020-04-2911
- 程序员小跃源码之下无秘密,但是看源码挑战了一个程序员的心境,需要耐心,细心,恒心,给自己加油2020-07-233
- Geek_8b92bfwithin(feign.Client+) 为什么是切入execute方法,不是切人api方法,这个不太明白2022-06-241