SpringBoot项目引入的Jar包中使用Class.forName碰到的问题

问题描述:

        最近在开发一个SpringBoot项目的时候,自己写了组件,以打成Jar包的形式引入到SpringBoot项目中使用,而组件中有一块是根据classname去根据Spring上下文ApplicationContext对象获取SpringBoot项目中注入好的Bean,而就是因为这样一个不起眼的一行代码

Object obj = applicationContext.getBean( Class.forName( className ) );

导致系统每次启动报错,无法在Spring上下文中找到相关对象.......

问题排查:

        我在SpringBoot项目中创建了一个测试类,在组件触发之前调用applicationContext.getBean( Class.forName( className ) );,而这段代码是可以正常获取到对象的。

       开始怀疑是不是类路径写错了,经过对比并没有,经过一段时间折腾DEBUG,实在不知道问题出在哪里了,后来改了一下组件将组件Class.forName得到的class传出来,然后在SpringBoot项目中对比:

System.out.println( XXX.class == clazz );
System.out.println( XXX.class.equals( clazz ) );

clazz是组件Class.forName得到的class,这两段代码打印出来都是false。瞬间找到问题所在!但是又不只如何解决,怎么会SpringBoot项目中Class.forName("a.b.c.Demo")与组件中Class.forName("a.b.c.Demo")得出来的Class不一致!这个问题暂时不深入了解,先把这个问题解决

解决方案:

       组件中创建一个接口类

public interface ISpringBeanService {

	public Object getBean(String className) throws ClassNotFoundException;
	
}

    SpringBoot项目中建立该接口类的实现类

@Component
public class SpringBeanServiceBean implements ISpringBeanService {

	@Resource
	private ApplicationContext applicationContext;
	
	@Override
	public Object getBean(String className) throws ClassNotFoundException {
		return applicationContext.getBean(Class.forName(className));
	}

	
}

   然后在使用组件的时候,不传入ApplicationContext,而传入该实现类,组件中根据该实现类中转一下即可得到Spring上下文注入好的对象!

 

另外:

       希望有高人解答一下为什么SpringBoot中Class.forName的类与引入组件(Jar包)用Class.forName得出的class不同?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值