准备开始入Spring Boot的坑,从最基础的开始学习,本章是用来记录Spring Boot的注解;
1、@SpringBootApplication:
这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。
2、@EnableAutoConfiguration
允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置Spring Bean。如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。
@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:
● 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
● 去重,并将exclude和excludeName属性携带的类排除;
● 过滤,将满足条件(@Conditional)的自动配置类返回;
3、@Configuration
用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
4、@ComponentScan
组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。
@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。
5、@Repository
用于标注数据访问组件,即DAO组件。
使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
6、@Service
一般用于修饰service层的组件。
如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了。
@Service("courseDAO")相当于applicationContext.xml文件里面的
<bean id="courseDAO"
class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">
</bean>
7、@RestController
用于标注控制层组件(如struts中的action),表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器;它是@Controller和@ResponseBody的合集。
8、@ResponseBody
表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
9、@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestMapping(value = "/treeList", method = RequestMethod.GET)
@RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)——外部传参
例子:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", required = false) String personName) {
return "Required element of request param";
}
}
在这段代码中,因为 required 被指定为 false,所以 getName() 处理方法对于如下两个 URL 都会进行处理:
/home/name?person=xyz
/home/name
@RequestParam 的 defaultValue 取值就是用来给取值为空的请求参数提供一个默认值的。@RequestParam(value = "person", defaultValue = "John") 当person外部传入为空时,默认值为John。
@RequestMapping(method = RequestMethod.GET),method表示请求方法
10、@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
11、@Bean
相当于XML中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。
12、@AutoWired
byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
当加上(required=false)时,就算找不到bean也不报错。
13、@Qualifier
当有多个同一类型的Bean时,可以用@Qualifier("name")来指定,与@Autowired配合使用。Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。
14、@Resource(name="name",type="type")
没有括号内内容的话,默认byName。与@Autowired干类似的事。(@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。)
@Resource有两个重要属性,分别是name和type,spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,如果使用type属性则使用byType的自动注入策略。如果都没有指定,则通过反射机制使用byName自动注入策略。
15、@RequestParam
将请求参数绑定到你控制器的方法参数上,用在方法的参数前面。例:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””),required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错;defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
16、@PathVariable
路径变量。参数与大括号里的名字一样要相同。例:
RequestMapping("user/get/mac/{macAddress}")
public String getByMacAddress(@PathVariable String macAddress){
public String getByMacAddress(@PathVariable(macAddress) String macAddresses){
//do something;
}
//user/get/mac/mac,其中的mac就是外部传入的值
17、@Profile
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。
任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。
@Configuration
@Profile("prod")//可接受一个多个参数,如@Profile({"tut1","hello-world"})
public class ProductionConfiguration {
// ...
}
18、@ConfigurationProperties
Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。
使用 @Component 注解目标类,这样项目启动时会自动将该类添加到容器中。
使用 @EnableConfigurationProperties 间接的将 @ConfigurationProperties 注解的目标类添加到容器中。讲的详细点就是,使用 @ConfigurationProperties 注解 类A,使用 @EnableConfigurationProperties(value = 类A.class) 注解类B,那么容器在加载类B的时候,会先加载类A到容器中,实现了间接的加载。
19、@ApiModelProperty
20、@Import:用来导入其他配置类。
21、@ImportResource:用来加载xml配置文件。
22、@Value:注入Spring boot application.properties配置的属性的值。
23、@Inject:等价于默认的@Autowired,只是没有required属性。
24、@JsonBackReference:解决嵌套外链问题。
25、@RepositoryRestResourcepublic:配合spring-boot-starter-data-rest使用。
二、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。
@SequenceGeneretor(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配置文件中的一对一,一对多,多对一。
@ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。
@MappedSuperclass:
1.@MappedSuperclass 注解使用在父类上面,是用来标识父类的
2.@MappedSuperclass 标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够映射在其子类对用的数据库表中
3.@MappedSuperclass 标识的类不能再有@Entity或@Table注解
@Column:
1.当实体的属性与其映射的数据库表的列不同名时需要使用@Column标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。
2.@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length、precision等。具体如下:
1】name属性:name属性定义了被标注字段在数据库表中所对应字段的名称
2】unique属性:unique属性表示该字段是否为唯一标识,默认为false,如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint
3】nullable属性:nullable属性表示该字段是否可以为null值,默认为true
4】insertable属性:insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值
5】updateable属性:updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值
6】insertable和updateable属性:一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的
7】columnDefinition属性:columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用,如果数据库中表已经建好,该属性没有必要使用
8】table属性:table属性定义了包含当前字段的表名
9】length属性:length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符
10】precision属性和scale属性:precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数
数据库相关:
1、查询:@PostLoad
2、插入:@PrePersist
3、更新:@PreUpdate
4、删除:@PreRemove
其他:
1、@Override
这是伪代码,用于表示被标注的方法是一个重写方法。
主要有两个好处:
1)帮助自己检查是否正确的重写父类方法
2)明显的提示看代码的人,这是重写的方法
2、@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:是在Springboot启动类上面添加(例:@MapperScan({"com.kfit.demo","com.kfit.user"}))
3、@Pointcut
是指那些方法需要被执行"AOP",用来定义切点。
常用方法execution,例:@Pointcut("execution(public * com.macro.mall.controller.*.*(..))")表示匹配所有com.macro.mall.controller.包及其子包下所有类的所有public方法。@Pointcut("execution(方法访问类型,返回类型(*表示所有的返回类型),方法的声明类,方法名(方法参数的类型),异常类型)"(..)-表示省略)
4、@Api
作用在Conntroller类上,用来标注该类具体实现内容。表示标识这个类是swagger的资源。
参数:
1. tags:可以使用tags()允许您为操作设置多个标签的属性,而不是使用该属性。
2. description:可描述该类作用。
5、@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
6、@Target:
注解的作用目标
1、@Target(ElementType.TYPE) //接口、类、枚举、注解
2、@Target(ElementType.FIELD) //字段、枚举的常量
3、@Target(ElementType.METHOD) //方法
4、@Target(ElementType.PARAMETER) //方法参数
5、@Target(ElementType.CONSTRUCTOR) //构造函数
6、@Target(ElementType.LOCAL_VARIABLE)//局部变量
7、@Target(ElementType.ANNOTATION_TYPE)//注解
8、@Target(ElementType.PACKAGE) ///包
7、@Documented
注解标记的元素,Javadoc工具会将此注解标记元素的注解信息包含在javadoc中。默认,注解信息不会包含在Javadoc中
8、@Inherited
说明子类可以继承父类中的该注解
网友评论