生成bean的注解@Component极其衍生和@ComponentScan@Configuration

@Component

Spring 2.5 以后,除了提供基本的 @Component 注解之外,还提供了 @Service @Controller @Repository 三个注解。在 Spring 源码中,后面三个注解都在开始部分引入了 @Component 注解,除此以外这四个注解的源码内容没有任何区别,因此后面的这三个注解与 Component 的作用是一样的。之所以要额外的引出这三个注解,是为了更好的与 Web 开发中常用的三层结构相对
@Component是@Service @Controller @Repository三个注解的元注解(见下图),四个都表示创建bean对象.

此外还有@RestController注解,也经常用,也是@Component的延伸。

 

@Configuration

 @Configration也是创建bean对象,元注解也是@Component,该类多搭配Bean使用,不仅
 @Configration所修饰的类是bean对象,而且其中的一个@bean标注的函数对应一个bean

表示一个类声明了一个或多个@Bean方法(就是一个方法将返回值作为bean),并可由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求。

 @Configuration
 public class AppConfig {

     @Bean
     public MyBean myBean() {
         // instantiate, configure and return bean ...
     }
 }

也就是@Configuration注解的类是用来生成bean的,一个@bean标注的函数对应一个bean,其通常被用来导入组件,就是因为要将组件定义为bean才能发挥作用。

且我们写在启动类的注解比如mapperscan,写在 @Configration修饰的bean类上也是完全可以的,这也是比较常用的用法。

@ComponentScan作用

 参考https://www.cnblogs.com/east7/p/14390877.html

@ComponentScan注解主要是从约定的扫描路径中,识别标注了组件注册注解的类(也就是@Component及其延伸注解),并且把这些类自动注册到spring IoC容器中,这些类就是我们通常所言的bean。IoC容器是Spring的特色之一,可以使用它管理bean。当然,@Configration注解修饰的类也会被托管给IoC容器。

组件扫描路径

  注解@ComponentScan 如果不设置value属性,默认扫描路径是启动类 XxxApplication.java 所在目录及其子目录(在一个包都不行,必须在同一个目录下),此外,所以最好还是配置value属性,减少加载时间,提高系统启动速度。

经代码验证,如果指定了@ComponentScan,那么默认的组件搜索路径会失效

  比如启动类在包 com.eg.wiener 下面,那么项目启动时,会默认扫描wiener包及其子包下的所有类。也就是说,即便不明确标注@ComponentScan,Spring Boot也会自动搜索当前应用主入口目录及其下方子目录。如果其它包中的bean 不在当前主包路径下面,则应使用@ComponentScan设置value属性,配置扫描路径。如果定义了错误的扫描路径,那么在使用注解@Autowired自动装配Bean时会出错,报a bean of type that could not be found错误。

配置扫描路径

  @ComponentScan注解既可以扫描包,也可以扫描指定的类。我们只需要指定一个需要扫描的路径,就可以达到更改扫描路径的目的。

  1. 包路径

  通过value属性设置需要扫描的包:

@ComponentScan({"com.company.user","com.company.service"})

  1. 类路径

  通过basePackageClasses属性指定需要扫描的类:

@ComponentScan(basePackageClasses={XxxService.class, YyyService.class})

猜你喜欢

转载自blog.csdn.net/zxyOVO/article/details/130720065