1
votes

Comment désactiver complètement la configuration automatique de Spring Boot?

Je travaille sur une application et je souhaite uniquement utiliser les fonctionnalités DI de Spring. Mon problème est que je n'arrive pas à désactiver les fonctionnalités de configuration automatique de Spring Boot. Je continue à recevoir cette exception:

@Configuration
public class BeanConfig {

    @Bean
    public Database database() {
        return DatabaseConfig.configureDatabase();
    }

    @Bean
    public UserRepository userRepository() {
        return new InMemoryUserRepository(
                Collections.singletonList(new UserEntity(
                        1,
                        "user",
                        Arrays.asList(Permission.ADOPT.name(), Permission.EDIT_PROFILE.name()))));
    }

    @DependsOn("database")
    @Bean
    public DogRepository dogRepository() {
        return new H2DogRepository();
    }

    @Bean
    public AdoptDog adoptDog() {
        return new AdoptDog(dogRepository());
    }

    @Bean
    public FindDogs findDogs() {
        return new FindDogs(dogRepository());
    }

    @Bean
    public CreateDog createDog() {
        return new CreateDog(dogRepository());
    }

    @Bean
    public DeleteDogs deleteDogs() {
        return new DeleteDogs(dogRepository());
    }

    @Bean
    public FindUser findUser() {
        return new FindUser(userRepository());
    }

    @PostConstruct
    public void initialize() {
        ApplicationEngine engine = ServerConfig.configureServer(
                userRepository(), adoptDog(), findDogs(), createDog(), findUser(), deleteDogs());
        DogUtils.loadDogs().forEach(dogRepository()::create);
        CheckerUtils.runChecks(engine, userRepository());
    }
}

J'ai essayé de ne pas utiliser @SpringBootApplication uniquement @ComponentScan , mais cela n'a pas fonctionné. J'ai également essayé d'exclure les classes d'autoconfiguration pertinentes:

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        XADataSourceAutoConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication .class, args);
    }
}

mais cela ne fonctionne pas non plus. Comment puis-je me débarrasser complètement de la configuration automatique? Je n'ai pas trouvé d'annotation @DisableAutoConfiguration , mais il y a une @EnableAutoConfiguration.

Modifier: p >

Mes beans sont configurés dans un fichier séparé dans le même package que ma classe d'application:

2020-06-26 14:00:03.240 [main] TRACE o.s.b.diagnostics.FailureAnalyzers - Failed to load org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
java.lang.NoClassDefFoundError: org/springframework/jdbc/CannotGetJdbcConnectionException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.boot.diagnostics.FailureAnalyzers.loadFailureAnalyzers(FailureAnalyzers.java:75)
    at org.springframework.boot.diagnostics.FailureAnalyzers.<init>(FailureAnalyzers.java:66)
    at org.springframework.boot.diagnostics.FailureAnalyzers.<init>(FailureAnalyzers.java:60)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204)
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:441)
    at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:427)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at MyApplication.main(MyApplication.java:19)

J'ai une technologie de serveur différente et j'utilise ce projet pour démontrer l'interopérabilité Kotlin-Java (tous ces fichiers sont des fichiers Kotlin référencés ici).


1 commentaires

Avant que Spring Boot n'arrive, nous ne pouvions faire que ce que vous vouliez faire… cela faisait longtemps pour moi, je travaillais sur des applications spring-mvc. L'essentiel est simplement de lancer un contexte d'application. Avec spring-mvc qui a été déclenché par le cycle de vie du servlet, mais vous pouvez simplement en créer un à partir d'une méthode principale ou de tout autre point de raccordement qui fonctionne pour vous. Je n'ai rien sous la main mais il doit y avoir des exemples de ressorts non-boot dans la documentation du printemps


3 Réponses :


1
votes

En fait, cela peut être dû à spring.factories dans certains de vos pots et auteurs qui le violent. (c'est-à-dire ne pas les lister sous la clé EnableAutoConfiguration selon https://docs.spring.io/autorepo/docs/spring-boot/2.0.0.M3/reference/html/boot -features-development-auto-configuration.html

Dans cet exemple, un écouteur d'application sera enregistré indépendamment de la configuration automatique activée ou non. Certains des bocaux de votre chemin de classe peuvent avoir des beans définis dans les usines de printemps https: // www. logicbig.com/tutorials/spring-framework/spring-boot/application-listener-via-spring-factories.html


2 commentaires

J'ai essayé de ne pas utiliser @SpringBootApplication uniquement @ComponentScan , mais cela n'a pas fonctionné.


Le problème est que certaines classes ne sont pas sur le chemin de classe que Spring essaie d'utiliser, mais cela ne devrait pas du tout les toucher car je ne veux utiliser que les fonctionnalités DI.



2
votes

Le problème était que Spring recherchait des classes que je n'avais pas (je n'en utilise aucune) mais qui étaient nécessaires pour que cela fonctionne.

Une fois, j'ai ajouté "org.springframework.boot: spring-boot-starter-data-jdbc" et "javax.validation: validation-api: 2.0.1.Final" < / code> comme dépendances, il a commencé à fonctionner.


0 commentaires

1
votes

Ajoutez uniquement spring-boot aux dépendances (n'utilisez pas *-starter-*)

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot</artifactId>
    </dependency>

, et utilisez @ComponentScan au lieu de @SpringBootApplication.


0 commentaires