Spring学习-注解详解

@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时,注入的优先等级如下:

  1. 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;
  2. 如果查询的结果不止一个,就根据名称来查找
  3. 如果存在@bean 和 @Component 的名称相同,那么优先用@bean 注解的类
  4. 可以用@bean(name=”customName”) 和 @qualifier(value=”customName”) 配合指定,优先级更高

当有一下情况时,@Autowired会报错:

  1. spring容器中查询结果为空。解决方法是使用required=false
  2. 查询结果不止一个,而且名称和注入对象名称不一样

猜你喜欢

转载自blog.csdn.net/shrimp_xx/article/details/79915525