@Bean
-
该注释的属性的名称和语义类似于Spring XML模式中bean的元素的名称和语义。@Bean指示方法产生一个由Spring容器管理的bean。
-
源码如下:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
/** @deprecated */
@Deprecated
Autowire autowire() default Autowire.NO;
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default "(inferred)";
}
由源码可知,@Bean可以用在方法和注释上。
使用例子
- 用在方法上:
public class DataSource {
private String url;
private String userId;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "DataSource{" +
"url='" + url + '\'' +
", userId='" + userId + '\'' +
", password='" + password + '\'' +
'}';
}
}
@Configuration
public class DataBaseConfig {
@Bean("dataSource")
public DataSource getDataSource(){
DataSource dataSource = new DataSource();
dataSource.setUserId("jingsi");
dataSource.setPassword("123456");
dataSource.setUrl("www");
return dataSource;
}
}
@RestController
public class IndexController {
@Autowired
// @Resource(name = "user")
private User user;
@Autowired
private DataSource dataSource;
@GetMapping(value = "index")
public String index(){
return "hello world!"+"dataSource:"+dataSource;
}
}
- @Bean可以为Bean同时定义多个别名,但是别名不能为空字符串。
@Configuration
public class DataBaseConfig {
@Bean({"dataSource","data2"})
public DataSource getDataSource(){
DataSource dataSource = new DataSource();
dataSource.setUserId("jingsi");
dataSource.setPassword("123456");
dataSource.setUrl("www");
return dataSource;
}
}
- 一般情况下,官网介绍,@Bean与@Configuration联动使用,但是我试了一下,@Bean与@Component一起使用一样生效,官网有介绍区别,这边还没有过多的理解。不过可以知道的是,与@Component一起使用,initMethod属性不生效,与@Configuration一起使用,initMethod属性有效。
@Component
public class DataBaseConfig {
@Bean({"dataSource","data2"},initMethod = "toString")
public DataSource getDataSource(){
DataSource dataSource = new DataSource();
dataSource.setUserId("jingsi");
dataSource.setPassword("123456");
dataSource.setUrl("www");
return dataSource;
}
}