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配合使用