SpringBoot常用注解

背景:

使用springboot 可以快速搭建一个项目,springboot基于“习惯大于配置”理念,以前很多配置文件都可以不写。取而代之的是相应的注解。不清楚某个注解的作用,有时让一个简单的功能“卡住”半天;相应的,灵活运用springboot的注解,会使我们的开发事半功倍。

1.@Configuration

解释:申明在类名上,表示当前类是一个配置类。配置类表示从application.yml配置文件中得到相应的配置值。

2.@ConfigurationProperties(prefix = “global”)

解释:申明在类名上,prefix对应配置文件中声明的前缀。

示例:
在这里插入图片描述

点睛:

@Configuration和@ConfigurationProperties(prefix = “global”)一般一起使用,前者表示这个类是一个配置类,告诉电脑你要到springboot的resources文件夹下的application.yml下去找东西;后者就通过这个前缀找到对应配置文件中这个前缀下的所有属性。我们在配置类中声明一个变量,变量名和配置文件中一致,添加get 、set方法。
测试及使用:

//依赖注入
@Autowired
	private ConsumeOrderService consumeOrderService;
//得到配置文件中的属性
applicationConfiguration.getTmpDir();
3.@Autowired

解释:一般申明在controller层的类名下,或测试类的类名下。依赖注入,将spring管理的bean(实体对象)拿出来用

4. @Resource

解释:用法和@Autowired完全一致,二者可以相互替换。
区别1是:@Resource注解是java jdk提供的注解,@Autowired是spring框架提供的注解。一般推荐使用@Resource注解,由于是jdk原生注解,可以减少和spring框架的耦合。
区别二是:byname注入bean时(bytype注入相同,在注解下方添加实体名就可以),
@Resource(name = “userService”); @Autowired@Qualifier(“userService”)


5.@Qualifier(“userService”)

解释:一般紧跟在@Autowired后面,表示byname注入,name值在控制反转处声明。
示例:
在这里插入图片描述

6. @Repository,@Service,@Controller,@Component

解释:分别对应在dao层,service层,controller层及其他不层,注解名不同,效果相同。即使用控制反转将实体交给spring容器管理,也可以在配置文件中使用bean的方式配置。配置文件和上面注解是并列关系,是实现控制反转的两种不同的方式。

点睛:

控制反转:

所谓控制反转,就是把对象的管理教给Spring,在要使用时通过依赖注入的时候使用。在项目上的体现是类名上方通过添加 @Repository,@Service,@Controller,@Component 等注解的方式实现,或者在spring.xml配置文件的<bean></bean>标签里面声明。基于配置文件和注解是实现控制反转的两种方式!

依赖注入:

使用@Autowired ,@Resource注解把Spring管理的对象拿出来使用。

bean:

很多时候会报一个创建bean失败的错误,bean是什么?我的理解bean就是一个Spring管理的对象实体。比如你的userDao通过添加@Repository注解,交给Spring管理,那么userDao就是一个bean;userService通过添加@Service注解,交给Spring管理,那么userService也是一个bean。所以bean并不是确指某一个对象,而是泛指某一类对象。

在这里插入图片描述
为什么会报这个错误?根据日志就是说 创建一个名字叫XXX的bean失败了,为什么会失败?一般有一下几个原因:

1.更改了启动类Application的目录位置,默认扫描不到。可以详见注解8
2.控制反转的对象没有使用配置文件声明,也没有使用注解声明。这种情况一般在对应的controller层,service层,dao层或其他要Spring管理的对象加上@Repository,@Service,@Controller,@Component注解就好了。(在Spring.xml文件中配置<bean></bean>标签也可以实现,但习惯使用配置文件的人已经越来越少了。理由也很直观——一个注解就能搞定为什么要在配置文件中写半天?)
3.mapper.xml文件中语法不对。我有一次就是报了一个创建bean失败的错误,找了半天,该扫描的扫描了,该声明的声明了,为什么还是创建不了呢。后来发现是mapper.xml文件中sql语句的中文注释没有注释,由于是在配置文件中写的,中文没有注释编译也没有报错,运行的时候一直给我报bean创建错误!后来把中文注释掉就好了。所以说编程的时候大家一定要细心。
7.@MapperScan(basePackages={“com.zym.sc.user.dao”})

解释:集成mybatis的注解,添加在springboot项目入口类(Application类)上,项目启动时扫描加载basePackage后目录文件。使用注解实现动态代理时需要添加,否则mapper文件夹下的sql文件无法找到dao层接口。

抛出异常:
A component required a bean of type 'com.shanda.sc.usermsg.dao.UserInfoMsgDao' that could not be found.

异常原因:虽然你在sqlMap.xml的<mapper namespace="com.zym.sc.user.dao.UserInfoDao>中声明了这个mepper文件对应那个dao接口,但这个接口没有找到。此时在项目入口类上加上此注解,问题解决。

8.@ComponentScan(basePackages = {“com.example.demo”})

解释:添加在springboot项目入口类上,扫描整个项目,加载资源。和spring.xml配置文件中<context:component-scan base-package=“com.zym.sc.user”>标签作用相同

注意:Application启动类文件目录时,必须添加这个注解,否则无法找到资源。 启动项目报错bean找不到。如图2,比较图1,我在Application类前面加了一个main文件夹,就必须添加此注解。
原因:Application类在启动时默认会扫描加载Application类所在文件夹下的资源,手动添加了一个main文件夹后资源就找不到了。
解决:添加@ComponentScan(basePackages = {"com.example.demo"})注解,并添加需要扫描的资源路径。

在这里插入图片描述

图1

在这里插入图片描述

图2

9.@PathVariable

解释:添加在controller层方法体中的参数前。方法中的参数匹配url中的变量。
注意事项:

浏览器访问资源错误示范(404):localhost:8080/showUserMessage/userId=1/msgId=1
浏览器访问资源正确示范:localhost:8080/showUserMessage/1/1

在这里插入图片描述

spring核心功能之二:AOP——面向切面编程

10.@Aspect

解释:声明在类名上,创建切面。

11.@Pointcut

解释:声明在方法名上,创建切入点

12.@Before, @After,@AfterRunning,@AfterThrowing,@Around

解释:五大通知类型。告诉程序创建了切面之后你让他干什么,程序用怎样的方式去告诉你结果,一共定义了这五种方式。
@Before: 前置通知, 在方法执行之前执行
@After: 后置通知, 在方法执行之后执行
@AfterRunning: 返回通知, 在方法返回结果之后执行
@AfterThrowing: 异常通知, 在方法抛出异常之后
@Around:环绕通知,围绕着方法执行

自定义注解:

引申:自定义注解用到的元注解,是jdk自身提供的,不属于springboot注解的范畴。

13.@Retention

解释:元注解(定义注解的注解,称为元注解)。@Retention注解里面有一个属性value,是RetentionPolicy类型的, RetentionPolicy是一个枚举类型。
按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS: 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。

eg:自定义系统日志注解(@System)
在这里插入图片描述

14.@Target

解释:元注解,表示自定义的注解可以修饰在什么地方
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解


总结:

使用SpringBoot可以快速搭建项目,基于“习惯优于配置”的理念,理论上可以实现零配置文件。实现零配置的方式是采用注解的方式替代了配置文件的功能,所以配置文件和springboot提供的注解是并列的关系,注解可以替代配置文件;配置文件也可以替代注解。注解在简化配置的同时也给初学者带来了一定的障碍,“知其然而不知其所以然”,知道这个注解在这里用,但不知道为什么会这样用。不利于我们开发环境的搭建,系统优化,bug的定位。工作中对比配置文件中标签的用法可以很好的理解注解的含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值