Spring 注解的 整理+理解

注解(Annotations)列表

@SpringBootApplication

作用位置:@SpringBootApplication注解一般放在项目的一个启动类上,用来把启动类注入到容器中,用来定义容器扫描的范围,用来加载classpath环境中一些bean。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

SpringBoot的核心注解, 包含了 @ComponentScan、@Configuration 和 @EnableAutoConfiguration 注解。其中 @ComponentScan 让 spring Boot 扫描到 Configuration 类并把它加入到程序上下文。

@Configuration

作用位置:@Configration 注解:声明当前类是一个配置类,相当于 Spring 中的一个 XML 文件

声明当前类为配置类,相当于 xml 形式的 Spring 配置中的,该注解需要添加到类上。等同于spring 的 XML 配置文件,通过对 bean 对象的操作替代 spring 中 xml 文件。

@SpringBootConfiguration

该注解是@Configuration 注解的派生注解,跟@Configuration注解的功能一致,标注这个类是一个配置类,只不过@SpringBootConfiguration 是 springboot的注解,而@Configuration 是 spring 的注解

@EnableAutoConfiguration

**作用位置:**一般用于启动类,SpringBootApplication天然集成了 @EnableAutoConfiguration 注解

@EnableAutoConfiguration作用:开启自动装配功能

帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot,并创建对应配置类的Bean,并把该Bean实体交给IoC容器进行管理。

@ComponentScan

**作用:**组件扫描

可自动发现和装配一些 Bean,注解在方法上或者注解上,扫描包的注解。

@Component

**作用:**表示为一个组件

**位置:**需要注册到spring中的公共类上

可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。(把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>

@AutoConfigurationPackage

@AutoConfigurationPackage 注解,自动注入主类下所在包下所有的加了注解的类(@Controller,@Service 等),以及配置类(@Configuration)

@ConfigurationPropertiesScan

作用:@ConfigurationPropertiesScan 扫描配置属性,@EnableConfigurationProperties 注解的作用是使用 @ConfigurationProperties 注解的类生效。

@EnableConfigurationProperties

**作用:**让使用了 @ConfigurationProperties 注解的类生效。

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次性全部注入。

@ConfigurationProperties

**作用:**spring-boot 提供该注解将配置文件的值映射到类上使用。

当我们使用application.properties/yml文件配置Thymeleaf时,就相当于操作Thymeleaf对应的配置文件类中的属性,
当配置spring.thymeleaf.encoding=XXX时就相当于给以下文件中的编码属性赋值。源码中的:
在这里插入图片描述

@AutoConfigureAfter

它是 spring-boot-autoconfigure包下的注解,
**作用:**顾名思义,就是将一个配置类在另一个配置类之后加载。
例如:

@AutoConfigureAfter (AAAA.class)
public class CCCC {
}

配置 CCCC 将会在 AAAA 之后加载

@AutoConfigureBefore

同样的,和以上相反。

元注解

@Target({ElementType.TYPE})

用于描述注解的使用范围(即:被描述的注解可以用在什么地方,比如说在类、方法、构造器、属性等等),ElementType有以下参数类型:

参数类型范围说明
TYPE类、接口(包括注释类型)或枚举声明
FIELD字段声明(包括枚举常量)
METHOD使用在方法上声明
PARAMETER参数声明
CONSTRUCTOR使用在构造器上声明
LOCAL_VARIABLE使用在局部变量上声明
ANNOTATION_TYPE使用在注解上声明
PACKAGE包声明
TYPE_PARAMETER注解可以用于类型参数声明(JDK1.8)
TYPE_USE类型使用声明(JDK1.8)

@Retention

表示在什么级别保存该注释信息,用于描述注解的生命周期。(SOURCE<CLASS<RUNTIME)

参数类型说明
SOURCEAnnotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了
CLASS编译器将Annotation存储于类对应的.class文件中。默认行为
RUNTIME编译器将Annotation存储于class文件中,并且可由JVM读入

@Document

说明该注解被包含在javadoc中,是否生成文档注释。类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。

定义 Annotation 时,@Documented 可有可无;若没有定义,则 Annotation 不会出现在 javadoc 中。

@Inherited

说明子类可以继承父类中的该注解。

使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation。

定义 Annotation 时,@interface 是必须的。
注意:它和我们通常的 implemented 实现接口的方法不同。Annotation 接口的实现细节都由编译器完成。通过 @interface 定义注解后,该注解不能继承其他的注解或接口。

Spring配置相关以及注入Bean对象注解

@Import

用来导入其他配置类。注解在类上,引入其他的配置类,类似于bean标签中的ref

@ImportResource

用来加载 xml 配置文件。

@Bean

注解在方法上,声明当前方法的返回值为一个 Bean 对象,该对象会被添加 SpringIOC容器中。和标签作用的相同。Bean 的实例名称由 @Qualifier 注解的参数指定。这个方法的名字就相当于bean标签的id属性,返回值就相当于bean标签中的class属性。

@Value

注入 Spring boot application.properties 配置的属性的值。

例如:

在这里插入图片描述

@Repository

**@Repository的作用:**这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

使用 @Repository 注解可以确保 DAO 或者 repositories 提供异常转译,这个注解修饰的 DAO 或者 repositories 类会被 ComponetScan 发现并配置,同时也不需要为它们提供 XML 配置项。其功能与 @Component 相同。

@Repository和@Controller、@Service、@Component的作用差不多,都是把对象交给spring管理。

@Repository用在持久层的接口上,这个注解是将接口的一个实现类交给spring管理。

为什么有时候我们不用@Repository来注解接口,我们照样可以注入到这个接口的实现类呢?

1、spring配置文件中配置了MapperScannerConfigurer这个bean,它会扫描持久层接口创建实现类并交给spring管理。

2、接口上使用了@Mapper注解或者springboot中主类上使用了@MapperScan注解,和MapperScannerConfigurer作用一样。

注:不使用@Repository注解,idea会报警告,提示找不到这个bean,直接忽略即可。

在这里插入图片描述

@Service

通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

@Controller

通常作用在控制层(如 Spring MVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

@RestController

此注解是 @Controller 和 @ResponseBody 的合集, 表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,,是 REST 风格的控制器。

@JsonBackReference

解决嵌套外链问题。不常用具体可以看这篇博客

@Scope

设置作用域,标注在类上,等价于在配置文件中bean中的作用域配置。
<bean id="person" class="com.oldou.pojo.Person" scope="singleton"/>

Bean对象依赖注入注解

@Inject

等价于默认的 @Autowired,只是没有 required 属性;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
    boolean optional() default false;
}

@Autowired

自动装配,通过类型byType。如果不能唯一自动装配,那么就需要通过@Qualifier(value=“xxx”)

@Qualifier

当有多个同一类型的 Bean 时,可以用 @Qualifier(“name”) 来指定。与 @Autowired 配合使用。@Qualifier 限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者,具体使用方式如下:

@Autowired
@Qualifier(value = “demoInfoService”)
private DemoInfoService demoInfoService;

@Resource(name=”name”,type=”type”)

没有括号内内容的话,默认 byName。与 @Autowired 干类似的事(自动装配)。

@Nullable

字段标记了这个注解,说明了这个字段允许为null。

SpringMVC相关注解

RequestMapping

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。
可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

例子:具体到某个页面

在这里插入图片描述

@GetMapping

它是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式,只能处理 Get 类型请求。

在这里插入图片描述

@PostMapping

它是@RequestMapping(method =RequestMethod.POST) 的一个快捷方式,只能处理 Post 类型请求。

在这里插入图片描述

@PutMapping

@PutMapping 注解是@RequestMapping(method = RequestMethod.PUT)的缩写。

@DeleteMapping

@DeleteMapping 注解是@RequestMapping(method = RequestMethod.DELETE)的缩写。

在这里插入图片描述

@RequestParam

将请求参数绑定到控制器的方法参数上.
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

在这里插入图片描述

@ResponseBody

表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用,用于构建 RESTful 的 api。

在RestController中,我们可以看到里面包括了ResponseBody,这里的ResponseBody就是为了让前台返回的数据为json格式的字符串。

在这里插入图片描述

@RequestBody

用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)。
@RequestBody 注解可以将 JSON 格式的数据转为 Java 对象。
但是要求 content-type 不是默认的 application/x-www-form-urlcoded 编码的内容。一般情况下来说常用其来处理application/json 类型。
在这里插入图片描述

@PathVariable(“xxx”)

获取参数。通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) ,例如:
@RequestMapping(value=”user/{id}/{name}”)
请求路径:http://localhost:8080/hello/show5/1/james

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三横同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值