Spring 依赖注入
支持3种方式依赖注入:
- 属性注入
- 构造器注入
- 工厂方法注入(很少使用,不推荐)
1. 属性注入
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值
属性注入是实际应用中最常用的注入方式
<!-- 通过全类名的方式配置bean --> <bean id="helloWorld" >class="com.axon.spring.helloworld.HelloWorld"> <property name="username" >value="axon"></property> </bean>
2. 构造器注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性
- 按索引匹配入参
<bean id="car" >class="com.axon.spring5.Car"> <constructor-arg value="奥迪" index="0"></constructor-arg> <constructor-arg value="长春一汽" index="1"></constructor-arg> <constructor-arg value="50000" index="2"></constructor-arg> </bean>
- 按类型匹配入参
<bean id="car" >class="com.axon.spring5.Car"> <constructor-arg value="奥迪" type="java.lang.String"></constructor-arg> <constructor-arg value="长春一汽" type="java.lang.String"></constructor-arg> <constructor-arg type="double"><value>500060</value></constr>uctor-arg> </bean>
3. 工厂方法注入
- 静态工厂方法注入
调用静态工厂方法创建Bean,是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法, 而不同关心创建对象的细节.
要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.
<bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance"> <!-- 可以通过 constructor-arg >子节点为静态工厂方法指定参数 --> <constructor-arg value="2"></constructor-arg> </bean>
- 实例工厂方法注入
实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.
要声明通过实例工厂方法创建的 Bean:
- 在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean.
- 在 factory-method 属性里指定该工厂方法的名称.
- 使用 construtor-arg 元素为工厂方法传递方法参数.
<!-- ①. 创建工厂对应的 bean --> <bean id="simpleDateFormat" class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd hh:mm:ss"></constructor-arg> </bean>
<!-- ②. 有实例工厂方法来创建 bean 实例 --> <!-- factory-bean 指向工厂 bean, factory-method 指定工厂方法(了解) --> <bean id="datetime" factory-bean="simpleDateFormat" factory-method="parse"> <!-- 通过 constructor-arg 执行调用工厂方法需要传入的参数 --> <constructor-arg value="1990-12-12 12:12:12"></constructor-arg> </bean>
字面值
字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。
基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式
若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来
引用其它 Bean
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
<bean id="service" class="com.axon.spring.ioc.ref.Service"></bean>
<bean id="action" class="com.axon.spring.ioc.ref.Action">
<!--为service属性赋值,因为service属性是一个bean类型,可以使用ref指向ioc容器中的其他bean-->
<property name="service" ref="service"></property>
</bean>
内部bean
也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性
内部 Bean 不能使用在任何其他地方
<!-- 声明使用内部 bean --> <bean id="service" class="com.axon.spring.ref.Service"> <property name="dao"> <!-- 内部 bean, 类似于匿名内部类对象. 不能被外部的 bean 来引用, 也没有必要设置 id 属性 --> <bean class="com.atguigu.spring.ref.Dao"> <property name="dataSource" value="c3p0"></property> </bean> </property> </bean>
注入参数:null值
可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值
<bean id="dao" class="com.axon.spring.ref.Dao"> <!-- 为 Dao 的 dataSource 属性赋值为 null, 若某一个 bean 的属性值不是 null, 使用时需要为其设置为 null(了解) --> <property name="dataSource"><null/></property> </bean>