предисловие
Как мы все знаем, в нашем обычном развитии,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;
}
}
Это конец этого вопроса.Если что-то не так, пожалуйста, оставьте сообщение в комментариях хороших братьев.Кроме тогоПросите внимания, просите лайков