普通Spring项目无主类场景下jar包插件类的依赖注入实现方案咨询
可行解决方案
方案1:直接从Spring上下文获取A类Bean(最推荐)
既然是普通Spring应用,运行时必然存在已初始化的ApplicationContext实例,按以下步骤操作即可:
- 新增一个Spring配置类,通过注解把jar包中的A类注册为Spring Bean:
@Configuration @ComponentScan(basePackages = "A类所在的jar包包名") // 会自动扫描A、B、C类并注册为Bean public class JarBeanConfig { }
如果不想扫描全量包,也可以手动定义A的Bean:
@Configuration public class JarBeanConfig { @Bean public A a() { return new A(); } // 若B、C也在jar包未被扫描到,同理添加B、C的@Bean定义即可 }
- 在被插件调用的D类中,实现
ApplicationContextAware接口拿到Spring上下文,直接调用getBean方法获取已经完成注入的A实例:
public class D implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } // 你需要使用A的业务方法 public void yourBusinessMethod() { A a = applicationContext.getBean(A.class); // 直接使用a即可,b、c属性已经被Spring自动注入完成 } }
如果项目是XML配置的Spring项目,直接在XML中添加A、B、C的<bean>配置即可,无需写配置类。
方案2:手动装配new出来的A实例
如果你必须自己实例化A类,可通过AutowireCapableBeanFactory完成依赖注入:
- 在D类中实现
BeanFactoryAware接口拿到BeanFactory实例 - 实例化A之后调用
autowireBean方法完成注入:
public class D implements BeanFactoryAware { private AutowireCapableBeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = (AutowireCapableBeanFactory) beanFactory; } public void yourBusinessMethod() { A a = new A(); beanFactory.autowireBean(a); // Spring会自动调用setter注入b、c属性 // 直接使用a即可 } }
注意事项
- 需确保A依赖的B、C类对应的Bean已经存在于Spring上下文中,否则会抛出注入失败异常
- 新增的配置类需要被Spring的组件扫描覆盖到,若用XML配置则需要在XML中声明配置类或Bean定义
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

