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()方法返回的对象不是单例的,每次调用返回的对象都是新对象