# 代码结构如下:
注意【com.chz.myBean.branch】和【com.chz.myBean.main】这两个包是没有生重叠的。
主程序【MyBeanTest1、MyBeanTest2、MyBeanTest3】这两个类是在包【com.chz.myBean.main】下
# 示例代码
【pom.xml】
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
【application.properties】
server.port=8080
spring.application.name=myBean
management.server.port=7001
management.endpoints.web.exposure.include=*
branch.bean.name=I am branch bean
【BranchBean.java】
package com.chz.myBean.branch.bean;
@Slf4j
@Getter
@Setter
@Component
public class BranchBean
{
@Value("${branch.bean.name:}")
private String name;
}
【BranchController.java】
package com.chz.myBean.branch.controller;
@Slf4j
@RestController
@RequestMapping("/branch")
public class BranchController {
@Autowired
private BranchBean branchBean;
@GetMapping("/test1")
public String test1() {
return "test1: " + branchBean.getName();
}
@GetMapping("/test2")
public String test2() {
return "test2";
}
}
【MainBean.java】
package com.chz.myBean.main.bean;
@Getter
@Setter
@Component
public class MainBean
{
@Autowired
private BranchBean bean;
}
【MainController.java】
package com.chz.myBean.main.controller;
@Slf4j
@RestController
@RequestMapping("/main")
public class MainController
{
@Autowired
private MainBean mainBean;
@GetMapping("/test1")
public String test1() {
return "test1: " + mainBean.getBean().getName();
}
@GetMapping("/test2")
public String test2() {
return "test2";
}
}
【MyBeanTest1.java】
package com.chz.myBean.main;
@SpringBootApplication(
scanBasePackages = "com.chz.myBean.branch",
scanBasePackageClasses = MyBeanTest1.class
)
public class MyBeanTest1 {
public static void main(String[] args) {
SpringApplication.run(MyBeanTest1.class, args);
}
}
上面这个类是最正常的情况,扫包的范围放在【@SpringBootApplication】,后面的结果测试正常。
【MyBeanTest2.java】
package com.chz.myBean.main;
@ComponentScan(
basePackages = "com.chz.myBean.branch",
basePackageClasses = MyBeanTest2.class
)
@SpringBootApplication(
)
public class MyBeanTest2
{
public static void main(String[] args) {
SpringApplication.run(MyBeanTest2.class, args);
}
}
上面这个类扫包的范围不放在【@SpringBootApplication】,而是放在【@ComponentScan】,后面的结果测试正常。
【MyBeanTest3.java】
package com.chz.myBean.main;
@ComponentScan(
basePackages = "com.chz.myBean.branch"
)
@SpringBootApplication(
scanBasePackageClasses = MyBeanTest3.class
)
public class MyBeanTest3
{
public static void main(String[] args) {
SpringApplication.run(MyBeanTest3.class, args);
}
}
上面这个类放包的范围放在【@ComponentScan】和【@SpringBootApplication】两个里面,后面的结果测试不正常。
# 开始测试
测试1
启动【MyBeanTest1】,可以看到【branch】和【main】包里面的bean都扫到了
测试2
关掉【MyBeanTest1】,启动【MyBeanTest2】,也可以看到【branch】和【main】包里面的bean都扫到了
测试3
关掉【MyBeanTest2】,启动【MyBeanTest3】,可以看到只有【branch】包里面的bean扫到了。也就是说当【@ComponentScan】和【@SpringBootApplication】都存在扫包范围时,只有【@ComponentScan】里面配置的扫包范围会生效。