【Spring 揭秘(一)】Spring Bean DI and Instantiating
Contents
cheatsheet
如果你赶时间,可以只看这一节的内容。
bean 的实例化方式
- XML 配置时
- 工厂方法
- 静态工厂
- 构造函数
- 注解方式
关于注解方式:
- @Component:可以用于注册所有bean
- @Repository:主要用于注册dao层的bean
- @Controller:主要用于注册控制层的bean
- @Service:主要用于注册服务层的bean
Spring bean 的注入方式
- XML配置
- setter 方法注入
- 构造函数注入
- 工厂方法/静态工厂
- 注解方式注入(
@AutoWired
)
Configuration Metadata
如上图,Spring IoC container 需要 Configuration Metadata
和 POJO
来完成依赖注入。Configuration Metadata
就是我们配置这些类的依赖关系的地方。
configuration metadata
可以分为三种方式。文档中写到:“The configuration metadata is represented in XML, Java annotations, or Java code. It allows you to express the objects that compose your application and the rich interdependencies between such objects.”
Bean 的实例化方式
不讲清前提的讲解都是耍流氓,JavaEE 的课上,老师一来就讲 Bean 的实例化方式一共有三种,然后一大堆 XML 配置就来了。
首先,要澄清的一点,这里讲的 Bean 的实例化方式是在 configuration metadata
为 XML 的情况下才成立。如果 configuration metadata
是注解形式的话,情况就变得更简单了。
对于使用 XML 配置 configuration metadata 时,实例化 bean 有三种方式:构造方法,静态工厂模式,工厂模式。
用一个例子来说明这三种情况:
首先创建 Bar 和 Foo 这两个POJO,并且 Foo 依赖于Bar,使用setter方法进行依赖注入。
|
|
|
|
-
构造方法是最普通的一种,和其他bean的配置一样。
-
静态工厂模式利用静态工厂的设计模式,在XML注册工厂方法,而巧妙之处在于被注入的不是工厂的实例,而是bean的实例。Spring会反射调用 getInstance 得到 bean 实例,并进行依赖注入。
-
普通工厂模式则需要实例化工厂,再实例化bean。
注意三种不能同时使用,要使用其中一种时,需要注释掉下面代码的另外两种即可。
|
|
静态工厂的 Java 代码:
|
|
XML 中 class 属性为leer.moe.springdemo.bean.StaticBarFactory
,factory-method 为 getInstance
。只要这样设置就可以获得Bar的实例,而不是静态工厂的实例。
工厂方法的 Java 代码:
|
|
工厂方法不是静态的,但是对于Spring来说,他也只是一个普通的Bean可以进行实例化和依赖注入。在 XML 配置中可以看到,我们先配置了barFactory
这个工厂的Bean。之后,在bar
中,使用 factory-bean="barFactory"
,使用工厂实例来构建bar实例。
依赖注入
在完成 bean 的实例化后(也就是配置好 bean 的 configuration metadata),我们就可以把 bean 注入到需要使用的地方。依赖注入主要有两种:构造方法注入、setter方法注入和注解方式注入。可以同时使用的。
使用依赖注入的优点?解耦。文档里是这样的说的:“Code is cleaner with the DI principle, and decoupling is more effective when objects are provided with their dependencies.”当然这些都是教条式的,看了一遍不会懂,即使看了很多篇也不会懂。需要不断的练习和在项目中体会。
XML Configuration Metadata :
|
|
|
|
注解 @AutoWired
:
|
|