@Configuration的proxyBeanMethods参数
entity包
User.java
| 1
2
3
4
5
6
7
 | 
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
}
 | 
 
Pet.java
| 1
2
3
4
5
6
7
 | 
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
    private String name;
}
 | 
 
TmpConfiguration.java
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 | 
@Configuration(proxyBeanMethods = false)
public class TmpConfigration {
    @Bean
    public User user() {
        return new User("张三");
    }
    @Bean
    public Pet pet() {
        return new Pet("旺财");
    }
}
 | 
 
三段测试代码:
| 1
2
3
4
5
6
 | 
// 实验一
for (String name : configurableApplicationContext.getBeanDefinitionNames()) {
    System.out.println(name);
}
 | 
 
实验一主要验证了加了@Bean注解的方法名,将会作为该Bean在容器中的名字。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | 
// 实验二
System.out.println(configurableApplicationContext.getBean(TmpConfigration.class));
System.out.println(configurableApplicationContext.getBean(TmpConfigration.class));
System.out.println(configurableApplicationContext.getBean(User.class));
System.out.println(configurableApplicationContext.getBean(User.class));
System.out.println(configurableApplicationContext.getBean(Pet.class));
System.out.println(configurableApplicationContext.getBean(Pet.class));
 | 
 
实验二验证了proxyBeanMethods无论是true或者false,都不会影响从容器中通过get方法获取Bean(这些Bean始终都是单例)
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 | 
// 实验三
TmpConfigration tmpConfigration = configurableApplicationContext.getBean(TmpConfigration.class);
System.out.println(tmpConfigration.user());
System.out.println(tmpConfigration.user());
System.out.println(tmpConfigration.user());
System.out.println(tmpConfigration.pet());
System.out.println(tmpConfigration.pet());
System.out.println(tmpConfigration.pet());
 | 
 
实验三验证了如果proxyBeanMethods设置为true,则即使通过Configuration Bean的方法获取Bean,这些Bean都是单例的。如果proxyBeanMethods设置为false,则通过Configuration Bean的方法获取Bean,这些Bean不是单例的。
小结
proxyBeanMethods代表了两种不同的SpringBoot模式:
- FULL(proxyBeanMethod = true),每个@Bean方法别调用多次时,返回的组件都是单实例的
- LITE(proxyBeanMethod = false),每个@Bean方法被调用多次时,返回的组件都是新创建的
如果存在组件间的依赖(Bean之间存在依赖),则需要使用FULL模式,否则可以使用Lite模式。