Rumah  >  Artikel  >  Java  >  Apakah prinsip pemasangan automatik java SpringBoot?

Apakah prinsip pemasangan automatik java SpringBoot?

王林
王林ke hadapan
2023-04-25 08:16:061104semak imbas

ringkasan

perincian

Projek Spring Tradisional akan mempunyai banyak fail konfigurasi Contohnya, jika kita ingin menggunakan Redis, secara amnya sebagai tambahan kepada pakej balang bergantung yang sepadan, kita juga perlu. tambahkannya dalam application.xml Konfigurasikan JedisConnectionFactory, JedisPoolConfig dan RedisTemplate. Tetapi jika anda menggunakan SpringBoot, sistem akan menjana kelas ini secara automatik berdasarkan pakej balang dalam pom.xml dan menyuntiknya ke dalam bekas IOC.

Dalam projek Spring tradisional, konfigurasi diperlukan

<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>

Apabila menggunakan SpringBoot, selain memperkenalkan pakej balang yang sepadan dalam pom.xml, anda hanya perlu mengkonfigurasi nilai sifat yang sepadan. ​​dalam application.properties.

Ambil Redis sebagai contoh

  • Dapatkan lebih daripada 120 kelas konfigurasi fungsi lalai daripada spring-boot-autoconfigure.jar/META-INF /spring.factories, termasuk redis Nama yang layak sepenuhnya bagi kelas konfigurasi berfungsi RedisAutoConfiguration Secara amnya, kelas konfigurasi berfungsi mengelilingi fungsi ini dan bertanggungjawab untuk menguruskan penciptaan berbilang kelas fungsi yang berkaitan, contohnya, RedisAutoConfiguration bertanggungjawab untuk:

JedisConnectionFactory, RedisTemplate, StringRedisTemplate Penciptaan ketiga-tiga kelas berfungsi ini

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  • Satu syarat untuk kelas konfigurasi RedisAutoConfiguration berkuat kuasa ialah @ConditionalOnClass : JedisConnection.class, RedisOperations.class, Jedis.class, jadi ia akan pergi ke classpath. Cari fail kelas yang sepadan

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {}
  • Jika pom. xml mempunyai pakej balang yang sepadan, anda boleh memadankan kelas pergantungan yang sepadan: JedisConnection.class, kelas RedisOperations, Jedis.class

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • akan berjaya dipadankan. , kelas konfigurasi fungsi ini akan berkuat kuasa dan kelas konfigurasi sifat lalai @EnableConfigurationProperties(kelasRedisProperties.)

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;
    private int port = 6379;
  • Konfigurasi fungsi Redis akan menjana akhir JedisConnectionFactory dan RedisTemplate mengikut syarat syaratnya ialah dalam persekitaran IOC, tiada

@ConditionalOnMissingBean(RedisConnectionFactory.class), RedisTemplate

@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
        @Bean
        @ConditionalOnMissingBean(RedisConnectionFactory.class)
        public JedisConnectionFactory redisConnectionFactory()
                throws UnknownHostException {
            return applyProperties(createJedisConnectionFactory());
        }

        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(
                RedisConnectionFactory redisConnectionFactory)
                        throws UnknownHostException {
            RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
}
  • Kelas pemasangan lalai yang akhirnya dibuat akan dikonfigurasikan melalui @ dalam kelas konfigurasi berfungsi Anotasi kacang, disuntik ke dalam IOC

Analisis prinsip dan hasil

Melalui pelbagai anotasi, SpringApplication.run(Application.class, args) akan dibaca semasa menjalankan Ambil fail konfigurasi spring.factories dalam spring-boot-autoconfigure.jar Fail konfigurasi mengandungi className bagi kelas konfigurasi semua kelas pemasangan automatik, dan kemudian menjana kelas Konfigurasi untuk fungsi yang sepadan Jika kelas konfigurasi fungsi ini berkuat kuasa, mereka akan pergi ke laluan kelas Ketahui sama ada terdapat kelas bergantung bagi kelas ini (iaitu, kelas pom. boleh dirujuk dan nilai lalai yang diberikan. Prinsip menjana kelas berfungsi adalah untuk memberi keutamaan kepada penyesuaian kelas pemasangan automatik akan digunakan hanya apabila tiada penyesuaian.

Ringkasnya, untuk memasang kelas secara automatik, dua syarat perlu dipenuhi:
  • Terdapat kelas konfigurasi untuk kelas ini pada musim bunga .factories (a Kelas konfigurasi boleh mencipta kelas pergantungan berbilang di sekeliling fungsi ini)

  • pom.xml perlu mempunyai pakej balang yang sepadan

Hasil keseluruhan proses ialah dua perkara:
  • Berdasarkan pelbagai pertimbangan dan kebergantungan, kelas yang diperlukan oleh perniagaan akhirnya dijana dan disuntik ke dalam bekas IOC
  • Kelas yang dijana oleh pemasangan automatik diberikan beberapa nilai atribut lalai

Anotasi bergantung
  • @ SpringBootApplication: Anotasi kelas permulaan aplikasi projek sb sebenarnya adalah gabungan tiga anotasi: @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan, yang mana yang kedua memainkan peranan dalam pemasangan automatik
  • @EnableAutoConfiguration: Menunjukkan fungsi aplikasi SB untuk memulakan pemasangan automatik (termasuk memuatkan kacang yang sepadan ke dalam bekas IOC dan memberikan nilai kepada sifat mengikut konfigurasi lalai)
  • @Import(EnableAutoConfigurationImportSelector.class): Anotasi ini agak berkuasa Anda boleh mendaftarkan kacang yang tidak didaftarkan dalam IOC ke IOC secara paksa, menunjukkan bahawa untuk memulakan fungsi konfigurasi automatik, anda perlu memperkenalkan EnableAutoConfigurationImportSelector.class <.>
  • @Configuration

  • @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }): Menunjukkan bahawa untuk kelas konfigurasi RedisAutoConfiguration untuk berfungsi, mesti ada pakej balang yang mengandungi kelas ini

  • @EnableConfigurationProperties(RedisProperties.class): Menunjukkan bahawa konfigurasi dalam RedisProperties.class dirujuk secara lalai

  • @ConditionalOnMissingBean(RedisConnectionFactory.class): Ini sangat berkuasa Nota, penyesuaian diutamakan apabila melaksanakan pemasangan automatik. Menunjukkan bahawa JedisConnectionFactory lalai akan digunakan hanya jika pengguna tidak menyuntik tersuai kelas RedisConnectionFactory.class.

Proses pemasangan automatik

  • Kebergantungan antara kelas direalisasikan melalui pelbagai anotasi Apabila bekas memulakan Application.run, ia akan Memanggil kaedah selectImports daripada EnableAutoConfigurationImportSelector.class (sebenarnya kaedah kelas induknya)

  • kaedah selectImports akhirnya akan memanggil kaedah SpringFactoriesLoader.loadFactoryNames untuk mendapatkan senarai komprehensif BeanConfigurations yang biasa digunakan

  • Kaedah loadFactoryNames akan membaca FACTORIES_RESOURCE_LOCATION (iaitu spring.factories di bawah spring-boot-autoconfigure.jar) dan mendapatkan ClassName yang layak sepenuhnya bagi semua kacang berkaitan Spring, kira-kira 120+

  • Kaedah selectImports terus memanggil penapis(konfigurasi, autoConfigurationMetadata pada masa ini, ia akan menapis satu demi satu mengikut syarat dalam BeanConfiguration ini ke classpath. Cari sama ada terdapat kelas pergantungan bersyarat ini dalam pakej balang, jadi anda mesti mempunyai pakej balang yang sepadan untuk mempunyai kelas pergantungan ini dan menjana beberapa kacang konfigurasi lalai yang diperlukan oleh persekitaran IOC

  • Akhir sekali, masukkan BeanConfiguration yang layak ke dalam nilai atribut dalam kelas EnableConfigurationPropertie lalai, dan masukkannya ke dalam persekitaran IOC

Atas ialah kandungan terperinci Apakah prinsip pemasangan automatik java SpringBoot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam