提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
springboot @Component和@Configuration 下使用@bean区别。
提示:以下是本篇文章正文内容,下面案例可供参考
一、@Component
示例:定义两个类使用@bean方式注入
@Component
public class TestBeanConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public RoleService roleService() {
System.out.println(userService());
System.out.println(userService());
return new RoleService();
}
}
@SpringBootApplication(scanBasePackages = {"pers.yzl.smart.framework.**", "pers.learning.**"})
@ComponentScan(basePackages = {"pers.yzl.smart.framework.**", "pers.learning.**"})
@Slf4j
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext application = SpringApplication.run(Application.class, args);
TestBeanConfig testBeanConfig = application.getBean(TestBeanConfig.class);
System.out.println(testBeanConfig);
}
}
输出结果:
pers.learning.service.UserService@2d313c8c
pers.learning.service.UserService@2df65a56
pers.learning.config.TestBeanConfig@37b01ce2
二、@Configuration
示例:定义两个类使用@bean方式注入,启动类不便
@Configuration
public class TestBeanConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public RoleService roleService() {
System.out.println(userService());
System.out.println(userService());
return new RoleService();
}
}
输出结果:
pers.learning.service.UserService@2d313c8c
pers.learning.service.UserService@2df65a56
pers.learning.config.TestBeanConfig$$EnhancerBySpringCGLIB$$a8ee1892@7b5021d1
总结
@Component和@Configuration 下使用@bean区别:
@Component在注入RoleService时, 执行userService()是按照方法执行,每次都是一个新的实例。
@Configuration在注入RoleService时,执行userService()会首先检查是否已经有userService的实例,每次都是同一个实例。
@Configuration中的@Bean 注解的方法都会被动态代理,每次都是同一个实例。