从注释处理器生成 Spring 个组件

Generate Spring component from annotation processor

我正在使用自定义 AbstractProcessor 生成一些 类。我尝试生成 Spring 组件 A 和 B,其中 B "autowire" A。输出 类 看起来类似于:

@Component
public class ClassA {
    @Bean
    public MyBean getMyBean() {
        return new MyBean();
    }
}
@Component
public class ClassB {
    @Autowired
    private ClassA myClassA;

    private MyBean myBean;

    public ClassB() {
        this.myBean = myClassA.getMyBean();
    }
}

但是自动装配的 myClassA 是空的。 我怀疑 Spring 扫描是在我的 类 生成之前进行的。

当我运行一个mvn clean install我有

...
[INFO] --- spring-boot-maven-plugin:2.0.1.RELEASE:repackage (default) @ main ---

[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ main ---
[INFO] Installing C:\Users\me\Documents\kubernetes\spring\testproject2\main\target\main-1.0-SNAPSHOT.jar to C:\Users\me\.m2\repository\be\mycompany\main.0-SNAPSHOT\main-1.0-SNAPSHOT.jar
[INFO] Installing C:\Users\me\Documents\kubernetes\spring\testproject2\main\pom.xml to C:\Users\me\.m2\repository\be\mycompany\main.0-SNAPSHOT\main-1.0-SNAPSHOT.pom

表示 spring-boot-maven-pluginmaven-install-plugin 之前 运行ning。 这是我的 "annotation processor" 项目中使用的插件配置:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <showWarnings>true</showWarnings>
            </configuration>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <configuration>
                        <compilerArgument>-proc:none</compilerArgument>
                        <includes>
                            <include>be/mycompany/testproject2/dbgenerator/processing/DatabaseAnnotationProcessor.java</include>
                        </includes>
                    </configuration>
                </execution>
                <execution>
                    <id>compile-project</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

关于如何确保我生成的组件可以自动装配它们自己的任何提示?

谢谢。

在这种情况下,您应该使用 Class B 的构造函数来确保 Class A 存在:

@Component
public class ClassB {
    @Autowired
    private ClassA myClassA;

    private MyBean myBean;

    public ClassB(ClassA myClassA) {
        this.myBean = myClassA.getMyBean();
        this.myClassA= myClassA;
    }
}