其他分享
首页 > 其他分享> > Spring 注入方式

Spring 注入方式

作者:互联网

前言

Spring 是 Java 后端程序员必须掌握得一门框架技术,Spring 的横空出世,大大简化了企业级应用开发的复杂性。

Spring 框架中最核心的技术就是:

本文将主要介绍 Spring 中的 IOC 的依赖注入。

 

控制反转IOC

IOC 主要由两种实现方式:

 

依赖注入DI

在 Spring 中依赖注入的形式主要有两种形式:

基于注解 DI 有三种表现形式:

 

三种常规注入

基于属性注入

日常开发中最常使用的方式:

@Service
public class UserServiceImpl implements UserService {

   @Autowired
   private PhoneService phoneService;
   
}
@Service
public class UserServiceImpl implements UserService {

   @Resource
   private PhoneService phoneService;

}

@Autowired 注解和 @Resource 注解的区别:

@Autowired@Resource
Spring 的注解,它的包是 org.springframework.beans.factory.annotation.Autowired 不是Spring的注解,它的包是 javax.annotation.Resource
只按照 byType 注入 默认按照 byName 自动注入
无属性 有两个重要的属性:name 和 type

@Resource 的装配顺序:

  1. 如果同时指定了 name 和 type ,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。

  2. 如果指定了 name ,则从上下文中查找名称匹配的 bean 进行装配,找不到则抛出异常。

  3. 如果指定了 type ,则从上下文中查找类型匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛出异常。

  4. 如果既没有指定 name ,又没有指定 type ,则自动按照 byName 方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

基于setter方法注入

@Service
public class UserServiceImpl implements UserService {

   private PhoneService phoneService;

   @Autowired
   public void setPhoneService(PhoneService phoneService) {
       this.phoneService = phoneService;
  }

}

 

基于构造器注入( Spring 官方推荐)

@Service
public class UserServiceImpl implements UserService {

   private final PhoneService phoneService;

   @Autowired
   public UserServiceImpl(PhoneService phoneService) {
       this.phoneService = phoneService;
  }

}

为何 Spring 官方推荐使用构造器注入呢?

 

接口注入

当我们用上面三种方式注入接口时,接口有多个实现类时,程序启动就会报错,因为 Spring 不知道要注入哪个实现类。

image-20220517100525105

那么要如何解决接口多实现类的注入问题呢?

 

获取Bean的方式

在 Spring 项目中,有时候需要手动去获取 bean,手动获取的方式需要通过 applicationContext ,有以下几种形式:

 

总结

本文主要记录了 Spring 中基于注解的 DI 几种方式,接口多个实现的注入方式,如何通过 applicationContext 手动获取 bean 。

 

标签:applicationContext,name,方式,Spring,getBean,public,注入
来源: https://www.cnblogs.com/codechen8848/p/16291137.html