Spring竟然支持这么多数据类型的注入方式!

开发 前端
使用@Lazy注解后,注入的将会是一个代理对象,只有真正使用到的时候才会去真实的获取具体的bean。

环境:Spring5.3.23

1. Optional

该类是java1.8提供,java.util.Optional<T>。

static class CommonDAO {
}
static class CommonService {
  @Resource
  private Optional<CommonDAO> optional ;
  @Override
  public String toString() {
    return "CommonService [optional=" + optional.orElseGet(() -> null) + "]";
  }
}
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CommonDAO.class, CommonService.class)) {
  System.out.println(context.getBean(CommonService.class)) ;
}

输出

CommonService [optional=xxx.CommonDAO@12d4bf7e]

2. ObjectFactory

该类Spring提供,org.springframework.beans.factory.ObjectProvider

static class CommonService {
  @Resource
  private ObjectProvider<CommonDAO> provider ;
  @Override
  public String toString() {
    return "CommonService [provider=" + provider.getIfAvailable() + "]";
  }
}

输出

CommonService [provider=xxx.CommonDAO@11a9e7c8]

3. Provider

static class CommonService {
  @Resource
  private javax.inject.Provider<CommonDAO> provider ;
  @Override
  public String toString() {
    return "CommonService [provider=" + provider.get() + "]";
  }
}

输出

CommonService [provider=xxx.CommonDAO@2f177a4b]

注意:如果你的环境中没有javax.inject.Provider,你需要引入以下包:

<dependency>
  <groupId>javax.inject</groupId>
  <artifactId>javax.inject</artifactId>
  <version>1</version>
</dependency>

4. 数组

static interface DAO {}
static class DogDAO implements DAO {}
static class CatDAO implements DAO {}
static class CommonService {
  @Resource
  private DAO[] daos ;
  @Override
  public String toString() {
    return "CommonService [daos=" + Arrays.toString(this.daos) + "]";
  }
}

输出

CommonService [daos=[xxx.DogDAO@4445629, xxx.CatDAO@45b9a632]]

5. Collection集合

static class CommonService {
  @Resource
  private List<DAO> daos ;
  @Override
  public String toString() {
    return "CommonService [daos=" + daos + "]";
  }
}

输出

CommonService [daos=[xxx.DogDAO@309e345f, xxx.CatDAO@56a6d5a6]]

6. Map集合

static class CommonService {
  @Resource
  private Map<String, DAO> daos ;
  @Override
  public String toString() {
    return "CommonService [daos=" + daos + "]";
  }
}

输出

CommonService [daos={dataTypeInejctMain.DogDAO=xxx.DogDAO@4445629, dataTypeInejctMain.CatDAO=xxx.CatDAO@45b9a632}]

7. 特殊说明

7.1 使用@Value注解

1. 注入普通字面量

static class CommonService {
  @Value("${pack.name}")
  private String name ;


  @Override
  public String toString() {
    return "CommonService [name=" + name + "]";
  }
}
// 注备环境
pack.name=中国🇨🇳

输出

CommonService [name=中国🇨🇳]

2. 根据SpEL表达式注入

static class CommonService {
  @Value("#{${pack.name}}")
  private CommonDAO dao ;


  @Override
  public String toString() {
    return "CommonService [name=" + dao + "]";
  }
}
// 注备环境, 这里是配置的其它bean的名称
pack.name=commonDao
// 注册Bean
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
  // ...
  context.registerBean("commonDao", CommonDAO.class) ;
  context.register(CommonService.class) ;
  // ...
  System.out.println(context.getBean(CommonService.class)) ;
}

输出

CommonService [name=xxx.CommonDAO@29176cc1]

3. 注入基本数据

static class CommonService {
  // 会自动将值转换为Integer
  // 只要Spring的类型转换器支持的都可以通过下面方式注入
  @Value("666")
  private int id ;


  @Override
  public String toString() {
    return "CommonService [id=" + id + "]";
  }
}

输出

CommonService [id=666]

7.2 使用@Lazy注解

使用@Lazy注解后,注入的将会是一个代理对象,只有真正使用到的时候才会去真实的获取具体的bean。

static class CommonService {
  @Resource
  @Lazy
  private CommonDAO commonDao ;
  @Override
  public String toString() {
    return "CommonService [commonDao=" + commonDao.getClass() + "]";
  }
}

输出

CommonService [commonDao=class xxx.CommonDAO$$EnhancerBySpringCGLIB$$39f36385]

以上是本篇文章的全部内容,希望对你有所帮助。

完毕!!!

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2023-09-14 08:16:50

Lazy注解null

2019-07-05 15:52:03

数据科学家大数据机器学习

2020-06-01 08:04:18

三目运算符代码

2021-02-03 20:19:08

Istio流量网格

2021-05-11 07:42:59

BeanSpring属性

2018-06-05 11:06:05

模块化数据中心管理

2022-03-03 07:00:43

Mybatiswhere标签

2021-06-10 09:00:33

单例模式数据库

2021-02-03 08:24:32

JavaScript技巧经验

2020-12-01 08:19:15

Redis

2015-04-09 14:34:06

C语言数据类型计算机系统支持

2015-04-03 10:06:12

C语言数据类型

2021-05-27 07:54:21

JavaStateAQS

2020-07-21 18:37:14

代码条件变量

2012-07-17 09:16:16

SpringSSH

2019-08-12 11:40:48

数据库SQLite3数据类型

2021-10-11 08:21:23

@Valuespringspring框架

2021-09-03 00:31:17

iPhone手机截图

2015-03-27 10:20:41

谷歌地图谷歌伟大

2015-07-16 10:43:35

点赞
收藏

51CTO技术栈公众号