首页 > 编程语言 >java:【@ComponentScan】和【@SpringBootApplication】扫包范围的冲突

java:【@ComponentScan】和【@SpringBootApplication】扫包范围的冲突

时间:2024-06-13 19:30:44浏览次数:19  
标签:main java 扫包 SpringBootApplication branch myBean chz com public

# 代码结构如下:

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

标签:main,java,扫包,SpringBootApplication,branch,myBean,chz,com,public
From: https://blog.csdn.net/chenhz2284/article/details/139657218

相关文章

  • 【Java中常用的设计模式总结】
    文章目录概要1、单例模式(SingletonPattern)2、工厂模式(FactoryPattern)3、建造者模式(BuilderPattern)4、原型模式(PrototypePattern)5、适配器模式(AdapterPattern)6、桥接模式(BridgePattern)7、组合模式(CompositePattern)8、装饰器模式(DecoratorPattern)9、外观模式(Facade......
  • 【java计算机毕设】图书管理系统javaweb java MySQL springboot vue html maven送文档
    1项目功能【java计算机专业学长毕业设计分享】智慧图书管理系统JavaSpringBootvueHTMLMySQL前后端分离2项目介绍系统功能:智慧图书管理系统包括管理员和用户两种角色。管理员的功能包括在个人中心修改个人信息和密码,管理员功能模块管理管理员。基础数据管理模......
  • JavaScript 编程语言【数据类型】映射|集合|WeakMap and WeakSet
    文章目录MapandSet(映射和集合)MapMap迭代Object.entries:从对象创建Map]Object.fromEntries:从Map创建对象SetSet迭代(iteration)总结✅任务过滤数组中的唯一元素过滤字谜(anagrams)迭代键WeakMapandWeakSet(弱映射和弱集合)WeakMap使用案例:额外的数据使用案例:缓存Weak......
  • Java面试:Redis如何保证数据一致性?
    Redis是一个内存数据结构存储系统,广泛用于缓存、会话管理等场景。尽管Redis本身不是传统的关系型数据库,它仍然提供了一些机制来保证数据一致性。以下是Redis保证数据一致性的一些方法和机制:1.事务机制(Transactions)Redis支持事务,通过MULTI、EXEC、DISCARD、WATCH等命令实......
  • Java面试:final关键字有什么特点?
    final关键字在Java中有多种用途和特点,它可以用在类、方法和变量的声明中。以下是final关键字在不同上下文中的特点和用途:1.final类特点:当一个类被声明为final时,这个类不能被继承。不能创建这个类的子类,任何试图继承这个类的行为都会导致编译错误。示例:publicfinalc......
  • Java 17 新增的语法特性
    Java17新增的语法特性目录Java17新增的语法特性JEP与ProjectAmber引言1.Records[JEP395]2.switch表达式与yield[JEP361]3.用于instanceof的模式匹配[JEP394]4.文本块[JEP378]5.密封类[JEP409]Java17的其他主要改进稳定版的ZGC垃圾回收器主流Java开发框架支持更......
  • Java 21新增的语法特性
    Java21新增的语法特性目录Java21新增的语法特性引言record模式[JEP440]用于switch的模式匹配[JEP441]序列集合[JEP431]虚拟线程[JEP444]Java21的其他改进说明1:本文大量参考了JEP文档与Oracle官方文档,部分文字直接引自这两个文档并进行了适当的修改。说明2:本文代码详......
  • Spring Junit 测试报错 java.lang.IllegalStateException
    写测试代码的时候出现了java.lang.IllegalStateException:CouldnotloadTestContextBootstrapper[null].Specify@BootstrapWith's'value'attributeormakethedefaultbootstrapperclassavailable.代码如下:packagecom.example.service;importcom.example.c......
  • Java优雅统计耗时【工具类】
    任务耗时如何优雅的打印,看完本文你就明白了!~importcn.hutool.core.date.StopWatch;importcn.hutool.core.lang.Console;/***优雅打印出任务耗时*/publicclassMain{publicstaticvoidmain(String[]args)throwsException{StopWatchstopWat......
  • JAVA面向对象练习题2
    题目要求:        定义一个Student实体类,成员变量:name、age。静态成员变量:在线人数。在测试类中:创建集合,存储学生对象,每创建一个学生对象,在线人数+1,删除一个学生对象,在线人数-1定义方法完成:请给集合中存储3个学生对象,并遍历集合,并输出在线人数。定义方法完成:请判断......