1

我知道带有@Configuration 的@ComponentScan 告诉Spring 在哪里寻找bean。

@ComponentScan
@Configuration
public class MyApp{
     ...
}

我不明白的是我必须将这两个注释放在哪个类上。他们应该留在包含 main 方法的类上吗?像这样

@ComponentScan
@Configuration
public class MyApp{

     public static void main(String[] args) {
          ...
     }

}

或者他们可以留在任何类别的应用程序上?问题来自这样一个事实,即 Spring 必须知道 @ComponentScan 的位置......或者是否有一种自动方法来检测 Spring 在后台执行的 @ComponentScan 注释?希望能解释一下自己!

4

3 回答 3

1

@Configuration注解告诉 Spring 容器该类包含 Spring bean 配置。

@ComponentScanannotation 告诉 Spring 容器带注释的类扫描/搜索其他注释和组件。您还可以使用注释定义要扫描的包名称,@ComponentScan("your.package.name")或者您可以提供不需要扫描的包/类名称。

因此,您可以将这些注释放在定义您的 bean 配置的任何类上,并且 Spring 容器可能需要这些注释来为您的实体/POJO、服务和 DAO 解析和创建对象。

最后,我想添加@ComponentScan其他注释以进行自动检测。否则,您将需要为 spring 定义 XML(这就是在带有注释的情况下发生的事情)以读取和执行这些操作。

于 2020-07-25T17:01:50.823 回答
1

你可以把它放在你想要的任何地方(我通常把我的放在 com.domain.project-name.config 中)并指定它应该扫描的目录,例如,如果你希望它扫描项目使用的所有内容

@ComponentScan("com.domain.project-name")
@Configuration
public class Config {
...

默认情况下,ComponentScan 会扫描当前目录级别及以下的所有带注释的类。

于 2020-07-25T16:17:49.393 回答
0

使用简单的例子。您可以将@ComponentScanwith放置@Configuration在 main 方法可以扫描的任何类中。

主类扫描 MyScan 类,然后扫描 bean 类。

package com.boot.spring;

@SpringBootApplication
@ComponentScan(basePackages = "com.boot.scan")
public class BootApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(BootApplication.class, args);
        System.out.println(ctx.getBean("demoBean"));
    }
}

Bean 类在不同的包中

package com.boot.bean;
@Service
public class DemoBean {
}

现在,通过 DemoScan 类发现了 bean 类

package com.boot.scan;
@ComponentScan(basePackages = "com.boot.bean")
@Configuration
public class DemoScan {
}
于 2021-06-26T14:26:18.900 回答