@Component Scan 不适用于 Spring Boot 中的 @Componen

我以这种方式在spring boot应用程序中有一个通用的jar文件,


package com.acc.api;


import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;


@SpringBootApplication

@ComponentScan(basePackages = {"com.acc.api","service"})

public class ApicoreApplication {


    public static void main(String[] args) {

        ApplicationContext applicationContext = SpringApplication.run(ApicoreApplication.class, args);


        for (String name: applicationContext.getBeanDefinitionNames()) {

            System.out.println(name);

        }

    }


}

其中的组件是,


package com.acc.api.core.utils;


import java.util.Map;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;


@Component

public class AccUtil {


    @Autowired

    private WebServiceEngine engine;


}

其中 WebServiceEngine 是我调用的第三方 api。


我的 pom 条目是这样的,


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.1.2.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <groupId>com.acc.api</groupId>

    <artifactId>apicore</artifactId>

    <version>0.0.1</version>

    <name>apicore</name>

    <description>apicore</description>


    <properties>

        <java.version>1.8</java.version>

    </properties>



直到这很好,项目正在编译,jar 正在目标文件夹中创建。


慕神8447489
浏览 137回答 3
3回答

慕码人8056858

您在com.acc.api.core.utils.AccUtil课堂上两次导入StatusController课程:import com.acc.api.core.utils.AccUtil;@Import({AccUtil.class})删除其中一个,然后重试。

慕容708150

Spring boot 仅扫描作为依赖项的包/jar。无论哪种方式,编译时范围或运行时范围(提供)。因此,如果您尝试扫描不依赖于编译时(默认范围)的 jar,例如,因为您集成在一个接口上,您仍然依赖于它运行时,因此组件可以找到要注入的实现类。如果您连接例如@RestControllers,则应用程序可能在另一个包/jar 中,然后是您的控制器。尽管您没有应用程序包对控制器的编译时依赖性,但您仍然需要加载 jar 运行时。否则,控制器将不会被扫描并发现运行时。<dependency>&nbsp; &nbsp; &nbsp; &nbsp; <groupId>...</groupId>&nbsp; &nbsp; &nbsp; &nbsp; <artifactId>...</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; <version></version>&nbsp; &nbsp; &nbsp; &nbsp; <scope>provided</scope></dependency><dependency>&nbsp; &nbsp; <groupId>...</groupId>&nbsp; &nbsp; <artifactId>...</artifactId>&nbsp; &nbsp; <version></version>&nbsp; &nbsp; <scope>compile</scope></dependency>

噜噜哒

使用 Spring Boot 时,spring-boot-maven-plugin会重新打包并重组生成的 jar 文件。此 jar 文件不可用作其他应用程序的依赖项。相反,您需要指示spring-boot-maven-plugin重新打包 jar 并保留原始工件(并将两者都发布到您的 maven 存储库)。Spring Boot 参考指南有一个关于如何做到这一点的特殊部分。如果您的 jar 只是一个依赖项并且本身不能运行/可执行,那么只需删除spring-boot-maven-plugin并生成一个常规 jar。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java