JavaWeb 笔记之 Spring 依赖注入

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:

  1. 在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean.
  2. 在 factory-method 属性里指定该工厂方法的名称.
  3. 使用 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>

猜你喜欢

转载自blog.csdn.net/wm1203618455/article/details/82985808