Все еще просто регистрируете bean-компоненты с помощью @Service ? | Семидневный заезд

Java
Все еще просто регистрируете bean-компоненты с помощью @Service ? | Семидневный заезд

предисловие

Как мы все знаем, в нашем обычном развитии,SpringЭтот фреймворк охватывает весь проект, но мы не можем его использовать.Spring, но стоимость этого слишком велика. В каждом интервью я всегда спрашиваюSpring IOC,AOP,事务Подождите, сегодняшняя статья - настоящий вопрос для интервью, с которым я только что столкнулся на работе, жаль, что я знал только тогда@Service. Потом я вернулся и стал ждать уведомления, до сих пор меня не уведомляли.

Кроме того, сегодня в этой статье будет рассказано о нескольких методах инъекций, а что касается принципа, то сначала не думайте об этом (не бейте меня по морде), просто возьмите любой и снова расскажите об исходниках. В основном это зависит от вещей, которые имеют много преимуществ. , поэтому найдите возможностьSpring IOCПолучите исходный код этой части и поговорите об этом.Слова в этой статье в основном об общности.
打脸

основная тема

1 @Сервис, @Компонент, @Репозиторий, @Контроллер

Этот способ так же прост, как@Service,@RepositoryНа самом деле, @Component все еще используется. Нажмите, чтобы увидеть его в аннотации. Обратите внимание, что этот метод необходимо использовать.@ComponentScan配置一个一个扫包范围。 почему нет@ComponentЧто насчет этого, в основномSpringотличитьBeanтип.@Repositoryвоздействуя на персистентный слой,@ServiceДействуя на уровне бизнес-логики,@Controllerдействующий на уровне представления (spring-mvcКомментарии)

@Component
public class ApproveCenterServiceImpl implements ApproveCenterService {
}
@Service
public class ApproveCenterServiceImpl implements ApproveCenterService {
}
@Repository
public class ApproveCenterServiceImpl implements ApproveCenterService {
}

2 @Бин и @Конфигурация

Этот метод очень знаком? Он часто используется для маркировки классов конфигурации. Самый простой пример: мы используемSpringBootКогда вам нужно вручную зарегистрировать BeanназываетсяRestTemplate

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3 Использование @импорта

@ImportАннотации могут регистрировать три типаBean, первый общий класс, второйDefinitionRegistrarкласс, третийImportSelector

3.1 Общий класс

/**
 * @author xiejianwei
 */
@Import(MessageRecord.class)
public @interface ImportBean {
}

3.2 DefinitionRegistrar

ДостигнутоImportBeanDefinitionRegistrar, который предоставляет регистратору в классе реализации знакомую аннотацию@MapperScanХорошие братья, нажмите и посмотрите, и вы поймете.

@Import(MapperScannerRegistrar.class)
public @interface MapperScan {
}

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
  /**
   * 主要是这个方法,在参数中提供了BeanDefinitionRegistry这个注册器,可以手动向容器中注入bean
   */
  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    AnnotationAttributes mapperScanAttrs = AnnotationAttributes
        .fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
    if (mapperScanAttrs != null) {
      registerBeanDefinitions(mapperScanAttrs, registry);
    }
  }
}

3.3 ImportSelector

много думатьSpringboot starterОн будет использоваться, когда вы хотите включить функциюImportSelector, такие как аннотации, позволяющие регистрировать и обнаруживать сервисы.@EnableDiscoveryClient, главный принципImportSelectorсерединаselectImportsМетод вернет массив строк, где строки на самом деле являются полными путями классов, которые нам нужно зарегистрировать, аналогичноcom.xjw.entity.pojo.MessageRecord,Springбудет генерироваться на основе полного отражения путиBean.源码这一块就先不讲了(手动狗头)。

public class CommonModelSelector implements ImportSelector {
    public CommonModelSelector() {
    }

    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{MessageRecord.class.getName()};
    }
}

4 FactoryBean

FactoryBeanЭто особенноеBean, много ли хороших братьев спрашивали в интервьюFactoryBeanиBeanFactryРазница между ними, у меня слезятся глаза, когда я это говорю (честно говоря, это часто спрашивают, когда я встречаюсь с так называемыми старшими инженерами).FactoryBeanэто особыйBean, когда мы реализуем этот интерфейс, дваBeanObject, во-первых, реализовать сам класс, который нужно использовать вBeanПеред именем (обычно первая буква имени класса строчная) добавить&получитьBean,секундаBeanна самом делеgetObjectметод возвращенbean, следует отметить, что этот метод требует сотрудничества@Componentили@Configurationреализовать.BeanFactryПроще говоря, этоSpringКонтекстный контейнер.
湿了

Пример кода выглядит следующим образом:

@Component
public class FactoryBeanLearn implements FactoryBean {

    @Override
    public Object getObject() throws Exception {
        //这个Bean是我们自己new的,这里我们就可以控制Bean的创建过程了
        return new MessageRecord();
    }

	/**
	 * bean的类型
	 *
	 **/
    @Override
    public Class<?> getObjectType() {
        return MessageRecord.class;
    }

	/**
	 * 是否是单例的
	 *
	 **/
    @Override
    public boolean isSingleton() {
        return true;
    }
}

Это конец этого вопроса.Если что-то не так, пожалуйста, оставьте сообщение в комментариях хороших братьев.Кроме тогоПросите внимания, просите лайков