大家好,我是网创有方,继上节咱们使用了@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企业级应用开发》