注释
注释
SpringBoot
@EnableAutoConfiguration
SpringBoot 开启自动配置的核心。 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。
@SpringBootApplication
import org.springframework.boot.autoconfigure.SpringBootApplication;
SpringBoot启动入口
@SpringBootApplication(scanBasePackages = {"com.bihell.dice"})
public class DiceApplication {
public static void main(String[] args) {
SpringApplication.run(DiceApplication.class, args);
}
}
@ResponseBody
import org.springframework.web.bind.annotation.ResponseBody;
http请求返回文本数据
@RestController
合成注解:@Controller
+@ResponseBody
@Configuration
配置类
@Bean
注册组件
@import()
导入组件
@ConditionalOnxxx 条件注解
@ConditionalOnXxx
@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值
例子
// 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
// 否则,就给容器中放一个Dog组件,名dog01
// 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan
// 否则,就放一个User,名叫lisi
@ConditionalOnMissingClass(value="com.alibaba.druid.FastsqlException") //放在类级别,如果注解判断生效,则整个配置类才生效
@SpringBootConfiguration
public class AppConfig2 {
@ConditionalOnClass(name="com.alibaba.druid.FastsqlException") //放在方法级别,单独对这个方法进行注解判断。
@Bean
public Cat cat01(){
return new Cat();
}
@Bean
public Dog dog01(){
return new Dog();
}
@ConditionalOnBean(value = Dog.class)
@Bean
public User zhangsan(){
return new User();
}
@ConditionalOnMissingBean(value = Dog.class)
@Bean
public User lisi(){
return new User();
}
}
@ConditionalOnBean
如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean
如果容器中不存在这个Bean(组件),则触发指定行为
属性绑定
@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定 @EnableConfigurationProperties:快速注册注解:
pringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了 @Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器
例子
将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定
- 给容器中注册组件(@Component、@Bean)
- 使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定
方式一
// application.properties文件
pig.id=1
pig.name=佩奇
pig.age=5
sheep.id=1
sheep.name=苏西
sheep.age=5
// Pig 文件
@ConfigurationProperties(prefix = "pig")
@Component
public class Pig {
private Long id;
private String name;
private Integer age;
.....
}
方式二
@SpringBootConfiguration //这是一个配置类,替代以前的配置文件。配置类本身也是容器中的组件
public class AppConfig {
@Bean
@ConfigurationProperties(prefix = "pig")
public Pig pig(){
return new Pig(); //我们自己new新pig
}
}
复杂例子
类
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data //自动生成JavaBean属性的getter/setter
//@NoArgsConstructor //自动生成无参构造器
//@AllArgsConstructor //自动生成全参构造器
public class Person {
private String name;
private Integer age;
private Date birthDay;
private Boolean like;
private Child child; //嵌套对象
private List<Dog> dogs; //数组(里面是对象)
private Map<String,Cat> cats; //表示Map
}
yaml配置
person:
name: '张三 \n 123'
age: 18
birth-day: 2010/10/10 12:12:12
like: true
child:
name: "李四 \n 456"
age: 20
birth-day: 2018/10/10
text:
- abc
- def
- |
dogs:
- name: 小黑
age: 3
- name: 小白
age: 2
- >
活动结束看大
号节课第三
带回家看
- |
dhhdh
fjkdsl
gflkd
dogs:
- name: 小黑
age: 3
- name: 小白
age: 2
cats:
c1:
name: 小蓝
age: 3
c2: {name: 小绿,age: 2} #对象也可用{}表示
Lombok
Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。
@Getter和@Setter
该注解可应用在类或成员变量之上,和我们预想的一样,@Getter
和 @Setter
就是为成员变量自动生成 get 和 set 方法,默认生成访问权限为 public 方法,当然我们也可以指定访问权限 protected 等
@EqualsAndHashCode
该注解需应用在类上,使用该注解,lombok会为我们生成 equals(Object other) 和 hashcode() 方法,包括所有非静态属性和非transient的属性,同样该注解也可以通过 exclude 属性排除某些字段,of 属性指定某些字段,也可以通过 callSuper 属性在重写的方法中使用父类的字段,这样我们可以更灵活的定义bean的比对
@NonNull
该注解需应用在方法或构造器的参数上或属性上,用来判断参数的合法性,默认抛出 NullPointerException 异常
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
以上三个注解分别为我们生成无参构造器,指定参数构造器和包含所有参数的构造器,默认情况下,@RequiredArgsConstructor, @AllArgsConstructor 生成的构造器会对所有标记 @NonNull 的属性做非空校验。
@Data
介绍了以上的注解,再来介绍 @Data 就非常容易懂了,@Data 注解应用在类上,是@ToString, @EqualsAndHashCode, @Getter / @Setter 和 @RequiredArgsConstructor合力的体现
@Builder
函数式编程或者说流式的操作越来越流行,应用在大多数语言中,让程序更具更简介,可读性更高,编写更连贯,@Builder
就带来了这个功能,生成一系列的builder API,该注解也需要应用在类上,看下面的例子就会更加清晰明了。
@Log
该注解需要应用到类上,在编写服务层,需要添加一些日志,以便定位问题,我们通常会定义一个静态常量Logger,然后应用到我们想日志的地方,现在一个注解就可以实现:
val
熟悉 Javascript 的同学都知道,var 可以定义任何类型的变量,而在 java 的实现中我们需要指定具体变量的类型,而 val 让我们摆脱指定,编译之后就精准匹配上类型,默认是 final 类型,就像 java8 的函数式表达式,()->System.out.println(“hello lombok”); 就可以解析到Runnable函数式接口。
@Cleanup
当我们对流进行操作,我们通常需要调用 close 方法来关闭或结束某资源,而 @Cleanup 注解可以帮助我们调用 close 方法,并且放到 try/finally 处理块中