Bean注解相关使用方式

1. 仅使用 @Bean 注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Person {
}

public class Test {

@Bean
public Person get() {
return new Person();
}
}

@RestController
public class TestController {

private static final Logger log = LoggerFactory.getLogger(TestController.class);

@RequestMapping("/test")
public void test() {
Test test = new Test();
log.error("Class: {}, Class#get(): {}", test, test.get());
}
}

此时在 SpringBoot 当中,被注解的方法返回的对象并没有被自动注入到 IoC 容器,因此使用注解和没使用一样,并非单例的,每次调用返回的对象都是新对象


2. @Bean 和 @Configuration 注解联合使用

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
public class Person {
}

@Configuration
public class Test {

@Bean
public Person get() {
return new Person();
}
}

@RestController
public class TestController {

private static final Logger log = LoggerFactory.getLogger(TestController.class);

@Resource
private Test test;

@RequestMapping("/test")
public void test() {
log.error("Class: {}, Class#get(): {}", test, test.get());
}
}

此时在 SpringBoot 当中,被 @Configuration 注解的类会被框架使用 CGLIB 生成一个代理类并对 @Bean 注解的方法处理,此时自动注入的类对象以及 @Bean 注解的方法返回的对象都是单例的


3. @Bean 和 @Component(或者 @Service …) 注解联合使用

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
public class Person {
}

@Component
public class Test {

@Bean
public Person get() {
return new Person();
}
}

@RestController
public class TestController {

private static final Logger log = LoggerFactory.getLogger(TestController.class);

@Resource
private Test test;

@Resource
private Person get;

@RequestMapping("/test")
public void test() {
log.error("Class: {}, Class#get(): {}", test, test.get());
log.error("Class: {}", get);
}
}

此时在 SpringBoot 当中,自动注入的类对象是单例的,自动注入 @Bean 注解的方法返回的对象是单例的,但是类对象调用get()方法返回的对象不是单例的,每次调用返回的对象都是新对象