现象
一个同事由于比较紧急的开发时间,将Redis的配置写死了。
Jedis jedis = new Jedis("10.58.2.23", 6379);
String counterKey = "counter:" + time + ":" + code;
这是相当于bug的存在,因为会将测试环境和生产环境混用,导致混乱。代码写的很丑陋,但是能用,我在想,怎么将功能写的优雅点呢?
可以使用@Value读取配置文件中的值,也可以使用现有的RedisConfig,这很方便。但是后面要被工具类使用,就涉及在静态类中获取Bean。我之前在开发中写过SpringUtil类,简单来说就是实现ApplicationContextAware接口,这是Spring框架提供给我们的一个hook。
但是看到Hutool框架有这个工具类,就想引用。但是在使用时老是报null。开始还以为是bean不存在,但是拿明显有的bean测试,也获取不到,调试时发现applicationContext为空,代码如下
@EnableSpringUtil
public class SpringConfig {
// 启用SpringUtil对象
}
这样还是没有获取到,加入Configuration注解
@EnableSpringUtil
@Configuration
public class SpringConfig {
// 启用SpringUtil对象
}
但是还是没有获取到,什么原因呢?找了半天,发现放的包不对,没有被Spring框架扫描到,看配置文件就明白了。
<context:component-scan base-package="**.*.service"/>
<context:component-scan base-package="**.*.components"/>
<context:component-scan base-package="frame.system.models"/>
<context:component-scan base-package="frame.mqtt.redis"/>
所以包放的位置不对,就会报错。后来想想,同事写的虽然丑陋,但是能用,而我写的优雅,但是半吊子水平,运行报错而不自知,也强不了多少,还得补充知识,提升技术水平。
思考
由于我对于Spring框架理解有偏差,使用了Hutool的SpringUtil工具去获取静态类,却一直没有获取到,导致报错,加班改代码。
我们在使用时一定要注意。出现问题的原因是什么呢?一个是太自信了,变更代码后没有测试。一个是对框架理解有偏差,未能正确使用框架。
一个Springboot项目,是简单并且强大的。如果本项目是SpringBoot框架,可直接使用SpringUtil类,因为spring.factories会创建改对象并交给Spring管理。
在深入探讨一下,为什么需要@Configuration注解呢?测试了一下,没有就会报错,且换成@Component也可以,为什么呢?我觉得首先要把我们的配置交个Spring中的BeanFactory处理,只有交个它处理,它才能通过@Import注解,进一步创建SpringUtil对象,这个就是很多@EnableXXX的原理,其核心就在BeanFactory中,这也是Sping的核心之一,需要加深理解,甚至读部分源码,可参考@EnableXXX的原理。
好了,希望大家多学习,多思考,共同进步