Controller层
@RestController
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
-
1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
例如:本来应该到success.jsp页面的,则其显示success. -
2)如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
-
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
RequestMapping注解有六个属性:
1、 value, method;
- value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
- method: 指定请求的method类型, GET、POST、PUT、DELETE等;
value的url值为以下三类:
-
A) 可以指定为普通的具体值;
-
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
-
C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
2、 consumes,produces;
- consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、 params,headers;
- params: 指定request中必须包含某些参数值是,才让该方法处理。
- headers: 指定request中必须包含某些指定的header值,才能让该方法处理请。
@PostMapping and GetMapping
Spring MVC新特性
提供了对Restful风格的支持
- @GetMapping,处理get请求
@PostMapping,处理post请求
@PutMapping,处理put请求
@DeleteMapping,处理delete请求
@PostMapping(value = "/user/login")
//等价于
@RequestMapping(value = "/user/login",method = RequestMethod.POST)
@Slf4j
- 首先需要安装Lombok插件
类上面添加@Sl4j注解,然后使用log打印日志;
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>X.X.X</version>
</dependency>
@CrossOrigin
- 允许跨域
要了解跨域,首先需要知晓浏览器的同源策略,简单的说就是两个请求协议、端口、主机都相同,则两个请求具有相同的源。浏览器的同源策略控制了不同源之间的交互,也就出现了跨域的问题,对于为什么引入同源策略,官方给出的解释是 “同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。”浏览器的同源策略在一定程度上能规避一些危险、提高攻击的成本。
- 跨域问题的解决
JSONP: 这种解决跨域问题的方式前后端都需要有改动
CORS: 一个W3C标准,全程跨域资源共享 (Cross-Origin Resource Sharing)
@Autowired
注释对在哪里和如何完成自动连接提供了更多的细微的控制。
- @Autowired 注释可以在 setter 方法中被用于自动连接 bean,就像 @Autowired 注释,容器,一个属性或者任意命名的可能带有多个参数的方法。
- Setter 方法中的 @Autowired
你可以在 XML 文件中的 setter 方法中使用 @Autowired 注释来除去 元素。当 Spring遇到一个在 setter 方法中使用的 @Autowired 注释,它会在方法中视图执行 byType 自动连接。 - 构造函数中的 @Autowired
你也可以在构造函数中使用 @Autowired。一个构造函数 @Autowired 说明当创建 bean 时,即使在 XML 文件中没有使用元素配置 bean ,构造函数也会被自动连接。 - @Autowired 的(required=false)选项
默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。
@Transactional
- @Transactional 实质是使用了 JDBC 的事务来进行事务控制的
- @Transactional 基于 Spring 的动态代理的机制
- 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式。
- 虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
- SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了。
ssm项目中开启事务管理需要两步
- 第一步,在 xml 配置文件中添加事务配置信息。除了用配置文件的方式,@EnableTransactionManagement 注解也可以启用事务管理功能
- 第二步,将@Transactional 注解添加到合适的方法上,并设置合适的属性信息。
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
Config层
@Configuration
- @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
- 指示一个类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些bean生成BeanDefinition和服务请求。
内部实现
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration { ... }
- 可以看到这个 @Component 注解, 意味也将会注册为bean, 其内部也可以依赖注入。 (换个方式说,一般Bean能用的东西,它也能用) 例如: @Autowired、@Inject、@Scope等
@Configuration注解的配置类有如下要求:
- @Configuration不可以是final类型;
- @Configuration不可以是匿名类;
- 嵌套的configuration必须是静态类。
swagger注解
swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目实现了springMVC框架的无缝集成功能,方便生成restful风格的接口文档,同时,swagger-ui还可以测试spring restful风格的接口功能
作用范围 | API | 使用位置 |
---|---|---|
对象属性 | @ApiModelProperty | 用在参数对象的字段上 |
协议集描述 | @Api | 用在Conntroller类上 |
协议描述 | @ApiOperation | 用在controller方法上 |
Response集 | @ApiResponses | 用在controller方法上 |
Response | @ApiResponse | 用在@ApiResponses里面 |
非对象参数集 | @ApilmplicitParams | 用在controller方法上 |
描述返回对象的意义 | @ApiModel | 用在返回对象类上 |
@Api
- value - 字段说明
- description - 注释说明这个类
@ApiModelProperty的用法
- value–字段说明
- name–重写属性名字
- dataType–重写属性类型
- required–是否必填
- example–举例说明
- hidden–隐藏
@ApiOperation
- value - 字段说明
- notes - 注释说明
- httpMethod - 说明这个方法被请求的方式
- response - 方法的返回值的类型
@EnableSwagger2
- 表示开启swagger
实体类
@TableName
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 表名 |
schema | String | 否 | “” | schema(@since 3.1.1) |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值)(@since 3.1.1) |
resultMap | String | 否 | “” | xml 中 resultMap 的 id |
autoResultMap | boolean | 否 | false | 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入)(@since 3.1.2) |
@Data
- @Data 注解的主要作用是提高代码的简洁,使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法
- 在maven中添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
@TableId 主键注解
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
value | string | “” | 主键字段名 |
type | Enum | IdType.NONE | 主键类型 |
类型
值 | 描述 |
---|---|
Auto | 数据库自增 |
Input | 自行输入 |
ID_Worker | 分布式全局唯一ID 长整型类型 |
UUID | 32位UUID字符串 |
NONE | 无状态 |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型 |
@TableField
- 驼峰命名法
比如数据库中字段名称为:compare_id
@TableField("compare_id")
@ApiModelProperty("对比id")
private int compareId;
值 | 描述 |
---|---|
value | 字段值(驼峰命名方式,该值可无) |
update | 预处理 set 字段自定义注入 |
condition | 预处理 WHERE 实体条件自定义运算规则 |
el | 详看注释说明 |
exist | 是否为数据库表字段( 默认 true 存在,false 不存在 ) |
strategy | 字段验证 ( 默认 非 null 判断,查看 com.baomidou.mybatisplus.enums.FieldStrategy ) |
fill | 字段填充标记 ( FieldFill, 配合自动填充使用 ) |
Mapper层
@Mapper
- 代替mapper映射文件
@Select
- 简便、快速去操作sql
- 只需要在mapper中方法上加入@Select(),然后在括号中写入需要实现的sql语句即可
- 例如
@Select("select count(*) from project as p\n" +
" LEFT JOIN compare as c\n" +
" on p.project_id = c.project_id\n" +
" ORDER BY p.project_id ,c.compare_id" )
public int listTotalNum();
@Results
- MyBatis中使用@Results注解来映射查询结果集到实体类属性。
- 例如
@Select("select p.project_id,p.project_name,c.compare_id ,c.result,c.job_id,c.src_version,c.target_version,c.update_time from project as p\n" +
" LEFT JOIN compare as c\n" +
" on p.project_id = c.project_id\n" +
" ORDER BY p.project_id ,c.compare_id\n" +
"limit #{pageNumber},#{pageSize} ")
@Results({
@Result(column = "project_id", property = "projectId", jdbcType = JdbcType.INTEGER),
@Result(column = "project_name", property = "projectName", jdbcType = JdbcType.VARCHAR),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "src_version", property = "srcVersion", jdbcType = JdbcType.VARCHAR),
@Result(column = "target_version", property = "targetVersion", jdbcType = JdbcType.VARCHAR),
@Result(column = "result", property = "compareResult", jdbcType = JdbcType.VARCHAR),
})
public List<CompareVo> searchList(int pageNumber, int pageSize);
@service层
@service
- @Service注解表示该类是业务层,之前的注解是@Component,但是后面为了区别,分出三个注解,分别是@Service,@Controller,@Repository用来表示业务层,控制层和Dao层
- @service内部实现包括以下四个注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Component
- 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean
@Documented
- 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
@Repository
- @Component注解的扩展,被@Repository注解的POJO类表示DAO层实现,从而见到该注解就想到DAO层实现,使用方式和@Component相同
Application类
@SpringBootApplication
@SpringBootApplication注解有以下三个直接组合
-
@ComponentScan
- spring里有四大注解:@Service,@Repository,@Component,@Controller用来定义一个bean.@ComponentScan注解就是用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean.
- 使用@SpringBootApplication注解,就说明你使用了@ComponentScan的默认配置,这就建议你把使用@SpringBootApplication注解的类放置在root package(官方表述)下,其他类都置在root package的子包里面,这样bean就不会被漏扫描
-
@EnableAutoConfiguration
- @EnableAutoConfiguration是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中.@EnableAutoConfiguration源码通过@Import注入了一个ImportSelector的实现类
- AutoConfigurationImportSelector,这个ImportSelector最终实现根据我们的配置,动态加载所需的bean
-
@SpringBootConfiguration
- 这个注解的作用与@Configuration作用相同,都是用来声明当前类是一个配置类.可以通过@Bean注解生成IOC容器管理的bean.在QuickStartApplication中定义bean,并在@Controller中注入使用
-
springboot是通过注解@EnableAutoConfiguration的方式,去查找,过滤,加载所需的configuration,@ComponentScan扫描我们自定义的bean,@SpringBootConfiguration使得被@SpringBootApplication注解的类声明为注解类.因此@SpringBootApplication的作用等价于同时组合使用@EnableAutoConfiguration,@ComponentScan,@SpringBootConfiguration
@MapperScan
- 作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
- 添加位置:是在Springboot启动类上面添加
@EnableTransactionManagement
- Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可