Spring之基于注解的自动装配

场景模拟:

参考基于xml的自动装配 在UserController中声明UserService对象 在UserServiceImpl中声明UserDao对象

Autowired注解实现:

在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。以后我们在项目中的正式用法就是这样。

@Controller
public class UserController {
  @Autowired
  private UserService userService;
  public void saveUser(){
    userService.saveUser();
 }
}
public interface UserService {
  void saveUser();
}
@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UserDao userDao;
  @Override
  public void saveUser() {
    userDao.saveUser();
 }
}
public interface UserDao {
  void saveUser();
}
@Repository
public class UserDaoImpl implements UserDao {
  @Override
  public void saveUser() {
    System.out.println("保存成功");
 }
}

Autowired注解其他细节:

Autowired注解可以标记在构造器和set方法上

@Controller
public class UserController {
  private UserService userService;
 
  @Autowired
  public UserController(UserService userService){
    this.userService = userService;
 }
  public void saveUser(){
    userService.saveUser();
 }
}
@Controller
public class UserController {
  private UserService userService;
 
  @Autowired
  public void setUserService(UserService userService){
    this.userService = userService;
 }
  public void saveUser(){
    userService.saveUser();
 }
}

首先根据所需要的组件类型到IOC容器中查找 能够找到唯一的bean:直接执行装配 如果完全找不到匹配这个类型的bean:装配失败 和所需类型匹配的bean不止一个 没有@Qualifier注解:根据@Autowired标记位置成员变量的变量名作为bean的id进行 匹配 能够找到:执行装配 找不到:装配失败 使用@Qualifier注解:根据@Qualifier注解中指定的名称作为bean的id进行匹配 能够找到:执行装配 找不到:装配失败

@Controller
public class UserController {
  @Autowired
  @Qualifier("userServiceImpl")
  private UserService userService;
  public void saveUser(){
    userService.saveUser();
 }
}

@Autowired中有属性required,默认值为true,因此在自动装配无法找到相应的bean时,会装 配失败 可以将属性required的值设置为true,则表示能装就装,装不上就不装,此时自动装配的属性为 默认值 但是实际开发时,基本上所有需要装配组件的地方都是必须装配的,用不上这个属性。

@Autowired:实现自动装配功能的注解 1、@Autowired注解能够标识的位置 a>标识在成员变量上,此时不需要设置成员变量的set方法 b>标识在set方法上 c>标识在为当前成员变量赋值的有参构造上 2、@Autowired注解的原理 a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值 b>若有多个类型匹配的bean,此时会自动转换为byName的方式实现自动装配的效果 即将要赋值的属性的属性名作为bean的id匹配某个bean为属性赋值 c>若byType和byName的方式都无妨实现自动装配,即IOC容器中有多个类型匹配的bean 且这些bean的id和要赋值的属性的属性名都不一致,此时抛异常:NoUniqueBeanDefinitionException d>此时可以在要赋值的属性上,添加一个注解@Qualifier 通过该注解的value属性值,指定某个bean的id,将这个bean为属性赋值

注意:若IOC容器中没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException 在@Autowired注解中有个属性required,默认值为true,要求必须完成自动装配 可以将required设置为false,此时能装配则装配,无法装配则使用属性的默认值

经验分享 程序员 微信小程序 职场和发展