关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项

 

问题背景:开发中,连接数据库的用户名和密码在正式环境中是密文的,在开发环境中是明文的,为了方便,所以在配置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 ,问题就解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值