Schreiben Sie Ihren Spring-Boot-Starter

Die meisten Java-Entwickler sind bereits mit dem Spring Boot- Projekt vertraut, mit dem Sie schnell eine Anwendung schreiben können, die verschiedene Komponenten des Spring Frameworks verwendet (Spring MVC, Spring Data und viele andere).

Der gesamte Komfort von Spring Boot basiert auf der Verwendung des sogenannten Starters , mit dem Sie eine Reihe konfigurierter Beans erhalten, die gebrauchsfertig sind und über Eigenschaftendateien zur Konfiguration zur Verfügung stehen. Was aber, wenn der Starter noch nicht für die gewünschte Technologie geschrieben ist?

In diesem Artikel möchte ich am Beispiel eines Starters für Spring-social-vkontakte erläutern, wie Starter erstellt werden. Spring Social ist eines der Module des Spring Frameworkwird für die Integration in soziale Netzwerke verwendet. Das Spring Boot-Projekt umfasst Starter für soziale Netzwerke wie Facebook (Spring-Boot-Starter-Social-Facebook), Twitter (Spring-Boot-Starter-Social-Twitter) und LinkedIn (Spring-Boot-Starter-Social-Twitter). basierend auf der Verwendung geeigneter Social-Module. Die meisten CIS-Entwickler interessieren sich hauptsächlich für das soziale Netzwerk Vkontakte, für das es ein Drittanbieter-Modul spring-social-vkontakte gibt . Dementsprechend gibt es für dieses Modul noch keinen Starter. Wir werden diesen Starter in diesem Artikel schreiben.

Der Eckpfeiler der Spring Boot- Infrastruktur sind die AutoConfiguration-Klassen , die Spring Boot verwendetFindet, wann die Anwendung startet und verwendet, um automatisch Beans zu erstellen und zu konfigurieren.

Lassen Sie uns eine solche Klasse für unseren Starter erstellen:

@Configuration
@ConditionalOnClass({SocialConfigurerAdapter.class, VKontakteConnectionFactory.class})
@ConditionalOnProperty(prefix= "ru.shadam.social-vkontakte", name = { "client-id", "client-secret"})
@AutoConfigureBefore(SocialWebAutoConfiguration.class)
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class VKontakteAutoConfiguration {
}

Wir verwenden Anmerkungen, um SpringBoot mitzuteilen, dass unsere Klasse eine Konfiguration (@Configuration) ist, Anmerkungen, um die Bedingungen anzugeben, unter denen unsere AutoConfiguration zum Erstellen von Bins verwendet wird, und Anmerkungen, um anzugeben, wo sich unsere Autokonfiguration in der Anwendungsinitialisierungsprozedur befindet.

Auf diese Weise:

@ConditionalOnClass({SocialConfigurerAdapter.class, VKontakteConnectionFactory.class})

bedeutet, dass die Klassenräume erstellt werden, wenn sich im Klassenpfad ein SocialConfigurerAdapter (im Spring-Social-Modul enthalten) und eine VKontakteConnectionFactory (im Spring-Social-Vkontakte-Modul enthalten) befinden. Ohne die für unseren Starter erforderlichen Abhängigkeiten werden also keine Beans erstellt.

@ConditionalOnProperty(prefix= "ru.shadam.social-vkontakte", name = { "client-id", "client-secret"})

bedeutet, dass Klassen nur dann erstellt werden, wenn die Eigenschaften ru.shadam.social-vkontakte.client-id und ru.shadam.social-vkontakte.client-secret vorhanden sind.

@AutoConfigureBefore(SocialWebAutoConfiguration.class)
@AutoConfigureAfter(WebMvcAutoConfiguration.class)

bedeutet, dass unsere Bean nach WebMvc und vor SocialWeb initialisiert wird. Dies ist notwendig, damit zum Zeitpunkt der Initialisierung von SocialWeb unsere Beans bereits registriert sind.

Gehen wir nun zu den Beans über, die wir in unserer AutoConfiguration konfigurieren werden.

VKontakteAutoConfiguration.java
@Configuration
@ConditionalOnClass({SocialConfigurerAdapter.class, VKontakteConnectionFactory.class})
@ConditionalOnProperty(prefix= "ru.shadam.social-vkontakte", name = { "client-id", "client-secret"})
@AutoConfigureBefore(SocialWebAutoConfiguration.class)
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
public class VKontakteAutoConfiguration {
    @Configuration
    @EnableSocial
    @EnableConfigurationProperties(VKontakteProperties.class)
    @ConditionalOnWebApplication
    protected static class VKontakteConfigurationAdapter extends SocialConfigurerAdapter {
        @Autowired
        private VKontakteProperties properties;
        @Bean
        @ConditionalOnMissingBean
        @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
        public VKontakte vkontakte(ConnectionRepository repository) {
            Connection connection = repository.findPrimaryConnection(VKontakte.class);
            if (connection != null) {
                return connection.getApi();
            }
            return new VKontakteTemplate(this.properties.getClientId(), this.properties.getClientSecret());
        }
        private ConnectionFactory createConnectionFactory() {
            return new VKontakteConnectionFactory(this.properties.getClientId(), this.properties.getClientSecret());
        }
        @Override
        public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) {
            connectionFactoryConfigurer.addConnectionFactory(createConnectionFactory());
        }
    }
}


Der Ausbau SocialConfigurationAdapter , die benötigt wird , unsere registrieren die ConnectionFactory- . Dafür gibt es in SocialConfigurerAdapter eine Callback-Methode:

addConnectionFactories(ConnectionFactoryConfigurer, Environment)

Wir werden es neu definieren, indem wir unsere ConnectionFactory hinzufügen.

Wir registrieren auch den anfordernden Bereich bin Vkontakte , der eine Schnittstelle für den Zugriff auf die Vkontakte-API darstellt. In diesem Fall wird die Interaktion mit der API mithilfe von auth_token ausgeführt, wenn der Benutzer über die Anwendung autorisiert ist.

Berücksichtigen Sie auch die Klasse VkontakteProperties, mit der die Konfiguration aus den Anwendungseigenschaftendateien abgerufen wird

VkontakteProperties.java
@ConfigurationProperties(prefix = "ru.shadam.social-vkontakte")
public class VKontakteProperties  {
    private String clientId;
    private String clientSecret;
    public String getClientId() {
        return clientId;
    }
    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
    public String getClientSecret() {
        return clientSecret;
    }
    public void setClientSecret(String clientSecret) {
        this.clientSecret = clientSecret;
    }
}


Die Annotation ist für das Abrufen von Werten aus Eigenschaftendateien verantwortlich:

@ConfigurationProperties(prefix = "ru.shadam.social-vkontakte")

Sie teilt SpringBoot mit, dass sie alle Eigenschaften beginnend mit dem Präfix ru.shadam.social-vkontakte ausprobieren muss, um sie in die entsprechenden Felder der Klasse einzufügen .

Der letzte Schritt besteht darin, eine Datei zu erstellen, mit der SpringBoot unsere AutoConfiguration-Klasse finden kann. Zu diesem Zweck muss eine spezielle Datei spring.factories im Ordner META-INF der resultierenden JAR-Datei abgelegt werden.

In dieser Datei müssen wir unsere AutoConfiguration-Klasse angeben.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=ru.shadam.spring.boot.vkontakte.VKontakteAutoConfiguration

Wenn Sie nun die resultierende JAR -Datei mit unserem Spring Boot- Projekt verbinden und ru.shadam.social-vkontakte.client-id und ru.shadam.social-vkontakte.client-secret in der Konfiguration festlegen, erhalten Sie / connect / vkontakte und Vkontakte bin, mit dem wir auf die Vkontakte-API zugreifen können.

Verwendete Materialien:

  1. docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html
  2. Link zum Projekt auf github: github.com/saladinkzn/social-vkontakte-spring-boot-starter

Jetzt auch beliebt: