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();
 }
}

Spring之基于注解的自动装配_第1张图片

首先根据所需要的组件类型到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,此时能装配则装配,无法装配则使用属性的默认值

你可能感兴趣的:(spring,java,后端)