Bean的默认名称是首字母小写的类型名,可以通过使用@Component、@Service、@Controller、@Bean等注解创建Bean的时候自定义该Bean的名称。
@Service("orderService") // 显式指定名称为 orderService
public class UserService {
// ...
}Spring的注解,先按照类型名找,类型名有多个匹配的话再按照字段名找。
类型名没找到
退出
类型名找到了
继续 ------>
有@Qualifier()注解
无@Qualifier()注解
继续 ------>
有@Primary注解
无@Primary注解
继续 ------>
同类型Bean只有一个
同类型Bean有多个
@Autowired默认required=true,找不到匹配的Bean会抛出异常。设置为false时,找不到Bean则注入null:
@Component
public class UserService {
@Autowired(required = false) // 找不到Bean时注入null,不会抛异常
private OptionalService optionalService;
}@Primary的使用
@Component
public class UserService {
@Autowired
private UserRepository userRepository; // 会注入MySqlUserRepository
}
@Component
@Primary // 标记为主要的实现
public class MySqlUserRepository implements UserRepository {}
@Component
public class RedisUserRepository implements UserRepository {}@Qualifier的使用
@Component
public class UserService {
@Autowired
@Qualifier("redisUserRepository") // 明确指定要注入的Bean
private UserRepository userRepository;
}这个注解是Java自带的JSR-250标准注解。Spring引入之后主动支持了这个注解,把它也作为了依赖注入的注解。它首先是根据名称查找,再按照类型查找。
先按照名称查找
会尝试找Bean名称为字段名的对象:
@Resource
private UserRepository userRepository; // 查找名为"userRepository"的Bean也可以显式指定名字,查找Bean名称为"userRepo1"的对象:
@Resource(name = "userRepo1")
private UserRepository userRepository;再按照类型查找
如果显式指定了名字但是没找到,就直接报错。如果没显式指定名字,但是按名称没找到,就会根据类型去容器中找匹配的Bean。如果找出来了多个,也会报错,只会返回找到的唯一匹配类型的Bean。
@Resource还可以通过type属性指定类型来限制查找范围:
@Resource(name = "userRepo1", type = UserRepository.class)
private UserRepository userRepository;
// 或者只指定类型
@Resource(type = MySqlUserRepository.class)
private UserRepository userRepository;@Resource // 如果有多个UserRepository实现且没有名为userRepository的Bean
private UserRepository userRepository; // 会报错:找到多个类型匹配的Bean@Autowired按类型查找通常比@Resource按名称查找效率更高。这是因为:
在大型应用中,如果没有特殊需求,推荐使用@Autowired。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。