Spring常用注解
spring常用注解
容器
@Controller:控制层,里面有多个连接
@RestController:注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,返回json字符串的数据,是REST风格的控制器。
@Service:业务层,一般对于接口和实现,声明是一个业务处理类(实现类非接口类)
@Repository:一般的dao层,声明是一个数据库或其他NoSql访问类(实现类非接口类)
@Component:定义其它组件(比如访问外部服务的组件),声明此类是Spring管理类,常用在无法用@Service、@Repository描述的Spring管理类上,相当于通用的注解
@Bean:声明该方法返回结果是一个Spring容器管理的Bean,包含@PostConstruct和@PreDestroy
依赖注入
@Qualifier:如果一个接口有多个实现,那么注入时候加上唯一标示,为Bean指定名称,随后再通过名字引用Bean
@Primary:当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。
@Autowired:自动注入依赖,@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
@Resource:bean的注入,同Autowired有相同的功能。
- 共同点:@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
- 不同点:@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分别是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Inject:等价于默认的@Autowired,只是没有required属性。
参数
@RequestMapping:绑定url,用在类上,表示所有响应请求的方法都是以该地址作为父路径。等价于@GetMapping/@PostMapping/@PutMapping/@DeleteMapping。
@PathVariable:获取参数,将URL获取参数,映射到方法参数上。支持包含[./+]等特殊符,例:
@RequestMapping(value = {"/getImage/{key:.*}"}, method = {RequestMethod.GET/POST})
@RequestParam(value="" required=false):绑定参数,将客户端请求中的参数值映射到相应方法的参数上;
@ModelAttribute:一般用于controller层,被注解的方法会在所以mapping执行之前执行,并且可以绑定参数到Model model里面。
@ResponseBody:将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式(Json/xml)后,写入到Response对象的body数据区。
@RequestBody:用来处理'Content-Type:application/json,application/xml'等,意味着HTTP消息是JSON,需转化为指定类型参数
RequestBody和ModelAttribute区别:用来注解解析前端发来数据
@ModelAttribute注解的实体类接收前端发来的数据格式需要为"x-www-form-urlencoded"。
@RequestBody注解的实体类接收前端的数据格式为JSON(application/json)格式。(若是使用@ModelAttribute接收application/json格式,虽然不会报错,但是值并不会自动填入)
@MatrixVariable:矩阵参数,要开启MatrixVariable功能的话,必须设置RequestMappingHandlerMapping中的removeSemicolonContent为false。一般情况不用你手动去设置这个属性,因为默认就是false。
@RequestMapping("/test/{father}/{son}")
@ResponseBody
public Map MatrixVariable(@MatrixVariable(value = "age", pathVar = "father") Integer father,
@MatrixVariable(value = "age", pathVar = "son") Integer son,
@PathVariable("father") String path1,
@PathVariable("son") String path2){
Map<String, Object> map = new HashMap<>();
map.put("爸爸的年龄", father);
map.put("儿子的年龄", son);
map.put("路径1: ", path1);
map.put("路径2: ", path2);
return map;
}
## url请求地址:http://localhost:8080/test/father;age=35/son;age=6
@Transactional(readOnly=true):注解式事务
@TransactionalEventListener:用于配置事务的回调方法,可以在事务提交前、提交后、完成后以及回滚后几个阶段接受回调事件。
@Value("${}"):可以注入properties里面的配置项。
@Value("#{'${delay-time}'.split(',')}")
List<String> delayTime;
@InitBinder:一般用于controller 可以将所以form 讲所有传递进来的string 进行html编码,防止xss攻击,比如可以将字符串类型的日期转换成date类型
@EnableCaching:注解自动化配置合适的缓存管理器。
@EnableWebSecurity:注解开启spring security的功能,集成websercrityconfigureadapter。
@DependsOn:可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象
@ResponseStatus:可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,可以使用HttpStatus类对该注解的value属性进行赋值。
@Scope:用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围。@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。
@Order:Spring容器加载Bean的顺序,值越小越优先加载。
@Profile:切换环境变量。加载指定配置文件时才起作用。
全局异常处理
@ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
@ExceptionHandler(Exception.class):用在controller方法上面表示遇到这个异常就执行以下方法。
SpringBoot
@SpringBootApplication:申明让springboot自动给程序进行必要的配置,相当于@Configuration,@EnableAutoConfiguration和@ComponentScan三个注解合用。
@EnableAutoConfiguration:spring boot自动配置,尝试根据你添加的jar依赖自动配置你的spring应用。
@ComponentScan:表示将该类自动发现并注册bean 可以自动收集所有的spring组件,包括@Component下的子注解@Service,@Repository,@Controller
@Configuration:相当于传统的xml配置文件,声明此类是一个配置类,常与@Bean配合使用
@SpringBootConfiguration:@Configuration注解的变体,只是用来修饰是Spring Boot配置而已,或者可利于Spring Boot后续的扩展。
@Import:导入其他配置类,通过导入的方式实现把实例加入springIOC容器中。可以在需要时将没有被Spring容器管理的类导入至Spring容器中。
@ImportResource:用来加载xml配置文件,和@Import类似,区别就是@ImportResource导入的是配置文件。
@EnableConfigurationProperties:开启@ConfigurationProperties注解
@ConfigurationProperties(prefix = "spring.datasource"):注入yml/properties配置文件属性,把同类的配置信息自动封装成实体类,可以使属性文件中的值和类中的属性对应起来;
使用方式有两种:
- 在类上使用该注解
- 在工厂方法上使用该注解(@bean)
注意:在springBoot中除了使用这个注解读取属性文件值外,还可以用@Value注解。
@Conditional:@Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。
@ConditionalOnBean:仅在当前上下文中存在某个bean时,才会实例化这个Bean。
@ConditionalOnMissingBean:仅在当前上下文中不存在某个bean时,才会实例化这个Bean。
@ConditionalOnClass:某个class位于类路径上,才会实例化这个Bean。
@ConditionalOnMissingClass:某个class在类路径上不存在的时候,才会实例化这个Bean。
@ConditionalOnExpression:当表达式为true的时候,才会实例化这个Bean。
@ConditionalOnProperty:当指定的属性有指定的值时才开启配置
@ConditionalOnWebApplication:是web应用时才会实例化这个Bean。
@ConditionalOnNotWebApplication:不是web应用时才会实例化这个Bean。
@ConditionalOnJava:当运行的Java JVM在指定的版本范围时才开启配置。
@ConditionalOnResource:当类路径下有指定的资源才开启配置。
@ConditionalOnJndi:当指定的JNDI存在时才开启配置。
@ConditionalOnCloudPlatform:当指定的云平台激活时才开启配置。
@@ConditionalOnSingleCandidate:当指定的class在容器中只有一个Bean,或者同时有多个但为首选时才开启配置。
@AutoConfigureAfter:在某个bean完成自动配置后实例化这个bean。
@AutoConfigureBefore:在某个bean完成自动配置前实例化这个bean。
@ConditionalOnProperty(prefix="spring.datasource", name="enabled", havingValue="true"):控制配置开关的
@AutoConfigureOrder:用于确定配置加载的优先级顺序。
SpringCloud
@SpringCloudApplication:包含@SpringBootApplication、@EnableDiscovertyClient和@EnableCircuitBreaker。分别是SpringBoot注解、注册服务中心Eureka注解、断路器注解。对于SpringCloud来说,这是每一微服务必须应有的三个注解,所以才推出了@SpringCloudApplication这一注解集合。
@EnableDiscoveryClient:注册应用为Eureka客户端应用,以获得服务发现的能力
@EnableAdminServer:使用admin监控应用。
@EnableEurekaClient:配置本应用将使用服务注册和服务发现,注意:注册和发现用这个注解。
@EnableEurekaServer:用在springboot启动类上,表示这是一个eureka服务注册中心;
@EnableHystrix:表示启动断路器,断路器依赖于服务注册和发现。
@HystrixCommand:注解方法失败后,系统将西东切换到fallbackMethod方法执行。指定回调方法
@FeignClient:注解中的fallback属性指定回调类
@SpringQueryMap:Feign的Get传参方式
@FeignClient("demo")
public interface DemoTemplate {
@GetMapping(path = "/demo")
String demoEndpoint(@SpringQueryMap Params params);
}
注意:1、@SpringQueryMap可以转换POJO和Map参数,仅支持基本类型,如JSONObject的属性就无法转换。可以自定义QueryMapEncoder来进行转换。
2、@SpringQueryMap仅支持本类,不解析父类的字段。解决如下:配置请求端的Feign,加强SpringQueryMap解析
@Configuration
public class FeignConfiguration {
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder()
.queryMapEncoder(new BeanQueryMapEncoder())
.retryer(Retryer.NEVER_RETRY);
}
}
在Feign加载该配置
@FeignClient(value = "test", configuration = FeignConfiguration.class)
@CrossOrigin:可以处理跨域请求,让你能访问不是一个域的文件;
@RefreshScope:如果代码中需要动态刷新配置,在需要的类上加上该注解就行。但某些复杂的注入场景下,这个注解使用不当,配置可能仍然不动态刷新;
@FeignClient:springboot调用外部接口:声明接口之后,在代码中通过@Resource注入之后即可使用。常用属性如下:
- name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
- url: url一般用于调试,可以手动指定@FeignClient调用的地址decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
- configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contractfallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
- fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码path: 定义当前FeignClient的统一前缀
@EnableFeignClients:开启Spring Cloud Feign的支持
@EnableCircuitBreaker:开启断路器功能
@LoadBalanced:开启客户端负载均衡
@WebAppConfiguration:开启Web 应用的配置,用于模拟ServletContext
@RibbonClient:这个注解用来为负载均衡客户端做一些自定义的配置,可以进一步配置或自定义从哪里获取服务端列表、负载均衡策略、Ping也就是服务鉴活策略等等
@EnableConfigServer:用在启动类上,表示这是一个配置中心,开启Config Server;
@EnableCaching:注解自动化配置合适的缓存管理器。
@EnableWebSecurity:注解开启spring security的功能,集成websercrityconfigureadapter。
@EnableAdminServer:使用admin监控应用。
@JsonBackReference:解决嵌套外链问题。
@RepositoryRestResource:配合spring-boot-starter-data-rest使用
@EnableAsync:可以异步执行,就是开启多线程的意思。可以标注在方法、类上。
@Async:所修饰的函数不要定义为static类型,这样异步调用不会生效
mybatis
@Mapper:将mapper接口注册到容器中,在编译之后会生成相应的接口实现类
@MapperScan:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
- @Select/@SelectProvider:查询
- @Delete/@DeleteProvider:删除
- @Insert/@InsertProvider:插入
- @Update/@UpdateProvider:更新
Provider用于动态SQL
@Options(useGeneratedKeys = true,keyColumn = "id"):指定表的自增主键并自动绑定到实体类对象
@Result:修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
@Results:用于填写结果集的多个字段的映射关系。
@ResultMap:根据ID关联XML里面
JPA
@Entity(@Table(name=""):表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略
@MappedSuperClass: 用在确定是父类的entity上。父类的属性子类可以继承。
@NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。
@Column:如果字段名与列名相同,则可以省略。
@Id:表示该属性为主键。
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "repair_seq"):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
@SequenceGenerator(name = "repair_seq", sequenceName = "seq_repair", allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。
@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JoinColumn(name="loginId"):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
@OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。
lombok
@EqualsAndHashCode:实现equals()方法和hashCode()方法
@ToString:实现toString()方法
@Data:注解在类上;提供类所有属性的getting和setting方法,此外还提供了equals、canEqual、hashCode、toString方法
@Setter:注解在属性上;为属性提供setting方法
@Getter:注解在属性上;为属性提供getting方法
@Log4j:注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@RequiredArgsConstructor:会生成一个包含常量,和标识了NotNull的变量的构造方法。生成的构造方法是私有的private。
@Service
@RequiredArgsConstructor
public class MessageServiceImpl implements MessageService {
final PushService pushService;
final AdminService adminService;
}
@Cleanup:关闭流
@Synchronized:对象同步
@SneakyThrows:抛出异常
swagger
@ApiOperation:首先@ApiOperation注解不是Spring自带的,它是是swagger里的注解@ApiOperation是用来构建Api文档的@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”;