Spring Framework 组件注册 之 @Component

简介: @Component注解是一个元注解,即可以标注在其它的注解上。在spring中,任何被@Component注解标识的组件均为组件扫描的候选对象,并且被@Component元注解标注的注解,在任何组件标注它时,也被视作组件扫描的候选对象。

Spring Framework 组件注册 之 @Component

写在前面

在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能。但是spring的整个体系尤为庞大,对它的学习,还得从基础一点一滴的慢慢积累。本文主要介绍@Component注解在spring中的简单使用,以及注解的派生性层次性

@Component 简单使用

@Component注解是一个元注解,即可以标注在其它的注解上。在spring中,任何被@Component注解标识的组件均为组件扫描的候选对象,并且被@Component元注解标注的注解,在任何组件标注它时,也被视作组件扫描的候选对象。简单来说,就是在spring中,一个普通的javaBean被@Component注解标记后,在使用基于注解配置和类路径扫描时,会被作为候选组件,添加到spring容器中

package com.spring.study.ioc.register;

/**
 * spring扫描的候选组件
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Data
@Component
public class TestComponent {
    private String id = "@Component";
}

添加spring启动引导类,以及spring启动时需要扫描的类路径

/**
 * spring 容器启动引导类
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@ComponentScan("com.spring.study.ioc.register")
public class TestComponentBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestComponentBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        TestComponent bean = applicationContext.getBean(TestComponent.class);
        System.out.println("TestComponent bean : " + bean);
        applicationContext.close();
    }
}

spring容器启动后,控制台打印的结果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
TestComponent bean : TestComponent(id=@Component)

如此,在spring中通过简单在一个普通的javaBean上添加@Component注解,再加上扫描类路径,就可以将该javaBean添加到spring容器中。spring就可以对这个Bean的生命周期进行管理。

前面提到 @Component是一个元注解,当它标记在另一个注解上时,该组件同样会具有被spring扫描,并识别组件的能力。在spring中,被 @Component标记的注解有很多,例如:@Controller@Service@Repository,当一个普通的javaBean被这些注解标注时,spring容器启动时同样会把该Bean视为候选组件,添加到容器中。

将上面TestComponent类的注解换成@Service,结果也是相同的

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    @AliasFor(annotation = Component.class)
    String value() default "";
}

/**
 * spring扫描的候选组件
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Data
@Service
public class TestComponent {
    private String id = "@Service";
}

spring容器启动后,控制台打印的结果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c

TestComponent bean : TestComponent(id=@Service)

派生性层次性

这两个概念源自慕课网中小马哥的课程介绍,严格上讲,注解是没有派生性和层次性的,之所以这样讲,是因为在spring中的很多注解都是有着派生性和层次性的结构。通过这两种特性,我们也可以自定义自己的注解,利用@Component元注解,来将普通的javaBean扫描添加到spring容器中

派生性
自定义一个注解@FirstAnnotation,被@Component元注解标识,并保持相同的签名,当有组件使用@FirstAnnotation 注解标注时,就会被spring容器扫描并加载

/**
 * 自定义注解@FirstAnnotation,被@Component标注
 * @author TangFD
 * @since 2019/6/10.
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface FirstAnnotation {
    String value() default "";
}

将上面TestComponent类的注解换成@FirstAnnotation ,结果也是相同的

/**
 * spring扫描的候选组件
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Data
@FirstAnnotation
public class TestComponent {
    private String id = "@FirstAnnotation";
}

spring容器启动后,控制台打印的结果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c

TestComponent bean : TestComponent(id=@FirstAnnotation)

层次性

Spring模式注解并不具有真正的派生性和层次性,只是像java类一样,具有类似继承和层次结构的功能

自定义一个注解@SecondAnnotation,被@FirstAnnotation注解标识,当有组件使用@SecondAnnotation 注解标注时,同样会被spring容器扫描并加载

/**
 * 自定义注解@SecondAnnotation ,被@FirstAnnotation标注
 *
 * @author TangFD
 * @since 2019/6/11.
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FirstAnnotation
public @interface SecondAnnotation {
    String value() default "";
}

将上面TestComponent类的注解换成@SecondAnnotation,结果也是相同的

/**
 * spring扫描的候选组件
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Data
@SecondAnnotation
public class TestComponent {
    private String id = "@SecondAnnotation";
}

spring容器启动后,控制台打印的结果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c

TestComponent bean : TestComponent(id=@SecondAnnotation)

小结

本文介绍了spring中@Component元注解的简单使用,并通过示例说明了注解的继承和层次性功能。文章内容非常简单,只要对spring有所了解和入门,都不会有什么问题。

之所以把这些简单的内容拿出来写,一是给自己在写博客,或者说是记录学习笔记的路上开一个简单的头,二是将自己认为会的东西进行梳理,进一步理解,巩固自己的知识。

学习永远都不是一件简单的事情,可以有迷茫,可以懒惰,但是前进的脚步永远都不能停止。

不积跬步,无以至千里;不积小流,无以成江海;

相关文章
|
1月前
|
XML Java 数据格式
spring基础之常用组件
spring基础之常用组件
|
3月前
|
负载均衡 Java 开发者
【分布式】Spring Cloud 组件综述
【1月更文挑战第25天】【分布式】Spring Cloud 组件综述
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架(十六)Spring Boot及Dubbo zipkin 链路追踪组件埋点
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文第一部分为调用链、OpenTracing、Zipkin和Jeager的简述;第二部分为Spring Boot及Dubbo zipkin 链路追踪组件埋点
|
1天前
|
设计模式 Java 数据库连接
Spring Framework 6 中的设计模式
Spring Framework 6 中的设计模式
11 1
|
1月前
|
SpringCloudAlibaba Java 持续交付
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(一)基础知识+各个组件介绍+聚合父工程创建
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(一)基础知识+各个组件介绍+聚合父工程创建
79 1
|
1月前
|
Java 开发者 容器
【Java】深入了解Spring容器的两个关键组件
【Java】深入了解Spring容器的两个关键组件
10 0
|
1月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
1月前
|
负载均衡 Dubbo Java
Dubbo 挂载到 Spring Cloud 注册中心
【2月更文挑战第12天】Dubbo 挂载到 Spring Cloud 注册中心
26 7
|
2月前
|
Java 数据库 开发者
Spring注解大揭秘:@Component、@Service、@Repository详解
Spring注解大揭秘:@Component、@Service、@Repository详解
33 0
|
3月前
|
安全 Java Spring
springboot整合spring security 实现用户登录注册与鉴权全记录
【1月更文挑战第11天】springboot整合spring security 实现用户登录注册与鉴权全记录
80 2