Простой анализ аннотации SpringFramework5.0 @Indexed

Spring
Простой анализ аннотации SpringFramework5.0 @Indexed

На бумаге в конце я чувствую себя мелким, и я никогда не знаю, что это дело должно быть сделано - Лу Ю

Недавно я рассматривал основную идею программирования SpringBoot (ядро) и увидел главу, посвященную программированию на основе аннотаций, в которой объяснялось: Аннотация была введена в SpringFramework5.0.@Indexed, который можно использовать для Springаннотация схемыДобавьте индексы, чтобы повысить производительность запуска приложений.

Читая дальше, обратите внимание на некоторые аннотации схемы:

Весенние аннотации описание сцены
@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.componentsa.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.

С помощью такой простой демонстрации проверяются упомянутые выше точки использования.

использованная литература


Добро пожаловать, чтобы обратить внимание на мою официальную учетную запись, дорогу технологий, расти вместе.

在这里插入图片描述