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. 查询结果不止一个,而且名称和注入对象名称不一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值