Spring Boot 常用注解
常见注解
1. @SpringBootApplication 申明让spring boot自动给程序进行必要的配置,
等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan
2. @Configuration 相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,
获取到系统环境变量和application配置文件中的变量
3. @EnableScheduling 在 Spring Boot 的配置类中,标注上这个注解,就可以对项目中的方法某些方法使用@Schedule注解,将其变为定时自动执行。
但只有两种注解共同使用时,才能达到本注解应有的作用。
4. @Qualifier 限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
5. @ImportResource 用来加载xml配置文件。
6. @Autowired 自动导入依赖的bean
7. @RestController 返回json字符串的数据,直接可以编写RESTFul的接口
8. @ComponentScan 表示将该类自动发现(扫描)并注册为Bean,可以自动收集所有的Spring组件,
包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。
如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的使用了@Service,@Repository等注解的类。
9. @ServletComponentScan spring能够扫描到自己编写的servlet和filter,
SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener,
可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码
10. @Import({DynamicDataSourceRegister.class}) 注册动态多数据源
11. @PropertySource(value = “classpath:spring/config.properties”)
通过@PropertySource注解将properties配置文件中的值存储到Spring的 Environment中,Environment接口提供方法去读取配置文件中的值,
参数是properties文件中定义的key值。上面是读取一个配置文件,如果你想要读取多个配置文件,请看下面代码片段
@PropertySource(value = {“classpath:spring/config.properties”,”classpath:spring/news.properties”})
12. @EnableWebSocketMessageBroker 表示开启使用STOMP协议来传输基于代理的消息,Broker就是代理的意思。
13. @Repository
@Repository、@Service、@Controller,它们分别对应存储层 Bean,业务层 Bean,和展示层 Bean,将类标识为 Bean;
分别用于软件系统的不同层次:
@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
@Service 通常作用在业务层,但是目前该功能与 @Component 相同。
@Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,
并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,
其使用方式与 @Repository 是完全相同的。
14. @Value(“${spring.datasource.url}”) 获取 application 配置文件中的变量
15. @ConfigurationProperties 读取application属性配置文件中的属性
16. @ControllerAdvice 全局异常处理类,以将对于控制器的全局配置放在同一个位置。
· 注解了@Controller的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
· ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
· ExceptionHandler:用于全局处理控制器里的异常。
· InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
· ModelAttribute:本来作用是绑定键值对到Model中,此处让全局的@RequestMapping都能获得在此处设置的键值对。
17. @WebFilter 将一个实现了javax.servlet.Filter接口的类定义为过滤器
· 属性filterName声明过滤器的名称,可选
· 属性urlPatterns指定要过滤的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
18. @Service
· 声明类是一个 bean,其他的类才可以使用 @Autowired 将其作为一个成员变量自动注入
· Zoo.java 在 bean 中的 id 是 “zoo”,即类名且首字母小写
19. @Scope(“prototype”) Spring默认产生的bean是单例的,”prototype” 表示原型即每次都会new一个新的出来
20. @Bean标注在方法上(返回某个实例的方法),作用为注册bean对象
· @Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
· @Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
· 既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service、@Ripository等
注解注册bean,当然需要配置@ComponentScan注解进行自动扫描。
RestController 相关
1. @RestController 返回json字符串的数据,直接可以编写RESTFul的接口,@ResponseBody和@Controller的合集
2. @PathVariable 当使用@RequestMapping URI template 样式映射时,即 someUrl/{paramId},
这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上
3. @RequestHeader 可以把Request请求header部分的值绑定到方法的参数上如(@RequestHeader("Accept-Encoding") String encoding){}。
4. @CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上如(@CookieValue("JSESSIONID") String cookie){}。
5. @RequestParam
· 常用来处理简单类型的绑定,通过 Request.getParameter() 获取的String可直接转换为简单类型的情况
( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);
因为使用request.getParameter()方式获取参数,所 以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;
· 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
· 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;
6. @RequestBody 通过使用HandlerAdapter默认配置的HttpMessageConverters来解析Request请求的Body部分数据并将相应的数据绑定到Controller中方法的参数上,其常用来处理Content-Type不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等。
· 它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
· 因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用。
7. @SessionAttributes 用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。
该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象
8. @ModelAttribute 该注解有两个用法,一个是用于方法上,一个是用于参数上:
· 用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
· 用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
· @SessionAttributes 启用的attribute 对象上;
· @ModelAttribute 用于方法上时指定的model对象;
· 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中,
这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account)
9. @Controller 用于定义控制器类,控制器负责将用户发来的URL请求转发到对应的服务接口(service层),
一般这个注解在类中,通常方法需要配合注解@RequestMapping
JPA 相关
1. @Entity 注释声明该类为持久类,最好实现序列化,此时,默认情况下,所有的类属性都为映射到数据表的持久性字段
2. @Table(name=”“,catalog=”“,schema=”“) 持久性映射的表,通常和@Entity 配合使用,只能标注在实体的 class 定义处,
表示实体对应的数据库表的信息。
· name - 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
· catalog - 可选,表示Catalog名称,默认为 Catalog(“”).
· schema - 可选 , 表示 Schema 名称 , 默认为Schema(“”).
3. @Id 注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
4. @GeneratedValue 定义自动增长的主键的生成策略.
5. @Transient 将忽略这些字段和属性,不用持久化到数据库.
6. @Temporal(TemporalType.TIMESTAMP) 声明时间格式
7. @Enumerated 声明枚举
8. @Version 声明添加对乐观锁定的支持
9. @OneToOne 可以建立实体bean之间的一对一的关联
10. @OneToMany 可以建立实体bean之间的一对多的关联
11. @ManyToOne 可以建立实体bean之间的多对一的关联
12. @ManyToMany 可以建立实体bean之间的多对多的关联
13. @Formula 一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)
14. @OrderBy Many端某个字段排序(List)
15. @Column注解设置,包含的设置如下
· name:字段名
· unique:是否唯一
· nullable:是否可以为空
· inserttable:是否可以插入
· updateable:是否可以更新
· columnDefinition: 定义建表时创建此列的DDL
· secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
16. @JoinColumn(name = “”, referencedColumnName = “”) 设置对应数据表的列名和引用的数据表的列名
17. @Lob 注解属性将被持久化为 Blog 或 Clob 类型,根据get方法的返回值不同,自动进行Clob和Blob的转换。
因为这两种类型的数据一般占用的内存空间比较大,所以通常使用延迟加载的方式,与@Basic标记同时使用,设置加载方式为FetchType.LAZY。
· Clob(Character Large Ojects)类型是长字符串类型,具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 Clob 类型。
· Blob(Binary Large Objects)类型是字节类型,具体的java.sql.Blob, Byte[], byte[] 和 serializable type 将被持久化为 Blob 类型。
18. @Basic
实体Bean中所有的非Static 非transient的属性都可以被持久化,没有定义注解属性的等价于在其上添加了@Basic注解。
通过@Basic注解可以声明属性的获取策略(lazy与否),默认的是即时获取(early fetch)。
通常不需要对简单属性设置延迟获取,如需要定义@Basic(fetch=FetchType.LAZY)
在MySQL中没有Clob,用Text代替了,而且分为了tinytext, text,mediumtext,longtext。Blob也按这种方式分成了四种。
19. @Transactional注解
· rollbackFor 表示当该方法中抛出指定的异常时数据回滚
· dontRollbackOn 表示当该方法中抛出指定的异常时数据不回滚
hibernate-validator
1. @size (min=3, max=20, message=”用户名长度只能在3-20之间”)
2. @size (min=6, max=20, message=”密码长度只能在6-20之间”)
3. @pattern (regexp=”[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,4}”, message=”邮件格式错误”)
4. @Length(min = 5, max = 20, message = “用户名长度必须位于5到20之间”)
5. @Email(message = “比如输入正确的邮箱”)
6. @NotNull(message = “用户名称不能为空”)
7. @Max(value = 100, message = “年龄不能大于100岁”)
8. @Min(value= 18 ,message= “必须年满18岁!” )
9. @AssertTrue(message = “bln4 must is true”)
10. @AssertFalse(message = “blnf must is falase”)
11. @DecimalMax(value=”100”,message=”decim最大值是100”)
12. @DecimalMin(value=”100”,message=”decim最小值是100”)
13. @NotNull(message = “身份证不能为空”)
14. @Pattern(regexp=”^(\d{18,18}|\d{15,15}|(\d{17,17}[x|X]))$”, message=”身份证格式错误”)
@Service VS @Bean 和 @Configuration
@Service实际上表示了DDD中的无状态的,独立的,以接口的形式提供的一个操作。采用@Bean和@Configuration配合的方式,Bean的创建交给了单独的类,而Service的标识给了Java中的Interface以及类的名字。这点在Spring Data也有所体现,比如Repository就是通过名字来标识,如CrudRepository。因此Service也通过名字来体现。具体层次定义,通过名字而不依赖Spring提供的注解,便于根据项目提供更多的层次,比如Mapper层,Validator层等。另外,本身Bean和Service就是两个维度的概念。一个关于具体实现,另一个关于DDD中的概念。使用@Bean的方式,能够创建库里面的类的实例。如果使用@Service的方式,没办法在库里面对应的类上添加@Service注解。
@Resource、@Autowired、@Qualifier 区别
@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的:
1. @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
2. @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
3. @Resource注解是又J2EE提供,而@Autowired是由Spring提供,故减少系统对spring的依赖建议使用@Resource的方式;
4. @Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上