@Bean
@Bean是一个方法级别上的注解,主要用在@Configuration注解类里,也可以用在@Component。
默认添加ID为方法名的bean,也可以通过name指定别名
@Bean
@Bean(name="")
@Bean(name={"",""})
public Bean name(){}
PS:@Component也可以使用value指定bean的id。
默认情况下,生成的bean在spring是单例的,如果需要每个注入的bean是不同的实例,可以添加
@Scope(value = "prototype")
@Autowired和@Bean
示例代码如下:
public interface ServiceIF{
void print();
}
@Component
public class ServiceFactory{
@Bean
public ServiceIF serviceImpl(){
return new ServiceIF(){
public void print(){
System.out.println("Bean serviceImpl");
}
}
}
@Bean
public ServiceIF serviceImpl2(){
return new ServiceIF(){
public void print(){
System.out.println("Bean ServiceImpl2");
}
}
}
}
@Component
public class ServiceImpl implements ServiceIF(){
public void print(){
System.out.println("Class ServiceImpl");
}
}
@RunWith(SpringRunner.class)
@EnableAutoConfiguration
@SpringBootTest(classes = Application.class)
public class AnnotationTest {
@Autowired
private ServiceIF serviceImpl;
@Test
public void test() {
serviceImpl.sout("123");
}
}
在方法上添加@Bean或者对实现类添加@Component注解都能在测试类中实现ServiceIF的注入。
当spring容器存在多个符合注入条件的bean时,注入的优先等级如下:
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
- 如果查询的结果不止一个,就根据名称来查找
- 如果存在@bean 和 @Component 的名称相同,那么优先用@bean 注解的类
- 可以用@bean(name=”customName”) 和 @qualifier(value=”customName”) 配合指定,优先级更高
当有一下情况时,@Autowired会报错:
- spring容器中查询结果为空。解决方法是使用required=false
- 查询结果不止一个,而且名称和注入对象名称不一样