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有所了解和入门,都不会有什么问题。

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

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

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

Spring Framework 组件注册 之 @Component的更多相关文章

  1. Spring Framework 组件注册 之 @Import

    Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...

  2. Spring Framework 组件注册 之 FactoryBean

    Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...

  3. spring注解-组件注册

    一.@Configuration+@Bean @Configuration:配置类==配置文件 @Bean:给容器中注册一个Bean:类型为返回值的类型,默认是用方法名作为id @Bean(" ...

  4. Spring笔记 - 组件注册

    @Bean:类注入容器 xml方式: <bean id="person" class="com.hrh.bean.Person"> <prop ...

  5. 一、Spring之组件注册-@Configuration&@Bean给容器中注册组件

    xml配置方式 首先我们创建一个实体类Person public class Person { private String name; private Integer age; private St ...

  6. Spring Framework 条件装配 之 @Conditional

    Spring Framework 条件装配 之 @Conditional 前言 了解SpringBoot的小伙伴对Conditional注解一定不会陌生,在SpringBoot项目中,Conditio ...

  7. 一步步从Spring Framework装配掌握SpringBoot自动装配

    目录 Spring Framework模式注解 Spring Framework@Enable模块装配 Spring Framework条件装配 SpringBoot 自动装配 本章总结 Spring ...

  8. Spring Boot之从Spring Framework装配掌握SpringBoot自动装配

    Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...

  9. 04 . Vue组件注册,数据交互,调试工具及组件插槽介绍及使用

    vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...

随机推荐

  1. WPF 窗体基类实现的体验及实现回车到下一控件

    原文:WPF 窗体基类实现的体验及实现回车到下一控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jsyhello/article/details ...

  2. 简明Python3教程 5.第一步

    介绍 我们现在来看看如何在Python中运行传统的”Hello world”程序.这会教你如何写.保存以及运行Python程序. 有两种办法来运行您的Python程序——使用交互式的解释器提示符或者源 ...

  3. WPF 线程:使用调度程序构建反应速度更快的应用程序

    原文:WPF 线程:使用调度程序构建反应速度更快的应用程序 作者:Shawn Wildermuth 原文:http://msdn.microsoft.com/msdnmag/issues/07/10/ ...

  4. Win10局域网内无法共享的解决方法分享(开启Server和ComputerBrowser服务,其它文章也不错)

    局域网共享是办公环境下经常使用的,而有些用户反应在升级到win10系统后,网络总是无法共享,给用户带来了很大的困扰,如果你也遇上这样的情况,并通过一些方法无较后,不妨尝试下小编提供的方法. 如果在Wi ...

  5. crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs

    1.开始 作者自己:开发人员,Asp.Net , html / js , restful , memcached , oracle ,windows , iis 目标读者:供自己以后回顾 2.我看No ...

  6. (转)react 使用 ref 报错 ,[eslint] Using string literals in ref attributes is deprecated. (react/no-string-refs)

    原文地址:https://www.cnblogs.com/gangerdai/p/7396226.html react 项目中给指定元素加事件,使用到 react 的 ref 属性,Eslink 报错 ...

  7. [转]完美解决)Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs

    一.文章前言    本文是亲测有效解决At least one JAR was scanned for TLDs yet contained no TLDs问题,绝对不是为了积分随便粘贴复制然后压根都 ...

  8. 食谱API自由和开放接口-为了发展自己的健康厨房APP应用

    什么时候健康厨房 (cook.yi18.net)上线后,基于接口的须要,就非常快就完毕的食谱API接口的开发 文档地址:http://doc.yi18.net/cookapidoc 菜谱食谱API , ...

  9. 就服务器项目部署debug谈谈自己的感受

    前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...

  10. DataTemplate

    DataTemplate作用是布局+数据绑定 使用DataTemplate 同时完成样式布局和数据绑定 <Window.Resources> <DataTemplate x:Key= ...