Yuzhii的Springboot3笔记【2】

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不应该影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

Java 注解

组件注册

紧接上回,我新建了一个模块,然后,在该模块中新建 org.yuzhii.boot.bean.Cat 类,如下:

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
package org.yuzhii.boot.bean;

/**
* @author Yuzhii
* @description TODO
* @date 2024-04-18 下午8:29
*/

public class Cat {
private long id;
private String name;

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

tips: 当写完 private 属性后,可以使用 Alt + Insert 快捷键,选择 Getter and Setter 自动生成 gettersetter 方法。

然后,再新建一个 org.yuzhii.boot.User 类,同样只有 idname 两个属性

如果要将 CatUser 进行配置,传统的做法是在新建一个xml文件,然后在xml文件中进行配置,比如在 resources 目录下新建一个 ioc.xml 文件,然后在该文件中进行配置:

1
2
3
4
5
6
7
8
9
<bean id="user" class="org.yuzhii.boot.bean.User">
<property name="name" value="张三"/>
<property name="id" value="1"/>
</bean>

<bean id="cat" class="org.yuzhii.boot.bean.Cat">
<property name="name" value="小猫"/>
<property name="id" value="1"/>
</bean>

但是,SpringBoot 为我们提供了一种新的方式,即使用 @Configuration@Bean 注解进行配置。

org.yuzhii.boot 包下新建一个 config.AppConfig 类,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package org.yuzhii.boot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.yuzhii.boot.bean.User;

/**
* @author Yuzhii
* @description TODO
* @date 2024-04-18 下午8:36
*/

@Configuration // 这是一个配置类
public class AppConfig {

@Bean("userHaha") //替代xml中的<bean>标签
public User user() {
var user = new User();
user.setId(1);
user.setName("yuzhii");
return user;
}
}

然后在 Application 类中进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootApplication
public class Springboot302DemoApplication {

public static void main(String[] args) {
var ioc = SpringApplication.run(Springboot302DemoApplication.class, args);

String[] forType = ioc.getBeanNamesForType(User.class);
for (String s : forType) {
System.out.println(s);
}

Object userHaha1 = ioc.getBean("userHaha");
Object userHaha2 = ioc.getBean("userHaha");
System.out.println(userHaha2 == userHaha1);
}
}

运行后,可以看到控制台输出:

1
2
userHaha
true

如果给之前的 @Bean 注解添加一个 @Scope 注解,可以改变作用域:

1
2
@Scope("prototype") // 多实例
@Bean("userHaha") //替代xml中的<bean>标签

再次运行,可以看到控制台输出:

1
2
userHaha
false

这是因为,@Scope("prototype") 注解表示多实例,每次获取的都是一个新的实例。