关于实现了接口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 ,问题就解决了

猜你喜欢

转载自yensai.iteye.com/blog/2326663