本篇文章将从以下几个方面详细阐述java中的@autowired注解:
一、@autowired注解概述
@autowired是Spring框架中的注解之一,用于自动注入bean。注入的方式是根据类型进行匹配,如果类型匹配多个bean,则根据变量名进行匹配。
在使用@autowired注解时需要注意以下几点:
1、@autowired是通过byType的方式进行匹配的,因此如果有多个同类型的bean,会抛出异常。
2、如果要使用byName进行匹配,可以使用@Qualifier注解指定bean的名称。
3、如果要进行可选注入,可以使用@autowired(required=false)。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User queryUserById(String userId) {
return userDao.queryUserById(userId);
}
}
二、@autowired与构造函数
在Spring中,使用构造函数注入bean是最佳实践。在使用@autowired注解时,可以使用构造函数注入bean。
使用构造函数注入bean的好处在于可以避免因为字段注入带来的不确定性。同时,通过构造函数注入还可以保证bean的不变性。
@Service
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User queryUserById(String userId) {
return userDao.queryUserById(userId);
}
}
三、@autowired和注解配置
在Spring中,可以使用注解配置来完成bean的创建。如果我们需要在注解配置中使用@autowired注解,可以使用@Configuration注解标注一个配置类,并在其中使用@Bean注解来创建bean。
需要注意的是,@autowired只能用于注入spring管理的bean,因此需要使用@Configuration注解标注的配置类要放到spring的扫描路径内。
@Configuration
@ComponentScan("com.example.demo")
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl(userDao());
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
@Service
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User queryUserById(String userId) {
return userDao.queryUserById(userId);
}
}
四、@autowired和多个实现bean
在Spring中,如果我们有多个实现bean,可以使用@Qualifier注解指定bean的名称来完成注入。需要注意的是,使用@Qualifier注解时需要和@Autowired注解一起使用。
@Service
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Autowired
public UserServiceImpl(@Qualifier("userDaoImpl") UserDao userDao) {
this.userDao = userDao;
}
@Override
public User queryUserById(String userId) {
return userDao.queryUserById(userId);
}
}
@Repository
public class UserDaoImpl implements UserDao {
}
@Repository
public class UserDaoSecondImpl implements UserDao {
}
五、@autowired和列表注入
在Spring中,如果我们需要一次注入多个相同类型的bean,可以使用List进行注入。使用List注入时,可以采用以下两种方式:
1、直接注入List类型。
2、使用@Qualifier注解指定多个bean的名称,并使用@Autowired注解进行列表注入。
@Service
public class UserServiceImpl implements UserService {
private List<UserDao> userDaos;
@Autowired
public UserServiceImpl(List<UserDao> userDaos) {
this.userDaos = userDaos;
}
@Override
public User queryUserById(String userId) {
for (UserDao userDao : userDaos) {
User user = userDao.queryUserById(userId);
if (user != null) {
return user;
}
}
return null;
}
}
使用@Qualifier注解进行列表注入:
@Service
public class UserServiceImpl implements UserService {
private List<UserDao> userDaos;
@Autowired
public UserServiceImpl(@Qualifier("userDaos") List<UserDao> userDaos) {
this.userDaos = userDaos;
}
@Override
public User queryUserById(String userId) {
for (UserDao userDao : userDaos) {
User user = userDao.queryUserById(userId);
if (user != null) {
return user;
}
}
return null;
}
}
@Configuration
public class AppConfig {
@Bean(name = "userDaoImpl")
public UserDao userDaoImpl() {
return new UserDaoImpl();
}
@Bean(name = "userDaoSecondImpl")
public UserDao userDaoSecondImpl() {
return new UserDaoSecondImpl();
}
@Bean(name = "userDaos")
public List<UserDao> userDaos() {
return Arrays.asList(userDaoImpl(), userDaoSecondImpl());
}
}