是否可以让一个Spring Bean只在一个配置类中可用?

后端开发 2026-07-08

给定一个Spring Configuration 类,例如

@Configuration
class SpringConfig {

  @Bean
  MyBean myBean() {
    return new MyBean();
  }

  @Bean
  OtherBean otherBean(MyBean myBean) {
    return new OtherBean(myBean);
  }

  @Bean
  AnotherBean anotherBean(MyBean myBean) {
    return new AnotherBean(myBean);
  }  
}

我唯一希望 myBean 被用作依赖的是上面显示的另外两个bean。换句话说,我不希望它被自动装配/注入到任何其他bean中。是否可以通过将它定义为对 SpringConfig 类本地/私有的bean来强制实现这一点?

解决方案

我认为从技术上讲这是可行的,但据我所知,没有内置的Spring机制可以将一个bean限制为只能被注入到特定的类中。

一种可能的做法是实现一个自定义的 BeanPostProcessor,在启动阶段检查bean的依赖项。如果它检测到 MyBean 正在被注入到不在允许集合中的类中,它就会抛出异常并导致应用启动失败,大致如下:

@Component
public class MyBeanUsageValidator implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        for (Field field : bean.getClass().getDeclaredFields()) {
            if (field.isAnnotationPresent(Autowired.class)
                    && field.getType() == MyBean.class) {

                // check whether allowed or not, for example:
                if (!AllowedBean.class.isAssignableFrom(bean.getClass())) {
                    throw new BeanCreationException(
                        "MyBean can only be injected into AllowedBean");
                }
            }
        }

        return bean;
    }
}

是否这是正确的解决方案取决于约束条件。举例来说,如果 MyBean 能在不将其注册为Spring bean的情况下实例化,即通过 new 以简单的Java对象形式,那么这可能是一种更简单的方法。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章