下面是对@Autowired、@Bean和@Qualifier的详细讲解:
@Autowired自动装配
概念
@Autowired
注解是用于自动将某个类型的 bean 注入到另一个 bean 中的注解。在 Spring 容器中,如果一个接口只被一个具体实现类所实现,那么 Spring 在注入时会自动识别该实现类,并将其注入到另一个 bean 中。
示例
假如有一个UserService
接口,它有两个实现类分别是UserServiceImpl
和UserServiceImpl2
,我们需要将UserServiceImpl2
作为被注入对象。
首先,我们需要在UserServiceImpl2
class 上添加@Service
注解,以将该类注入到 Spring 容器:
@Service
public class UserServiceImpl2 implements UserService {
// 省略具体实现方法
}
然后,在需要注入UserServiceImpl2
的 class 上,使用@Autowired
注解进行注入:
@Service
public class UserController {
@Autowired
UserService userService; // 代码中使用注解注入 UserServiceImpl2 实例
// 省略具体实现方法
}
@Bean注入
概念
@Bean
注解可以用来将某个对象注册为一个 bean,并将其交由 Spring 容器来管理。
示例
我们可以在一个配置文件中定义一个返回UserDaoImpl
的@Bean
:
@Configuration
public class AppConfig {
@Bean
UserDao userDao() {
return new UserDaoImpl();
}
}
在这个@Configuration
类中,方法名就是定义的 bean 名称,而方法返回值就是 bean 的实例。这意味着我们可以在任何需要userDao
的地方使用自动装配,例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
// 省略具体实现方法
}
@Primary注解
概念
当我们有多个同一个接口的实现类时,我们需要使用@Primary
注解来标识一个默认的实现类。
示例
我们假设有两个实现了UserService
接口的类UserServiceImpl
和UserServiceImpl2
,并且有一个需要注入 UserService 的类UserController
,Spring 怎么知道注入哪个 UserService 实现类呢?
我们可以在其中一个实现类上添加@Primary
注解,来告诉 Spring 使用哪个默认的实现类:
@Service
@Primary
public class UserServiceImpl2 implements UserService {
// 省略具体实现方法
}
@Service
public class UserServiceImpl implements UserService {
// 省略具体实现方法
}
这样,在使用自动装配时,如果没有指定使用 UserService 实现类,Spring 就会使用带有@Primary
注解的 UserService 实现类。
@Qualifier注解
概念
@Qualifier
注解用于针对一个接口有多个实现类的情况下,指定使用哪个实现类进行注入。
示例
我们假设有两个实现了UserService
接口的类UserServiceImpl
和UserServiceImpl2
,我们需要在需要注入 UserService 的类中,使用@Qualifier
注解指定使用哪个 UserService 实现类进行注入:
@Service
public class UserController {
@Autowired
@Qualifier("userServiceImpl2") // 显式指定使用 UserServiceImpl2
UserService userService;
// 省略具体实现方法
}
在@Qualifier
中使用实现类的名称,来告诉 Spring 使用哪个具体的实现类。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:@Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解 - Python技术站