Spring依赖注入(注解版)

2018/08/04 Spring

Spring依赖注入

https://github.com/viakiba/viakiba/tree/master/di

概括

众所周知,Spring 的依赖注入(控制反转)特性一直是 Spring 的核心。在使用 Spring 家族框架时肯定会接触到,大家肯定也都很熟悉。对于使用注解来说,向 Spring 容器注入一个实例可以使用 @Service @Component @Bean @Repository 等注解(默认是单例)。需要从 Spring 容器中取出实例用于实例化字段时,可以使用 @Resource @Autowired,这两个注解分别可以作用于字段/setter函数/构造函数。

举例

项目中使用了 lombok 与 CommandLineRunner 接口来辅助代码验证。这两个的使用可以参考如下链接:

lombok:
  https://www.cnblogs.com/qnight/p/8997493.html
CommandLineRunner 接口:
  https://blog.csdn.net/ruben95001/article/details/78340700

作用于非集合属性

这一个场景主要解释常常使用的方式,即用于非集合属性的注入。 @Resource @Autowired 将被用于属性/方法。

@Resource默认按照名称方式(属性的命名)进行bean匹配,如果按照名称匹配失败,则按照类型匹配。

@Resource(import javax.annotation.Resource;)是J2EE的注解.如果指定了name则只能按照名称匹配。

如果 @Resource 同时制定了type与name ,则找不到会报错。

@Autowired默认按照类型方式进行bean匹配

@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的注解

作用于属性名称

可以看到最后一个类在启动后的属性的实例化情况。 对于@Resource 依赖注入方式

作用于setter / 构造 函数

使用相同的接口与实现,注入关键字 @Resource @Autowired 写在在方法上,使用方式与字段上基本一致 依赖注入方式

作用于抽象类泛型

Dao的代码如下: 依赖注入方式

Service代码的精简 只需要在抽象Service中完成公共方法的编辑即可。无需在其实现类中分别实现。 依赖注入方式

@Lazy 与 @Bean

@Bean 注解可以让方法向Spring容器组合如一个 Bean 。查看bean的注解会发现,该注解会有多个参数供定义。比如:

  • name 可以自会顶该实例对应的名称 可以多个 name = { “name1”, “name2” }
  • 在Configuration注解(javaConfig)类中使用,@Bean 中 可以使用 initMethod 与 destroyMethod 属性,确定声明周期。
  • 这里提一下 @scope 注解,因为其可以和多个注解搭配使用 比如 @Service @bean 等,该注解用于指定bean的作用域 比如 单例 (默认 singleton)/多例 (prototype)以及 request、session、global session作用域。

依赖注入方式

@Lazy 注解,就是指定此实例当需要时才会实例化并匹配到需要的实例属性中。

依赖注入方式

map 与 list 注入

Map依赖注入,会把实现接口的所有实现类注入到 Spring 中,匹配到该字段集合中。

  • key是bean名字;value就是所有实现了BaseService的Bean
  • @Order 注解无法指定排序。按照bean的名字的自然顺序排序。

依赖注入方式

List 依赖注入 会把实现接口的所有实现类注入到 Spring 中,匹配到该字段集合中。

  • 这样会注入所有实现了BaseService的Bean;但是顺序是不确定的,如果我们想要按照某个顺序获取;在Spring4中可以使用@Order或实现Ordered接口来实现。

依赖注入方式

list集合注入与参数化泛型

这个例子就是为了说明,即使是泛型方法,Spring 也可以完成实例化匹配操作。 依赖注入方式

Search

    Table of Contents