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;
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 自动生成 getter 和 setter 方法。
然后,再新建一个 org.yuzhii.boot.User 类,同样只有 id 和 name 两个属性
如果要将 Cat 和 User 进行配置,传统的做法是在新建一个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;
@Configuration public class AppConfig {
@Bean("userHaha") 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); } }
|
运行后,可以看到控制台输出:
如果给之前的 @Bean 注解添加一个 @Scope 注解,可以改变作用域:
1 2
| @Scope("prototype") @Bean("userHaha")
|
再次运行,可以看到控制台输出:
这是因为,@Scope("prototype") 注解表示多实例,每次获取的都是一个新的实例。