项目开发中,合理使用注解,可以提高开发效率。使我们更专注于业务逻辑的实现。
相较于传统的java应用,springboot应用只用添加一个@SpringBootApplication注解就可以成功运行,是不是简便很多。@SpringBootApplication注解主要由@Target、@Retention、@Documented、@Inherited、@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan等7个注解组成,前四个为创建注解类必须的(有需要了解的可以自查),其核心为后面3个注解。
@SpringBootApplication注解部分源码如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@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}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
点进去源码可以知道,其实为@Configuration。加上这个注解就是为了让当前类作为一个配置类交由 Spring的IOC容器进行管理。
由@AutoConfigurationPackage和@Import注解组成。
SpringBoot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories文件中注册的各种AutoConfiguration,当某个AutoConfiguration类满足@Conditional指定的生效条件时,实例化该AutoConfiguration类中定义的Bean,注入到Spring容器中,就可以完成依赖框架的自动配置。
@AutoConfigurationPackage注解的作用是将添加该注解的类所在的package作为自动配置package进行管理。
确保类被扫描到,然后被springboot容器自动装配。
定义 Spring 的扫描路径,等价于在 xml 文件中配置 context:component-scan,假如不配置扫描路径,那么 Spring 就会默认扫描当前类所在的包及其子包中的所有标注了 @Component,@Service,@Controller 等注解的类。
@Controller标识的类,该类代表控制器类(MVC中的C,控制层/表现层)。
这里控制层里面的每个方法,都可以去调用@Service标识的类(MVC中的V,业务逻辑层),@Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(MVC中的M,Dao层/持久层)。
@RestController 是@controller和@ResponseBody 的结合。
@Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。@ResponseBody 它的作用简单点说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其他Object,它会以Json字符串的形式返回给客户端。
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),所以只能发送POST请求。
将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区(响应体中),通常用来返回JSON数据或者是XML。
用在类定义处和方法定义处,就是来映射服务器访问的路径。
等价于@RequestMapping(value=“/*”,method=RequestMethod.GET)。
等价于@RequestMapping(value=“/*”,method=RequestMethod.POST)。
@PathVariable 映射URL绑定的占位符。通过@PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL中的{xxx}占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
@Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。
把请求中的指定名称的参数传递给控制器中的形参赋值。可设置必填非必填,默认值等等。
可以将请求头中变量值映射到控制器的参数中。
@GetMapping("/getUserInfo")
public R<User> getUserInfo(@RequestHeader(value = "token") String token) {
return null;
}
用来获取Cookie中的值。
@GetMapping("verify")
public ResponseEntity<UserInfo> verifyUser(@CookieValue("token") String token) {
// 获取token信息
UserInfo userInfo = JwtUtils.getInfoFromToken(token, prop.getPublicKey());
// 成功后直接返回
return ResponseEntity.ok(userInfo);
}
用于将对象存入spring的ioc容器中,一般用在方法上面。
定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理)。
在类上使用该注解,表示其是一个Service。加上该注解会将当前类自动注入到spring容器中。
@Repository和@Controller、@Service、@Component的作用差不多,都是把对象交给spring管理。@Repository用在持久层的接口上,这个注解是将接口的一个实现类交给spring管理。
@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作用域:基本作用域:singleton(单例)、prototype(多例);Web 作用域(reqeust、session、globalsession),自定义作用域。默认为单例作用域。
@Entity 注解用于类上面,用来指定该类是一个实体。
@Entity("userEntity")
@Table(name = "users")
public class User {
}
如果使用@Entity注解的name属性且没有与@Table结合,则默认将name属性的值转换成小写后作为表名称。
@Entity注解必须与@Id注解结合使用。
使构造函数、字段、设值方法或配置方法可以被Spring依赖注入工具自动装配(Autowired)。
@Qualifier 注解作用就是为了给Bean打上一个标记,用来查找bean。
@PropertySource注解用于指定资源文件读取的位置,它不仅能读取properties文件,也能读取xml文件,并且通过yaml解析器,配合自定义PropertySourceFactory实现解析yaml文件。
@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效。(就是以前写的springmvc.xml、applicationContext.xml)。
@Import注解,顾名思义,导入,即把类加入Spring IOC容器。
保证方法内多个数据库操作要么同时成功、要么同时失败。
在Spring里,我们可以使用@ControllerAdvice来声明一些全局性的东西。常用的方式是使用@ControllerAdvice+@ExceptionHandler的组合来实现全局自定义异常。
@ExceptionHandler注解我们一般是用来自定义异常的。
@ModelAttribute注解用于将方法的参数或方法的返回值绑定到指定的模型属性上,并返回给Web视图。
@InitBinder注解可以作用在被@Controller注解的类的方法上,表示为当前控制器注册一个属性编辑器,用于对WebDataBinder进行初始化,且只对当前的Controller有效。如:将前端传递过来的字符串格式的日期数据,转化为DATE类型。
注在实体类上,提供类的get、set、equals、hashCode、toString等方法。
注在实体类上,提供类的全参构造
注在实体类上,提供类的无参构造
注在实体类上,提供对应的 equals 和 hashCode 方法
注在实体类上,提供对应的 Logger 对象,变量名为 log
注在属性上,提供 set 方法
注在属性上,提供 get 方法
在实体类上指定,指定实体类和数据库表的映射关系。当实体类的类名在转成小写后和数据库表名相同时,可以不指定该注解。
@TableName("user");
用于指定实体类的某个属性为对应的数据表中的主键。
// value:指定对应表中的字段名,当声明的属性名和表中的字段名一致的时候可以省略不写。
// type:是主键的类型,AUTO代表的主键自增
@TableId(value = "id", type = IdType.AUTO);
private Integer id;
解决实体类中属性名和表中的字段名不一致(非驼峰),还有对象中的某个属性不在表中进行忽略。
// select表示不在查询结果中展示,value对应数据库字段名,fill表示自动填充,有INSERT,UPDATE等等,exist = false则表示该属性在数据库表中不存在
@TableField(select = false, value = "userName", fill = FieldFill.INSERT, exist = false)
@EnableScheduling开启对定时任务的支持。
@Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行。
cron表达式格式:
@Scheduled(cron = "{秒数} {分钟} {小时} {日期} {月份} {星期}")
cron表达式示例:
@Scheduled(cron = "0 00 07 * * *")
@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。
当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。
@Cacheable 的作用主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。
@CacheEvict来实现缓存的删除。
@ApiOperation(value = "清空缓存")
@CacheEvict(value = {"systemSetting"},key="#id.toString()",allEntries = true,beforeInvocation=true)
@GetMapping("/clearCache")
public ApiResult clearCache(){
ApiResult result = new ApiResult();
result.getData().put("result",redisUtils.clear());
return result;
}
@CachePut 的作用主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable不同的是,它每次都会触发真实方法的调用。
如果一个类中,多个方法都有同样的cacheName,keyGenerator,cacheManager 和 cacheResolver,可以直接使用@CacheConfig注解在类上声明,这个类中的方法都会使用@CacheConfig属性设置的相关配置。
json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JsonFormat注解是一个时间格式化注解,用于格式化时间。
@JsonInclude注解的作用是指定实体类在序列化时的策略。
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
// ...
}
@Async的作用就是异步处理任务。
开启异步线程。