В приложениях Spring Boot bean-компоненты являются основными компонентами, составляющими приложение. Контейнер Spring отвечает за управление этими компонентами, включая их создание, настройку, сборку, управление и уничтожение. В Spring Boot существует несколько способов регистрации bean-компонентов, чтобы контейнер Spring мог ими управлять. В этой статье будут подробно представлены различные методы регистрации, а также приведены соответствующие примеры кодов и применимые сценарии.
@Component
и его производныеаннотация@Component
является обобщенныманнотация,Компонент Bean используется для пометки класса как контейнера Spring. Spring Boot автоматически просканирует эти аннотации при запуске.,и зарегистрируйте отмеченный класс какBean。@Service
、@Repository
и@Controller
да@Component
Производнаяаннотация,Используется для обозначения компонентов уровня обслуживания, уровня персистентности и уровня контроллера соответственно.
код:
@Service
public class MyService {
// Логика сервиса...
}
Применимые сценарии:
@Component
и его производныеаннотация。@Bean
аннотацияВ категории Конфигурация,可以использовать@Bean
аннотацияобъявитьBean。Этот метод вернет объект,Объект будет зарегистрирован как Bean.,И имя метода по умолчанию соответствует идентификатору компонента.
код:
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
Применимые сценарии:
@Bean
аннотация。@Import
аннотация@Import
аннотация Может использоваться для импорта других Конфигурациядобрый,Это позволяет концентрировать зерна, разбросанные по разным классам.
код:
// Определить класс конфигурации
@Configuration
public class OtherConfig {
@Bean
public OtherBean otherBean() {
return new OtherBean();
}
}
// Импортируйте OtherConfig в основной класс Конфигурации.
@Configuration
@Import(OtherConfig.class)
public class AppConfig {
// Другие определения Bean...
}
Применимые сценарии:
@Import
аннотация。ImportSelector
интерфейсImportSelector
интерфейс Позволяет выборочно импортировать в зависимости от условий Конфигурациядобрый。реализовать этоинтерфейсназад,Вы можете вернуть массив полных имен классов конфигурации, которые необходимо импортировать.
// Реализовать интерфейс ImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// Выбор импортированных классов конфигурации в зависимости от условий
return new String[]{OtherConfig.class.getName()};
}
}
// Используйте его в категории основной конфигурации. аннотацию @Import импорт ImportSelector
@Configuration
@Import(MyImportSelector.class)
public class AppConfig {
// Другие определения Bean...
}
Применимые сценарии:
ImportSelector
интерфейс。ImportBeanDefinitionRegistrar
интерфейсImportBeanDefinitionRegistrar
интерфейспозволяет вам импортировать Конфигурациядобрыйчас注册额外的Beanопределение。Здесь нужно зарегистрироваться программноBeanочень полезно, когда。
// Реализация интерфейса ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// Регистрация определения компонента
RootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);
registry.registerBeanDefinition("myBean", beanDefinition);
}
}
// Используйте его в категории основной конфигурации. аннотацию @Import importImportBeanDefinitionRegistrar
@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class AppConfig {
// Другие определения Bean...
}
Применимые сценарии:
ImportBeanDefinitionRegistrar
интерфейс。FactoryBean
интерфейсFactoryBean
интерфейс允许тыопределение一个工厂Bean,Этот фабричный компонент вернет экземпляр объекта. Когда вам нужно контролировать процесс создания компонента,Этот метод можно использовать.
// Определите FactoryBean для создания экземпляров MyBean.
public class MyFactoryBean implements FactoryBean<MyBean> {
@Override
public MyBean getObject() throws Exception {
// Создайте и верните экземпляр MyBean
return new MyBean();
}
@Override
public Class<?> getObjectType() {
// Возвращает тип компонента, созданный FactoryBean.
return MyBean.class;
}
@Override
public boolean isSingleton() {
// Возвращает, является ли бин, созданный FactoryBean, одноэлементным.
return true;
}
}
// Используйте его в категории «Конфигурация». аннотацию @BeanRegisterFactoryBean
@Configuration
public class AppConfig {
@Bean
public FactoryBean<MyBean> myFactoryBean() {
return new MyFactoryBean();
}
}
Применимые сценарии:
FactoryBean
интерфейс。@ComponentScan
аннотация@ComponentScan
аннотацияиспользуется для указанияSpring BootПуть к пакету сканируется при запуске。Springконтейнер会扫描Эти包路径下的добрый,и будет отмечен@Component
、@Service
、@Repository
、@Controller
ждатьаннотация的добрый注册为Bean。
// Определите класс обслуживания и используйте тег @Serviceаннотация.
@Service
public class MyService {
// Логика сервиса...
}
// Используйте его в категории основной конфигурации. аннотацию @ComponentScan.Укажите путь к сканируемому пакету.
@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {
// Другие определения Bean...
}
Применимые сценарии:
@ComponentScan
аннотация。Spring Bootавтоматического Конфигурацияда通过spring.factories
Реализация файла。ты Вы можете создать собственный стартер,и вspring.factories
Автоматически указывается в файле Конфигурациядобрый。так,Когда другие проекты добавляют ваши начальные зависимости,Spring Boot автоматически настроит связанные bean-компоненты.
При создании пользовательского стартера вам необходимо создать файл Spring.factories в каталоге src/main/resources/META-INF и указать класс автоматической настройки.
spring.factories:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.autoconfigure.DemoAutoConfiguration
Класс автоматической конфигурации:
@Configuration
public class DemoAutoConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
// 其他Конфигурация...
}
Применимые сценарии:
@Enable*
аннотацияSpring Bootпредлагает множество@Enable*
аннотация,нравиться@EnableWebMvc
、@EnableCaching
ждать。Этианнотация Обычно это делается путем импорта одного или нескольких Конфигурациядобрый来启用特定的功能,И зарегистрируйте связанные bean-компоненты.
// Включите Spring, используя аннотацию @EnableWebMvc в классе Конфигурация. MVC
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
// КонфигурацияSpring MVC...
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// Зарегистрируйте контроллер представления...
}
}
Применимые сценарии:
@Enable*
аннотациячтобы включить,Вы можете использовать эти аннотации для регистрации связанных bean-компонентов.Настройте @Enable:
自определение一个@EnableАналогичный функционал для создания аннотации,и используйте аннотацию @Import, чтобы импортировать класс или селектор конфигурации. так,Когда вы используете этот пользовательский @Enable в своем приложениианнотациячас,Spring автоматически импортирует и зарегистрирует соответствующую конфигурацию или компоненты.
// Настроить аннотацию
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyEnableConfiguration.class)
public @interface EnableMyFeature {
// Свойства можно добавить в функционал «Конфигурация».
}
// Конфигурациядобрый
@Configuration
public class MyEnableConfiguration {
@Bean
public MyFeatureBean myFeatureBean() {
return new MyFeatureBean();
}
}
// использовать Настроить аннотацию
@SpringBootApplication
@EnableMyFeature
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
ApplicationContext
)某些情况下需要在运行час Зарегистрироваться программноBean。Можно получить черезApplicationContext
Кавычки,И используйте API, который он предоставляет, для регистрации компонентов.
@Component
public class MyBeanRegistrar implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
registerBean();
}
private void registerBean() {
RootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);
applicationContext.getBeanFactory().registerSingleton("myBean", beanDefinition);
}
}
Применимые сценарии: