需求:通过配置文件,能够使得新的一个service层类替代jar包中原有的类文件。
项目原因,引用了一些成型产品的jar包,已经不能对其进行修改了。
故,考虑采用用新的类替换jar包中的类。
实现思路:在配置文件中配置新老类的全类名,读取配置文件后,通过spring初始化bean的过程中,移除spring容器中老类的bean对象,手动注册新对象进去,bean名称和老对象一致即可。
jar包中的老对象是通过@Service注册到容器中的。
新的类因为是手动配置,不需要添加任何注解。
实现的方法如下:
@Component
public class MyBeanPostProcessor implements ApplicationContextAware, BeanPostProcessor {
@Autowired
private AutowireCapableBeanFactory beanFactory;
@Autowired
private DefaultListableBeanFactory defaultListableBeanFactory;
static HashMap ReplaceClass;
static String value = null;
static {
try {
value = PropertiesLoaderUtils.loadAllProperties("你的配置文件路径").getProperty("replaceClass");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("properties value........"+value);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("对象" + beanName + "开始实例化");
System.out.println("类名" + bean.getClass().getName() + "是啥");
if(StringUtils.contains(value,bean.getClass().getName())){
System.out.println("找到了需要进行替换的类。。。。。。。。。。。");
boolean containsBean = defaultListableBeanFactory.containsBean(beanName);
if (containsBean) {
//移除bean的定义和实例
defaultListableBeanFactory.removeBeanDefinition(beanName);
}
String temp = value;
String tar_class = temp.split(bean.getClass().getName())[1].split("#")[1].split(",")[0];
System.out.println(tar_class);
try {
Class tar = Class.forName(tar_class);
Object obj = tar.newInstance();
//注册新的bean定义和实例
defaultListableBeanFactory.registerBeanDefinition(beanName, BeanDefinitionBuilder.genericBeanDefinition(tar.getClass()).getBeanDefinition());
//这里要手动注入新类里面的依赖关系
beanFactory.autowireBean(obj);
return obj;
} catch (Exception e) {
e.printStackTrace();
}
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
}
配置文件中的格式采用下面的样式 :
replaceClass=gov.df.fap.service.OldTaskBO#gov.df.newmodel.service.NewTaskBO
在启动的时候,会找到容器中的老的bean,将其remove掉,然后手动注册新的bean到容器中。