На бумаге в конце я чувствую себя мелким, и я никогда не знаю, что это дело должно быть сделано - Лу Ю
Недавно я рассматривал основную идею программирования SpringBoot (ядро) и увидел главу, посвященную программированию на основе аннотаций, в которой объяснялось:
Аннотация была введена в SpringFramework5.0.@Indexed
, который можно использовать для Springаннотация схемыДобавьте индексы, чтобы повысить производительность запуска приложений.
- Адрес официального сайта:Spring Framework 5.1.12.RELEASE beans-scanning-index)
Читая дальше, обратите внимание на некоторые аннотации схемы:
Весенние аннотации | описание сцены |
---|---|
@Repository | Аннотации схемы хранилища данных |
@Component | Общие аннотации шаблонов компонентов |
@Service | Примечания к сервисному режиму |
@Controller | Аннотации шаблонов веб-контроллера |
@Configuration | Аннотации схемы класса конфигурации |
@[toc]
сцены, которые будут использоваться
В приложении много полезного@ComponentScan
Чем больше классов содержит сканируемый пакет, тем больше времени занимает разбор аннотаций в режиме Spring.
инструкции
При использовании в проекте необходимо импортироватьspring-context-indexer
Пакет jar имеет два метода импорта: Maven и Gradle.Подробности см. на официальном сайте.Здесь я использую метод maven.Импортированная конфигурация jar выглядит следующим образом:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.1.12.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
Затем в коде добавьте аннотацию шаблона к классу@Indexed
Просто аннотируйте. следующее:
@Indexed
@Controller
public class HelloController {
}
Описание принципа
С официального сайта:
Кратко поясню: используется в проекте@Indexed
После этого он будет автоматически генерироваться в проекте при компиляции и упаковкеMETA-INT/spring.components
документ.
Когда контекст приложения Spring выполняетсяComponentScan
При сканировании,META-INT/spring.components
будетCandidateComponentsIndexLoader
читать и загружать, конвертировать вCandidateComponentsIndex
объект, поэтому@ComponentScan
Вместо сканирования указанного пакета прочитайтеCandidateComponentsIndex
объект, чтобы достичь цели повышения производительности.
Зная вышеуказанный принцип, вы можете посмотреть на негоorg.springframework.context.index.CandidateComponentsIndexLoader
исходный код.
public class CandidateComponentsIndexLoader {
/**
* The location to look for components.
* <p>Can be present in multiple JAR files.
*/
public static final String COMPONENTS_RESOURCE_LOCATION = "META-INF/spring.components";
// 省略了的代码......
@Nullable
private static CandidateComponentsIndex doLoadIndex(ClassLoader classLoader) {
if (shouldIgnoreIndex) {
return null;
}
try {
Enumeration<URL> urls = classLoader.getResources(COMPONENTS_RESOURCE_LOCATION);
if (!urls.hasMoreElements()) {
return null;
}
List<Properties> result = new ArrayList<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
result.add(properties);
}
if (logger.isDebugEnabled()) {
logger.debug("Loaded " + result.size() + "] index(es)");
}
int totalCount = result.stream().mapToInt(Properties::size).sum();
// 转换为CandidateComponentsIndex对象
return (totalCount > 0 ? new CandidateComponentsIndex(result) : null);
}
catch (IOException ex) {
throw new IllegalStateException("Unable to load indexes from location [" +
COMPONENTS_RESOURCE_LOCATION + "]", ex);
}
}
}
Если вам интересно, вы можете просмотреть весь исходный код самостоятельно.
Примечания по использованию
Хотя это@Indexed
Аннотации могут повысить производительность, но при их использовании нужно соблюдать осторожность.
Предположим, есть приложение Spring, содержащееMETA-INT/spring.components
a.jar ресурсов, b.jar существует толькоаннотация схемы, затем используйте@ComponentScan
При сканировании пакетов в этих двух JAR-файлах аннотации схемы в b.jar не распознаются.
Обязательно обратите внимание на такие вопросы.
Описание случая
При его использовании обратите внимание на вышеуказанные моменты или используйте простую демонстрацию, чтобы объяснить его для лучшего понимания.
-
Проект DemoA (с использованием
@Indexed注解
) -
Проект DemoB (не используйте
@Indexed注解
)
- Демонстрационный проект SpringBoot
Представлено в этом проекте
DemoA.jar
иDemoB.jar
. Затем выполните следующий тест, тестовый код выглядит следующим образом:
Класс конфигурации, аннотации режима сканирования
@Configuration
@ComponentScan(basePackages = "org.springboot.demo")
public class SpringIndexedConfiguration {
}
Тестовый класс:
@Test
public void testIndexedAnnotation(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringIndexedConfiguration.class);
System.out.println("获取DemoA Jar中【org.springboot.demo.controller.DemoAController】");
DemoAController demoAController = context.getBean(DemoAController.class);
System.out.println("DemoAController = " + demoAController.getClass());
System.out.println("获取DemoB Jar中【org.springboot.demo.controller.DemoBController】");
DemoBController demoBController = context.getBean(DemoBController.class);
System.out.println("DemoBController = " + demoBController.getClass());
}
результат:
beanDefinitionName = demoAController
获取DemoA Jar中【org.springboot.demo.controller.DemoAController】
DemoAController = class org.springboot.demo.controller.DemoAController
获取DemoB Jar中【org.springboot.demo.controller.DemoBController】
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springboot.demo.controller.DemoBController' available
не могу найтиDemoBController
.
С помощью такой простой демонстрации проверяются упомянутые выше точки использования.
использованная литература
- Адрес официального сайта:Spring Framework 5.1.12.RELEASE beans-scanning-index)
- Идеи программирования Spring Boot (основные)
Добро пожаловать, чтобы обратить внимание на мою официальную учетную запись, дорогу технологий, расти вместе.