# 注释

# 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);
    }
}
1
2
3
4
5
6
7

# @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=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值
1
2
3
4
5
6

例子

// 如果存在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();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# @ConditionalOnBean

如果容器中存在这个Bean(组件),则触发指定行为

# @ConditionalOnMissingBean

如果容器中不存在这个Bean(组件),则触发指定行为

# 属性绑定

@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定 @EnableConfigurationProperties:快速注册注解:

pringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了 @Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器

# 例子

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

  1. 给容器中注册组件(@Component、@Bean)
  2. 使用@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;
 .....
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

方式二

@SpringBootConfiguration //这是一个配置类,替代以前的配置文件。配置类本身也是容器中的组件
public class AppConfig {
    @Bean
    @ConfigurationProperties(prefix = "pig")
    public Pig pig(){
        return new Pig(); //我们自己new新pig
    }
}
1
2
3
4
5
6
7
8

复杂例子

@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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

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} #对象也可用{}表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 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 处理块中

更新时间: 6/15/2023, 2:18:39 PM