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 也可以完成实例化匹配操作。