>  기사  >  Java  >  Java SpringBoot 자동 어셈블리의 원리는 무엇입니까?

Java SpringBoot 자동 어셈블리의 원리는 무엇입니까?

王林
王林앞으로
2023-04-25 08:16:061104검색

summary

detail

Traditional Spring 프로젝트에는 많은 구성 파일이 있습니다. 예를 들어 Redis를 사용하려면 일반적으로 해당 종속 jar 패키지 외에도 애플리케이션에서 JedisConnectionFactory, JedisPoolConfig 및 RedisTemplate을 구성해야 합니다. xml. 그러나 SpringBoot를 사용하면 시스템은 pom.xml의 jar 패키지를 기반으로 이러한 클래스를 자동으로 생성하고 IOC 컨테이너에 삽입합니다.

기존 Spring 프로젝트에서는 구성이 필요합니다

<bean id="jedisConnectionFactory" class="...JedisConnectionFactory"></bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"></bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"></bean>

그러나 SpringBoot를 사용할 때는 pom에 해당 jar 패키지를 도입하는 것 외에도 spring-boot-autoconfigure.jar/META-INF/spring에서 120개 이상의 기본 기능 구성 클래스를 가져옵니다. .factories(redis 함수 구성 클래스 RedisAutoConfiguration의 정규화된 이름 포함) 일반적으로 함수 구성 클래스는 이 함수를 둘러싸고 생성 관리를 담당합니다. RedisAutoConfiguration과 같은 여러 관련 기능 클래스는 세 가지 기능 클래스 생성을 담당합니다.

JedisConnectionFactory, RedisTemplate 및 StringRedisTemplate
    org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  • RedisAutoConfiguration 구성 클래스가 적용되는 조건 중 하나는 @ConditionalOnClass: JedisConnection.class, RedisOperations.class, Jedis.class이므로 클래스 경로로 이동하여 해당 클래스 파일

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {}

  • pom.xml에 해당 jar 패키지가 있으면 해당 종속성 클래스인 JedisConnection.class, RedisOperations.class, Jedis와 일치할 수 있습니다. , 이 함수 구성 클래스가 적용되고 기본 속성 구성 클래스 @EnableConfigurationProperties(RedisProperties.class)가 주입됩니다. JedisConnectionFactory 및 RedisTemplate의 경우 조건은 사용자 정의

@ConditionalOnMissingBean(RedisConnectionFactory. class) 및 RedisTemplate
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
  • 최종 생성된 기본 어셈블리 클래스는 기능 구성 클래스에서 @을 통해 구성되며 IOC
  • 원리 및 결과 분석

    에 삽입됩니다. , SpringApplication.run(Application.class, args)은 실행 시 spring-boot-autoconfigure.jar에서 스프링을 읽습니다. 구성 파일에는 모든 자동 어셈블리 클래스의 구성 클래스에 대한 className이 포함되어 있습니다. 함수에 해당하는 구성 클래스입니다. 이러한 함수 구성 클래스가 적용되면 클래스 경로로 이동하여 이 클래스의 종속 클래스가 있는지 확인합니다(즉, pom .xml에는 해당 함수가 있는 jar 패키지가 있어야 합니다). , 이후 구성 클래스의 판단을 통해 최종 기능 클래스가 생성되고 기본 속성 값 클래스가 구성 클래스에 주입되어 기능 클래스를 참조하고 기본값을 할당할 수 있습니다. 기능적 클래스 생성의 원칙은 사용자 정의에 우선순위를 두는 것입니다. 자동 어셈블리 클래스는 사용자 정의가 없는 경우에만 사용됩니다.
요약하자면, 클래스를 자동으로 어셈블하려면 두 가지 조건이 충족되어야 합니다.
  • spring.factories에는 이 클래스에 대한 구성 클래스가 있습니다(구성 클래스는 이 기능을 둘러싼 여러 종속 클래스를 만들 수 있습니다)

  • pom.xml에는 해당 jar 패키지가 필요합니다.

전체 프로세스의 결과는 두 가지입니다.

다양한 판단과 의존성을 기반으로 비즈니스에 필요한 클래스가 최종적으로 생성됩니다. IOC 컨테이너에서 자동 어셈블리에 의해 생성된 클래스에는 일부 기본 속성 값이 제공됩니다. ​​
  • 종속 주석

  • @SpringBootApplication: SB 프로젝트 애플리케이션 시작 클래스의 주석은 실제로 3개의 주석의 조합입니다. : @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan, 두 번째는 자동 조립에서 역할을 합니다.

    @EnableAutoConfiguration: 자동 조립을 시작하는 SB 애플리케이션의 기능을 나타냅니다(해당 빈을 IOC 컨테이너에 로드하는 것을 포함하고, 기본 구성에 따라 속성에 값을 할당합니다)

@Import(EnableAutoConfigurationImportSelector.class): 이 주석은 IOC에 등록되지 않은 Bean을 강제로 IOC에 등록하여 시작하도록 나타낼 수 있습니다. 자동 구성 기능인 EnableAutoConfigurationImportSelector.class를 도입해야 합니다.
  • @Configuration
  • @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }): RedisAutoConfiguration 구성 클래스가 작동해야 함을 나타냅니다. , 이러한 클래스를 포함하는 jar 패키지가 있어야 합니다

@EnableConfigurationProperties(RedisProperties.class): RedisProperties.class의 구성이 기본적으로 참조됨을 나타냅니다
  • @ConditionalOnMissingBean(RedisConnectionFactory.class): 이것은 매우 강력한 주석. 자동 조립 구현 시 사용자 정의가 우선적으로 적용됩니다. 사용자가 사용자 정의 RedisConnectionFactory.class 클래스를 주입하지 않는 경우에만 기본 JedisConnectionFactory가 사용됨을 나타냅니다.

자동 조립 프로세스

  • 는 다양한 주석을 통해 클래스 간의 종속성을 실현합니다. 컨테이너가 Application.run을 시작하면 EnableAutoConfigurationImportSelector.class(실제로는 상위 클래스) 메서드의 selectImports 메서드를 호출합니다.

  • selectImports 메소드는 결국 SpringFactoriesLoader.loadFactoryNames 메소드를 호출하여 일반적으로 사용되는 BeanConfiguration의 전체 목록을 얻습니다.

  • loadFactoryNames 메소드는 FACTORIES_RESOURCE_LOCATION(즉, spring-boot-autoconfigure.jar 아래의 spring.factories)을 읽고 완전한 이름을 얻습니다. 모든 Spring 관련 Bean의 ClassName은 약 120개

  • selectImports 메소드가 계속해서 filter(configurations, autoConfigurationMetadata)를 호출하는데, 가장 중요한 것은 이러한 BeanConfiguration의 조건에 따라 하나씩 필터링한다는 것입니다. @ConditionalOnClass. 이 조건부 주석은 jar 패키지에 이 조건부 종속 클래스가 있는지 확인하기 위해 클래스 경로에서 검색됩니다. 따라서 이러한 종속 클래스를 갖고 IOC에서 요구하는 일부 기본 구성 Bean을 생성하려면 해당 jar 패키지를 사용할 수 있어야 합니다.

  • 마지막으로 기본 EnableConfigurationPropertie 클래스의 속성 값에 정규화된 BeanConfiguration을 삽입하고 이를 IOC 환경에 삽입합니다

위 내용은 Java SpringBoot 자동 어셈블리의 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제