代码之家  ›  专栏  ›  技术社区  ›  sarah

条件类子类中的spring注入bean

  •  0
  • sarah  · 技术社区  · 8 年前

    我有一个这样的组件

    @Component
    @Conditional(ConditionExample.class)
    public class ScheduledExample implements InitializingBean {
    
        @Override
        public void afterPropertiesSet() throws Exception {
    
            System.out.println();
    
        }
    }
    

    我还有这样的条件类:

     public class ConditionExample implements Condition {
    
            private ParameterRepository parameterRepository; // it is a spring data repository
    
            @Autowired
            public void setParameterRepository(ParameterRepository parameterRepository) {
                this.parameterRepository= parameterRepository;
            }
    
            @Override
            public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
                //query db with parameterRepository and decide
                return false;
            }
        }
    

    我不能在conditionexample类中自动连接任何spring bean。它仍然为空。我在conditionexample上尝试了@component,但它不起作用。 我需要使用matches方法中的repository类查询db,并决定是否创建bean。我该怎么做到?

    2 回复  |  直到 8 年前
        1
  •  1
  •   pvpkiran    8 年前

    我认为这是不可能的。因为 @Conditional 注释是在组件扫描的早期进行处理的,在此期间您的存储库或任何其他类都不会加载。

    您可以在condition类中自动连接application context类,并在matches方法中放置调试点,然后查看应用程序上下文bean定义映射。加载的类不多(很少)。

    一种可能的解决方案是,您可以使用存储库类autowired编写bean。其中 @PostContruct 方法可以执行数据库查询,并根据结果将其他bean(希望有条件地加载)注册到应用程序上下文。

    像这样的东西

    @Component
    public class SomeBean {
    
        private ParameterRepository parameterRepository; // it is a spring data repository
    
        private GenericWebApplicationContext context;
    
        @Autowired
        public void setParameterRepository(ParameterRepository parameterRepository, GenericWebApplicationContext context) {
            this.parameterRepository= parameterRepository;
            this.context = context
        }
    
        @PostConstruct
        public void someMethod() {
            //query db with parameterRepository and decide
            //context.registerBeanDefinition(...)
        }
    }
    
        2
  •  1
  •   Mạnh Quyết Nguyễn    8 年前

    你不能把豆子注射到你的 Condition 班级:

    这里是 document 突出显示。

    条件必须遵循与beanfactorypostprocessor和 注意不要与bean实例交互 . 要对与@configuration bean交互的条件进行更细粒度的控制,请考虑configurationcondition接口。

    为了解决您的问题,我认为您必须更改存储条件的位置,或者使用普通的javacode创建到数据库的连接并检查条件