@Bean是否要跟@Configuration配合使用
1. @Bean能不能单独在方法上注解?可以
,但是并不会注入到Spring的IOC容器中,相当于有没有注解都一样
2. @Bean是否要跟@Configuration配合使用?这个问题的出发点应该是:一. @Bean单独使用时,能不能将方法返回的对象注入到SpringIOC容器中? 二. @Bean注解方法时,要求方法返回的bean是从SpringIOC容器获取的而不是新创建的,即保证单例;三 @Bean注解方法时,是不是一定要配合@Configuration注解才能保证获取的bean是从IOC容器获取的而不是新创建的,用@Component等其他注解行不行?
下面进行实验:
-
@Bean单独使用:
import java.util.Scanner; public class User { @Bean public Scanner getScanner(){ System.out.println("Create Scannner... ..."); return new Scanner(System.in); } }
@Controller public class SampleController { @RequestMapping("/getUser") public void test(){ System.out.println(new User().getScanner().hashCode()); } }
两次访问localhost:8080/getUser,两次分别得到的结果为:
/** 第 1 次 */ Create Scannner... ... 1188664067 /** 第 2 次 */ Create Scannner... ... 661369306
结论:@Bean单独注解方法时,每次调用方法都是执行方法内的逻辑并返回新创建的对象bean,而且SpringIOC并没有该bean的存在!!!
-
@Bean + @Configuration 使用时:
@Controller @Configuration public class SampleController { @Bean public User getUser(){ System.out.println("Create User... ..."); return new User(); } @RequestMapping("/getUser") public void test(){ System.out.println(getUser()); } }
在启动服务器过程中,观察到: 说明@Bean注解的方法返回的实例已经注入到SpringIOC容器中了,而不是在用户访问的时候才去调用方法产生bean ; 两次访问localhost:8080/getUser,两次分别得到的结果为:
/* 第 1 次*/ com.hxun.domain.User@45b189b /* 第 2 次*/ com.hxun.domain.User@45b189b
结论:@Bean + @Configuration ,在调用@Bean注解的方法时返回的实例bean是从IOC容器获取的,已经注入的,且是单例的,而不是新创建的。
-
@Bean + @Component 使用时:
@Controller @Component public class SampleController { @Bean public User getUser(){ System.out.println("Create User... ..."); return new User(); } @RequestMapping("/getUser") public void test(){ System.out.println(getUser()); } }
在服务器启动过程中,同样观察到: 说明此时@Bean注解的方法返回的bean也已经注入到SpringIOC容器中了。 两次访问localhost:8080/getUser,两次分别得到的结果为:
/* 第 1 次 */ Create User... ... com.hxun.domain.User@7a2a5b82 /* 第 2 次 */ Create User... ... com.hxun.domain.User@1db5de40
结论:@Bean + @Component,虽然@Bean注解的方法返回的实例已经注入到SpringIOC容器中,但是每次调用@Bean注解的方法时,都会创建新的对象实例bean返回,并不会从IOC容器中获取。
因此,要实现在@Bean注解方法时,要求从IOC容器中返回实例bean而不是每次都新创建一个对象,则@Bean要跟@Configuration配合使用