Spring Boot具有更多上下文

时间:2017-05-02 17:18:27

标签: java spring spring-mvc spring-boot dependency-injection

我有一个带有@SpringBootApplication主要类的春季启动(因此它隐含了标记@EnableAutoConfiguration@ComponentScan@Configuration)。

如果我创建另一个带有注释@Configuration@ComponentScan的类会怎样?我是否创建另一个豆容器?这样豆是重复的吗?创建更多@Configuration课程是一种好方法吗? @Configuration创建一个bean容器?如果是,两个容器共享bean?

我需要了解这些问题。

3 个答案:

答案 0 :(得分:1)

  

如果我使用注释@Configuration和@Component Scan创建另一个类会怎么样?

没关系,完全正常......

  

我创建了另一个bean容器?通过这种方式,bean是Duplicates?

如果您创建两个相同类型的bean,则在应用启动时会出现错误..您需要将其中一个声明为@Primary

答案 1 :(得分:0)

是的,您可以使用@ComponentScan通过在调度程序servlet中注册配置bean或通过导入已在spring容器中注册的单独配置bean来注册bean。 假设您有正在扫描组件的Config类 -

ViewWithTag

要在容器中注册Config,您必须这样做 -

@ComponentScan(basePackages = {"xyz"})
@Configuration
public class Config {
....
}

或者

new AnnotationConfigWebApplicationContext().register(Config .class);

答案 2 :(得分:0)

你可以在spring boot中定义多个@configuration Matias Elorriaga提到。 @Configuration等于spring xml中的<beans>标签,其中包含许多<bean>(等于@Bean),同样的一个带注释@Configuration的类说你可以在我里面定义多个bean E.F:

@Configuration
public class AppConfig {
@Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("message");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public Validator validator() {
        final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        localValidatorFactoryBean.setValidationMessageSource(messageSource());
        return localValidatorFactoryBean;
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH);
        return sessionLocaleResolver;
    }

}

此外,如果您有2个不同的类具有相同类型的Bean 例如class:SpringConfigA有Composite bean

@Configuration
 public class SpringConfigA {

@Bean
     public Composite composite() {
         Composite c = new Composite();
         return c;             
     }
}

和另一个类SpringConfigB具有相同的Composite bean

@Configuration
 public class SpringConfigB {

@Bean
     public Composite composite() {
         Composite c = new Composite();
         return c;             
     }
}

然后它会抛出bean初始化期间的异常,因为复合bean的含糊不清 在这里你可以使用限定符来解决这个问题

所以

@Configuration
 public class SpringConfigA {

@Bean
 @Qualifier("compositeA")
     public Composite composite() {
         Composite c = new Composite();
         return c;             
     }
}

和另一个类SpringConfigB具有相同的复合bean,其限定符名称为“compositeB”

@Configuration
 public class SpringConfigB {

@Bean
 @Qualifier("compositeB")
     public Composite composite() {
         Composite c = new Composite();
         return c;             
     }
}