个人技术分享

# 代码结构如下:

在这里插入图片描述
注意【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】里面配置的扫包范围会生效。
在这里插入图片描述