问题背景:开发中,连接数据库的用户名和密码在正式环境中是密文的,在开发环境中是明文的,为了方便,所以在配置c3p0 数据连接池时就直接配置properties属性,为其配置的一个密文解密的bean。 如下图1:
同时,为了实现一些类在初始化类的时候为期属性复制 那么实现了接口BeanPostProcessor 如下图2
那么在启动服务时,就会报错,说c3p0 数据连接池创建失败。如下图3:
解决过程:
因为c3p0 的 属性 properties 配置一个bean 时,那么这个bean需要实现接口FactoryBean 的getObject() 方法,在服务启动时才能保证获取到属性,
如下图4:
一开始跟踪spring 源码时,发现如果不实现 BeanPostProcessor 接口时,下图红框的innerBean 不为null ,如果实现了接口,那么innerBean 为null,如下图5:
这个问题在网上找了很久都没有解决的办法,后来问了一个龙骚年,他说可能是bean创建顺序,给了我提示。
再重新看BeanPostProcessor 接口的创建属性和其实现类,发现在问题所在就是在于其前置方法中返回了一个null,如下图6:
所以出来的 innerBean 一直为null ,后来改为返回 bean ,问题就解决了