目录
- 一、Spring
- 二、rest规范
- 三、Mybatis
- 四、Mybatis-plus
- 五、SQL语句
- 六、Springboot
关于注解——注解本质上就是一个类,开发中我们可以使用注解取代 xml配置文件
一、Spring
1.@Component
- @component是spring中的一个注解,它的作用就是
实现bean的注入
- web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository
:dao层
@Service
:service层
@Controller
:web层
2.@Configuration
声明当前类是一个配置类,相当于 Spring 中的一个 XML 文件
3.@Controller
@Controller | |
---|---|
类型 | 类注解 |
位置 | SpringMVC控制器类定义上方 |
作用 | 设定SpringMVC的核心控制器bean |
让系统知道下面的类是一个控制器,配置类
需要在配置文件中声明spring-context,并使用<context:component-scan/>
元素指定控制器类的基本包
4.@RequestController
4.@RequestMapping
@RequestMapping | |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法请求访问路径 |
相关属性 | value(默认),请求访问路径 |
@Controller
public class UserController {
@RequestMapping("/save")
public void save(){
System.out.println("user save ...");
}
}
@RequestMapping注解的value属性将请求URL映射到方法。
需要注意的是,控制器方法都应该映射到一个特定的HTTP方法,即使用组合注解,而不是使用@RequestMapping共享映射。因为组合注解减少了在应用程序上要配置的元数据,并且代码功能更清晰。
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(method = RequestMethod.GET)
String get() {
return "Hello from get";
}
@RequestMapping(method = RequestMethod.DELETE)
String delete() {
return "Hello from delete";
}
@RequestMapping(method = RequestMethod.POST)
String post() {
return "Hello from post";
}
@RequestMapping(method = RequestMethod.PUT)
String put() {
return "Hello from put";
}
@RequestMapping(method = RequestMethod.PATCH)
String patch() {
return "Hello from patch";
}
}
在上述这段代码中, @RequestMapping 注解中的 method 元素声明了 HTTP 请求的 HTTP 方法的类型。
所有的处理处理方法会处理从这同一个 URL( /home)进来的请求, 但要看指定的 HTTP 方法是什么来决定用哪个方法来处理。
例如,一个 POST 类型的请求 /home 会交给 post() 方法来处理,而一个 DELETE 类型的请求 /home 则会由 delete() 方法来处理。
5.@ResponseBody
@ResponseBody | |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 |
用法——
该注解可以写在类上或者方法上
- 写在类上就是该类下的所有方法都有@ReponseBody功能
- 当方法上有@ReponseBody注解后:
方法的返回值为字符串
,会将其作为文本内容直接响应
给前端
方法的返回值为对象
,会将对象转换成JSON响应
给前端 - 此处又使用到了类型转换,内部还是通过Converter接口的实现类完成的,所以Converter除了前面所说的功能外,它还可以实现:
对象转Json数据(POJO -> json)
集合转Json数据(Collection -> json)
返回纯文本数据——
@Controller
public class UserController {
@RequestMapping("/toText")
//注意此处该注解就不能省略,如果省略了,会把response text当前页面名称去查找,
//如果没有回报404错误
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
}
返回POJO对象——
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,
//需要依赖@ResponseBody注解和@EnableWebMvc注解
@Controller
public class UserController {
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user = new User();
user.setName("itcast");
user.setAge(15);
return user;
}
}
返回POJO集合——
@Controller
public class UserController {
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
System.out.println("返回json集合数据");
User user1 = new User();
user1.setName("传智播客");
user1.setAge(15);
User user2 = new User();
user2.setName("黑马程序员");
user2.setAge(12);
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
return userList;
}
}
6.@ComponentScan
@ComponentScan | |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 设置spring配置类扫描路径,用于加载使用注解格式定义的bean |
相关属性 | excludeFilters :排除扫描路径中加载的bean,需要指定类别(type)和具体项(classes) |
includeFilters :加载指定的bean,需要指定类别(type)和具体项(classes) |
第一种方法——
@Configuration
//指定SpringMVC只扫描@ComponentScan中的包
@ComponentScan({"com.itheima.service","comitheima.dao"})
public class SpringConfig {
}
第二种方法——
@Configuration
//指定扫描时排除type类中的classes项。
@ComponentScan(value="com.itheima",
excludeFilters=@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
7.@RequestParam
将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略
@RequestParam | |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参定义前面 |
作用 | 绑定请求参数与处理器方法形参间的关系 |
相关参数 | required :是否为必传参数 defaultValue :参数默认值 |
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=”默认值”)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,
如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,
自动为false,如果没有传该参数,就使用默认值
用法——
当使用集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,需要用到@RequestParam绑定。
- 参数关系在后台接收数据时,SpringMVC会将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。
解决方法就是使用@RequestParam注解.
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
@RequestParam 的 value 属性
@RequestParam 注解使用的时候可以有一个值,也可以没有值。这个值指定了需要被映射到处理方法参数的请求参数, 代码如下所示:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/id")
// 实现请求参数 id 与 处理方法参数 personId 的绑定。此时两参数名字不一样
String getIdByValue(@RequestParam("id") String personId) {
System.out.println("ID is " + personId);
return "Get ID from query string of URL with value element";
}
@RequestMapping(value = "/personId")
//像下面的方法,如果请求参数和处理方法参数的名称一样的话,@RequestParam 注解的 value 这个参数就可省掉了。
String getId(@RequestParam String personId) {
System.out.println("ID is " + personId);
return "Get ID from query string of URL without value element";
}
}
@RequestParam 的 required 属性
@RequestParam 注解的 required 这个参数定义了参数值是否是必须要传的。默认为true。
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", required = true) String personName) {
return "Required element of request param";
}
}
因为 required 被指定为 true,所以 getName() 处理方法对于如下两个 URL 只会对前一个进行处理。
当 required被指定为flase时,下面两个URL都会被处理。
/home/name?person=xyz
/home/name
@RequestParam 的 defaultValue属性
@RequestParam 的 defaultValue 取值就是用来给取值为空的请求参数提供一个默认值的。
如果 person 这个请求参数为空,那么 getName() 处理方法就会接收 feflautValue给的默认值作为其参数。
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "morenzhi") String personName) {
return "Required element of request param";
}
}
8.@EnableWebMvc
@EnableWebMvc | |
---|---|
类型 | 配置类注解 |
位置 | SpringMVC配置类定义上方 |
作用 | 开启SpringMVC多项辅助功能 |
@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
9.@RequestBody
@RequestBody | |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参定义前面 |
作用 | 将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次 |
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)参数传递 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
@RequestBody与@RequestParam区别
@RequestParam
用于接收url地址传参,表单传参【application/x-www-formurlencoded】
@RequestBody
用于接收json数据【application/json】后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
10.@DateTimeFormat
@DateTimeFormat | |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参前面 |
作用 | 设定日期时间型数据格式 |
相关属性 | pattern:指定日期时间格式字符串 |
用法——
- 在将2088-08-08格式转换成日期类型的时候失败了,原因是
SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd,当传递的日期不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。
使用@DateTimeFormat就可以解决。
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)
System.out.println("参数传递 date ==> "+date);
System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}
11.@PathVariable
用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
@PathVariable | |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参定义前面 |
作用 | 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应 |
//设定请求参数(路径变量)
@RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
@ReponseBody
public String delete(@PathVariable Integer id){
}
@ConfigurationProperties
- 指定封装的是哪个配置对象,用prefix前缀提供名字进行绑定
@ConfigurationProperties(prefix = "datasource")
@RestControllerAdvice
@ExceptionHandler
用来统一处理异常的注解
@Resource和@Autowired
@Resource和@Autowired注解都可以在Spring Framework应用中进行声明式的依赖注入。
https://segmentfault.com/a/1190000022866778#comment-area
- @Resource
- Spring提供了对该注解的支持,
- 该注解使用在成员属性和setter方法上。默认情况下@Resource按照名称注入,如果没有显式声明名称则按照变量名称或者方法中对应的参数名称进行注入。
优先名称,类型次之
- @Resource注解中有一个name属性,针对name属性是否有值,@Resource的依赖注入底层流程是不同的。
@Resource如果name属性有值,那么Spring会直接根据所指定的name值去Spring容器找Bean对象,如果找到了则成功,如果没有找到则报错。
@Resource(name="student") //这里的student是指bean的ID
private Student student;
如果@Resource中的name属性没有值,则:
先判断该属性名字在Spring容器中是否存在Bean对象。
如果存在,则成功找到Bean对象进行注入。
如果不存在,则根据属性类型去Spring容器找Bean对象,找到一个则进行注入。
@Resource()
//未指定name,默认取将要注入属性的字段名,
//如下Student是类类型,student是属性名也就是字段名
private Student student;
- @Autowired
- Java对注解提供了支持
- @Autowired通常适用于构造函数,成员变量以及方法上。
- 优先类型,
二、rest规范
1.@RestController
默认情况下,@RestController注解会将返回的对象数据转换为JSON格式
@RestController | |
---|---|
类型 | 类注解 |
位置 | 基于SpringMVC的RESTful开发控制器类定义上方 |
作用 | 设置当前控制器类为RESTful风格,等同于@Controller 与@ResponseBody 两个注解组合功能 |
2、@GetMapping @PostMapping @PutMapping @DeleteMapping
@GetMapping @PostMapping @PutMapping @DeleteMapping | |
---|---|
类型 | 方法注解 |
位置 | 基于SpringMVC的RESTful开发控制器方法定义上方 |
作用 | 设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如 |
@GetMapping对应GET请求相关属性 | |
value(默认):请求访问路径 |
@RestController //@Controller + ReponseBody
@RequestMapping("/books")
public class BookController {
//@RequestMapping(method = RequestMethod.POST)
@PostMapping
public String save(@RequestBody Book book){
System.out.println("book save..." + book);
return "{'module':'book save'}";
}
}
什么时候用PostMapping和GetMapping
如果传的参数是@RequestBody ,多参或者传对象的情况下使用@PostMapping注解:
@PostMapping("/getOrderList")
public List<Object> getList(@RequestBody List<Object> orderList) {}
无参,@RequestParam 和@PathVaiable的情况下使用GetMapping:
@gettMapping("/test")
public ModelAndView test16(@RequestParam("id")Long id){}
@gettMapping("/test/{id}")
public ModelAndView (@PathVaiable("name") Long id){}
三、Mybatis
1.@PropertySource
读取外部的properties配置文件
2.@Import
整合Mybatis需要引入Mybatis相关配置类
3.@EnableTransactionManagement
在Service层要管理事务
@Tablename
@TableName 注解用来将指定的数据库表和 JavaBean 进行映射。该注解属性如下:
- value属性
字符串类型,可以不填,用来指定数据表名称。例如:
@TableName("user")
public class UserBean {
}
上面实例中,将 user 数据表和 UserBean 实体进行映射。
- schema属性
shcema 属性用来指定模式名称。如果你使用的是 mysql 数据库,则指定数据库名称。如果你使用的是 oracle,则为 schema,例如:schema=“scott”,其中:scott 就是 oracle 中的 schema。例如:
@TableName(value = "user", schema = "mybatis_test")
@Param
首先明确这个注解是为SQL语句中参数赋值而服务的。
- 实例一: @Param注解基本类型的参数
数据库中的字段名与方法内的参数一一对应,SQL语句对数据库进行操作的条件,都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数
String name 和 String pwd的值。
dao层:
// 采用#{}的方式把@Param注解括号内的参数进行引用(括号内参数对应的是形参如 userName对应的是name);
public User selectUser(@Param("userName") String name,@Param("password") String pwd);
- 实例二:@Param注解JavaBean对象
public List<User> getAllUser(@Param("user") User u);
映射到xml中的<select>
标签
<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">
select
from user t where 1=1
and t.user_name = #{user.userName}
and t.user_age = #{user.userAge}
</select>
- 不使用@Param注解
不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
// 这里id是user的属性
@Select("SELECT * from Table where id = ${id}")
Enchashment selectUserById(User user);
@Mapper与@Repository的详细区别
- @Mapper与@Repository的相同点
两个注解都可在dao/mapper层使用(用来标记持久层)
,生成相应代理对象bean注入到spring容器中。
- @Mapper与@Repository的不同点
@Mapper
是mybatis的注解,可以单独使用,也允许存在在多个mapper文件,它不需要在Spring中配置扫描地址,通过xml里面的namespace里面的接口地址,生成Bean后注入到Service层中。
@Repository
是spring提供的注解,能够将该类注册成Bean。被依赖注入,但是使用该注解后,在启动类上要加@MapperScan来表名Mapper类的位置
,否则扫描不到。但在idea中,使用@Repository可以消除在业务层中注入mapper对象时的错误。
四、Mybatis-plus
https://baomidou.com/pages/223848/#tablename
@TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
@TableName("sys_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId
- 描述:主键注解
- 使用位置:实体类主键字段
@TableName("sys_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId
@TableId注解是专门用在主键上的注解,如果数据库中的主键字段名和实体中的属性名,不一样且不是驼峰之类的对应关系,可以在实体中表示主键的属性上加@Tableid注解,并指定@Tableid注解的value属性值为表中主键的字段名既可以对应上。
注解中的value——
比如数据库的表中的字段是vote_id,但是实体类是voteId。那么就需要在voteId上打上这个注解,设置主键映射 value映射主键字段的名字。(名字一样的话默认不写value属性)
如下:
/** 主键 */
@TableId("vote_id")
@TableId(value = "vote_id")
private Long voteId;
写法:@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)
例如:@TableId(value=“user_id”,type = IdType.AUTO )
注解中type的值的含义——
type 设置主键类型 主键的生成策略 (圈起来的重要)——
-
IdType.ID_WORKER_STR
默认的;底层使用了雪花算法;类型为Integer -
IdType.AUTO
数据库自增;数据库上也要勾上自增 -
IdType.NONE
没有设置主键类型;跟随全局;全局的主键策略如果没有设置,默认是雪花算法 -
IdType.INPUT
手动输入;必须手动输入,数据库自增也没用; -
IdType.UUID
全局唯一id;无序;字符串; -
ID_WORKER_STR
全局唯一(idWorker的字符串表示);
全局主键策略实现——
需要在application.yml文件中添加
mybatis-plus:
mapper-locations:
- com/mp/mapper/*
global-config:
db-config:
id-type: uuid/none/input/id_worker/id_worker_str/auto 表示全局主键都采用该策略(如果全局策略和局部策略都有设置,局部策略优先级高)
Mybatis-plus自动生成mysql的UUId
@TableId(type = IdType.UUID)
private String id;
注意:
1.修改entity的代码如上,生成getter and setter
2.修改数据库的数据类型为varchar(36)
这样就可以使用UUID了。
@TableField
- 描述:字段注解(非主键)
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname")
private String name;
private Integer age;
private String email;
}
@Version
@EnumValue
@TableLogic
@SqlParser
@KeySequence
@Interceptorlgnore
@OrderBy
五、SQL语句
@MapperScan
1.@Insert、@Update、@Delete、@Select
@Autowired
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。默认是根据属性类型,spring自动将匹配到的属性值进行注入,然后就可以使用这个属性(对Springboot02WebApplicationTests类来说)autoWiredBean对象的方法。
怎么用?
它可以标注在属性上、方法上和构造器上,那有什么区别吗?简单来说因为类成员的初始化顺序不同,静态成员 ——> 变量初始化为默认值——>构造器——>为变量赋值。如果标注在属性上,则在构造器中就不能使用这个属性(对象)的属性和方法。
推荐: 对构造函数标注注解,如图在构造器上标注@Autowired注解
@Results、@Result
- @Results源码——
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Results {
String id() default ""; //当前Results注解的唯一标识
Result[] value() default {}; //value值为Result[]数组
}
@Results中只有两个属性,id和value,
id
作为当前@Results注解的唯一标识很好理解;value
值为@Result数组。
- @Result源码——
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Result {
boolean id() default false; //id唯一标识
String column() default ""; //对应数据库中的列名
String property() default ""; //对应类中的属性名
Class<?> javaType() default void.class; //数据类型
JdbcType jdbcType() default JdbcType.UNDEFINED; //jdbc类型
Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
One one() default @One; //一对一配置
Many many() default @Many; //一对多配置
}
@Results的基本用法——当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来。
column
为数据库字段名(列名),porperty
为实体类属性名,jdbcType
为数据库字段数据类型,id
为是否为主键。
- @Results结合@Result和@Many——
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 查询用户,根据用户id查询信息 select * from user where id =
@Select("select * from t_user where id = #{id}")
User selectById(int id);
// 查询用户及其所有的订单
@Select("select * from t_user")
@Results(
{
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(column = "id",property = "orders",javaType = List.class,
many=@Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
}
@One、@Many
六、Springboot
@SpringBootApplication
@SpringBootApplication注解一般放在项目的一个
启动类
上,用来把启动类注入到容器中,用来定义容器扫描的范围,用来加载classpath环境中一些bean。
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
@SpringBootTest
常用于Springboot的测试类编写
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StartUpApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerTest {
/**
* @LocalServerPort 提供了 @Value("${local.server.port}") 的代替
*/
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate restTemplate;
@Before
public void setUp() throws Exception {
String url = String.format("http://localhost:%d/", port);
System.out.println(String.format("port is : [%d]", port));
this.base = new URL(url);
}
/**
* 向"/test"地址发送请求,并打印返回结果
* @throws Exception
*/
@Test
public void test1() throws Exception {
ResponseEntity<String> response = this.restTemplate.getForEntity(
this.base.toString() + "/test", String.class, "");
System.out.println(String.format("测试结果为:%s", response.getBody()));
}
@RunWith(SpringRunner.class)
Springboot的@RunWith(SpringRunner.class)
注解的意义在于Test测试类要使用注入的类,比如@Autowired注入的类,有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效,
不然直接一个NullPointerExecption
@Test 、@Before 、 @After
@Test
:
目的是为了测试此方法,因为我们之前的代码的执行都要放在main方法中执行。
我们通过@Test注解,我们就能使相应的方法不放在main方法中就可以直接运行,
起到代码的测试作用
@Before
:
此注解的目的是为了将@Befoe 作为首先执行的代码。用于资源的申请
@After
:
此注解的目的是为了让每次释放资源之后都会执行此注解下的代码,
即使程序出现了异常,依然还会执行这个。用于资源的释放
package project.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import junit.framework.Assert;
public class CalculationTest {
/*
*
*/
@Before
public void init() {
System.out.println("init...");
}
@Test
public void testAdd() {
Calculation c = new Calculation();
int res = c.add(1, 5);
System.out.println(res);
}
/*
* @Test:
* 目的是为了测试此方法,因为我们之前的代码的执行都要放在main方法中执行
* 我们通过@Test注解,我们就能使相应的方法不放在main方法中就可以直接运行,
* 起到代码的测试作用
*/
@Test
public void testSub() {
Calculation c = new Calculation();
int res = c.sub(1, 5);
System.out.println(res);
}
/*
* @After 此注解的目的是为了让每次释放资源之后都会执行此注解下的代码
* 即使程序出现了异常,依然还会执行这个。用于资源的释放
*/
@After
public void close() {
System.out.println("close...\n");
}
}
测试结果——
@Data
@Data注解是由Lombok库提供的,会生成getter、setter以及equals()、hashCode()、toString()等方法
@Slf4j
log.info("项目启动成功...");// info级别的日志,写了这个注解后,就可以在运行日志里看到了这个输出了。
@RestControllerAdvice
SpringBoot常用注解@RestControllerAdvice
@RestControllerAdvice是什么
@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,
@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component。
用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,
适用于所有使用@RequestMapping方法。
@RestControllerAdvice的特点:
通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
@ExceptionHandler
:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
@InitBinder
:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
@ModelAttribute
:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对