参考链接:https://www.cnblogs.com/MaxElephant/p/8108140.html
之前用户使用的是3个注解注解他们的main类。分别是:@Configuration、@EnableAutoConfiguration、@ComponentScan。由于这些注解一般都是一起使用,spring boot提供了一个统一的注解@SpringBootApplication。
因此可以这么理解:@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
接下来分别解释这三个注解:
笼统来说,@SpringBootApplication注解标记此类为springboot主启动类,运行这个类即启动本地服务器,并能自动扫描并使用本项目的bean。端口号为项目配置文件中设置的端口号
@SpringBootApplication //此注解标记springboot主启动类
public class SpringbootDemo1Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemo1Application.class, args);
}
}
参考链接:https://www.cnblogs.com/yaqee/p/11256047.html
在一个类上添加 @Controller 注解,表明了这个类是一个控制器类,但这只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。
@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。
@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。具体的使用方法不是本次的重点,有兴趣的可以看https://www.cnblogs.com/xiepeixing/p/4243288.html
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping("/users")
public String users() {
return "users";
}
}
此时请求users方法的url路径就是:…/user/users。
可以看到上面users方法的返回值是字符串类型的,这个就是处理器在处理完任务后将要跳转的页面。如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
@RestController表示将该类交给spring容器进行管理,同时启动springmvc框架,用来接受用户请求,该程序该类的返回值是JSON串。如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注 @RestController ,而不用在每个方法中标注@ResponseBody,简化了开发过程。
@RestController
public class HelloController {
@RequestMapping("/getMsg")
public String getMsg() {
return "你好";
}
}
参考链接:https://www.cnblogs.com/517cn/p/10946213.html
@PropertySource加载指定的属性文件(*.properties)到 Spring 的 Environment 中,如果有中文必须要写encoding属性将字符集转为UTF-8。可以配合 @Value 和 @ConfigurationProperties 使用。
属性文件:demo.properties
//属性文件:demo.properties
demo.name=huang
demo.sex=1
demo.type=demo
示例一:@PropertySource + @Value
package com.huang.pims.demo.props;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = {"demo/props/demo.properties"})
public class ReadByPropertySourceAndValue {
@Value("${demo.name}")
private String name;
@Value("${demo.sex}")
private int sex;
@Value("${demo.type}")
private String type;
@Override
public String toString() {
return "ReadByPropertySourceAndValue{" +
"name='" + name + '\'' +
", sex=" + sex +
", type='" + type + '\'' +
'}';
}
}
示例二:@PropertySource 和 @ConfigurationProperties
package com.huang.pims.demo.props;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = {"demo/props/demo.properties"})
@ConfigurationProperties(prefix = "demo")
public class ReadByPropertySourceAndConfProperties {
private String name;
private int sex;
private String type;
public void setName(String name) {
this.name = name;
}
public void setSex(int sex) {
this.sex = sex;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public int getSex() {
return sex;
}
public String getType() {
return type;
}
@Override
public String toString() {
return "ReadByPropertySourceAndConfProperties{" +
"name='" + name + '\'' +
", sex=" + sex +
", type='" + type + '\'' +
'}';
}
}
Lombok优点:
Lombok缺点:
像 lombok 这种插件,已经不仅仅是插件了,它在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变相的说它就是在改变java语法,它改变了你编写源码的方式,它不像 spring 的依赖注入一样是运行时的特性,而是编译时的特性。如果一个项目有非常多这样的插件,会极大的降低阅读源代码的舒适度。
lombok 只是省去了一些人工生成代码的麻烦,但是这些getter/setter等等的方法,用IDE的快捷键也可很方便的生成。况且,有时通过给getter/setter加一点点业务代码(但通常不建议这么加),能极大的简化某些业务场景的代码。
用还是不用,这中间如何取舍,自然是要看项目的需要,灵活运用。
在安装并依赖了lombok后,其提供了一些关于POJO操作的注解,以下为lombok提供的一些常见注解
注在类上,自动提供类的get、set、equals、hashCode、canEqual、toString方法
参考链接:https://blog.csdn.net/linjpg/article/details/94588483
既可以注解在类上也可以注解在属性上,用来配置lombok如何产生和显示getters和setters的方法。有三个属性,分别是fluent,chain,prefix,
1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
假如有以下类:
@Accessors(flunet = true)
public class MyClass {
@Getter
private int num;//此时自动生成的get方法为num(),而不是getNum()
}
此时自动生成的get方法为num(),而不是getNum()
2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
因此在设置chain为true之后,可以不断地连续调用set方法,如设置了User类的chain为true时,有以下代码
public User getUser() {
User user=new User();
user.setId(101)
.setName("name")
.setAge(18)
.setSex("m");
return user;
}
3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
假如有以下类
@Accessors(prefix = “m”)
public class MyClass {
@Getter
private int mNum;
}
此时生成的get方法为getNum(),而不是getMNum() //去掉了前缀m
注在类上,使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数(全参构造方法),此前需要先添加无参构造方法注解@NoArgsConstructor(这是规定)
注在类上,提供类的无参构造
注在属性上,提供 set 方法
注在属性上,提供 get 方法
注在类上,提供对应的 equals 和 hashCode 方法
注在类上,提供对应的 Logger 对象,变量名为 log