我有一个带有@SpringBootApplication
主要类的春季启动(因此它隐含了标记@EnableAutoConfiguration
,@ComponentScan
和@Configuration
)。
如果我创建另一个带有注释@Configuration
和@ComponentScan
的类会怎样?我是否创建另一个豆容器?这样豆是重复的吗?创建更多@Configuration
课程是一种好方法吗? @Configuration
创建一个bean容器?如果是,两个容器共享bean?
我需要了解这些问题。
答案 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;
}
}