欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 第六节:如何解决@ComponentScan只能扫描当前包及子包(自学Spring boot 3.x的第一天)

第六节:如何解决@ComponentScan只能扫描当前包及子包(自学Spring boot 3.x的第一天)

2024/10/24 2:24:51 来源:https://blog.csdn.net/qq_21004057/article/details/140054574  浏览:    关键词:第六节:如何解决@ComponentScan只能扫描当前包及子包(自学Spring boot 3.x的第一天)

大家好,我是网创有方,继上节咱们使用了@Component和@ComponentScan的方法实现了获取IOC容器中的Bean,但是存在一个问题,就是必须把AppConfig和要扫描的bean类放在同一个目录下,这样就导致了AppConfig类和bean类在同一个目录下,这对整个项目的结构框架来说是不合理的,没有人会这样做,所以config包和pojo包就应该分开。这节就来解决下这个问题。同样这节实现打印出IOC获取到的bean的属性。

第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)-CSDN博客

@ComponentScan 注解在 Spring 框架中用于配置组件扫描的指令,它告诉 Spring 在哪些包中查找被 @Component、@Service、@Repository、@Controller 等注解标记的类,并将它们注册为 Spring 应用上下文中的 bean。 默认情况下,@ComponentScan 会扫描定义该注解的类所在的包以及其子包。但是,@ComponentScan 并不局限于只扫描当前包。你可以通过 basePackages 或 basePackageClasses 属性来指定其他包进行扫描。 例如:

1.使用 basePackages 指定多个包进行扫描:

@Configuration  
@ComponentScan(basePackages = {"com.example.package1", "com.example.package2"})  
public class AppConfig {  // ...  
}

2.使用 basePackageClasses 指定多个包(通过指定一个包中的类来间接指定包):

@Configuration  
@ComponentScan(basePackageClasses = {Package1Marker.class, Package2Marker.class})  
public class AppConfig {  // ...  
}  // 假设这两个类分别位于 com.example.package1 和 com.example.package2 包中  
class Package1Marker {  // 无需任何方法或属性,只是一个标记  
}  class Package2Marker {  // 无需任何方法或属性,只是一个标记  
}

在上述例子中,@ComponentScan 会扫描 com.example.package1 和 com.example.package2 这两个包以及它们的子包中的组件。

通过上面的方式虽然可以实现,但是如果bean来太多了,就麻烦了。所以直接通过下面方式实现对其他包下的类的扫描。

3.  在@ComponentScan后面紧跟要扫描的包,这样会自动扫描下面的类。

@Configuration
@ComponentScan("cn.wcyf.wcai.pojo")
public class AppConfig {}

项目的框架如下图。Student类又被移回到pojo实体类包下,看起来清晰明朗。

运行效果如下:

参考

《深入浅出Spring-boot 3.x》

《SpringBoot企业级应用开发》

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com