首页 > 编程知识 正文

@autowired注解讲解

时间:2023-11-19 05:42:50 阅读:288703 作者:VLIR

本篇文章将从以下几个方面详细阐述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());
    }
}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。