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

阅读更多

 

问题背景:开发中,连接数据库的用户名和密码在正式环境中是密文的,在开发环境中是明文的,为了方便,所以在配置c3p0 数据连接池时就直接配置properties属性,为其配置的一个密文解密的bean。 如下图1:

 

关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项_第1张图片

 


 

同时,为了实现一些类在初始化类的时候为期属性复制 那么实现了接口BeanPostProcessor 如下图2

 

关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项_第2张图片

 

那么在启动服务时,就会报错,说c3p0 数据连接池创建失败。如下图3:

 


 


 

解决过程:

 

因为c3p0 的 属性 properties 配置一个bean 时,那么这个bean需要实现接口FactoryBean 的getObject() 方法,在服务启动时才能保证获取到属性,

 

如下图4:

 

关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项_第3张图片

 


 

一开始跟踪spring 源码时,发现如果不实现 BeanPostProcessor 接口时,下图红框的innerBean 不为null ,如果实现了接口,那么innerBean 为null,如下图5:

 

关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项_第4张图片

 

这个问题在网上找了很久都没有解决的办法,后来问了一个龙骚年,他说可能是bean创建顺序,给了我提示。

 

再重新看BeanPostProcessor 接口的创建属性和其实现类,发现在问题所在就是在于其前置方法中返回了一个null,如下图6:

 

关于实现了接口BeanPostProcessor 和 接口FactoryBean 的注意事项_第5张图片

所以出来的 innerBean 一直为null ,后来改为返回 bean ,问题就解决了

你可能感兴趣的:(spring,java,FactoryBean)