是否可以让一个Spring Bean只在一个配置类中可用?
给定一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。