spring学习:五(第一部分):在IOC容器中装配Bean

一、Bean基本配置

装配一个 bean和bean的命名

<bean id="car" class="com.smart.fb.Car"/>

1.id的命名规范:必须以字母开始,后面可以是字母、数字、连字符、下划线、句号、冒号等完整约束的符号,逗号和空格都是非法的。如果希望使用特殊字符进行命名,则可以使用name属性。

id和name都可以指定多个名字,名字之间用逗号、分号或者空格进行分割,如:

<bean id="car,123,$car" name="#car1,123,$car" class="com.smart.simple.Car"></bean>

用户可以使用getBean("car1"),getBean("123"),getBean("$car")获取到Ioc容器中的car Bean

spring配置文件不允许出现两个相同id的bean,但是却可以出现两个相同name的bean。多个name相同的 bean,使用getBean(name)获取Bean时,将返回后边声明的那个bean

如果id,name属性都未指定,如

<bean class="com.smart.simple.Car"></bean>

那么spring自动将全限定类名作为Bean的名称,这时用户可以通过getBean("com.smart.simple.Car")获取 bean

二、依赖注入

1.属性注入

指的是使用setXXX()方法注入Bean的属性值或依赖对象,具有可选择性和灵活性高的优点,是实际应用中最常才用的注入方式。

属性注入要求Bean提供一个默认的构造方法,并为需要注入的属性提供对应的 setter方法。

package com.smart.scope;

public class Car {

	private String color;
	private String brand;
	private double price;

	public void setPrice(double price) {
		this.price = price;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public void setColor(String color) {
		this.color = color;
	}

}

2.配置文件注入

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<bean id="car" class="com.smart.attr.Car">
		<property name="brand" value="吉利CT5" />
		<property name="maxSpeed" value="100" />
		<property name="price" value="1000.00" />
	</bean>
	<bean id="boss" class="com.smart.attr.Boss">
		<property name="car">
			<ref parent="car" />
		</property>
	</bean>
</beans>

java属性命名特殊规范:

一般情况下,属性变量名才都以小写字母开头,特殊情况考虑到一些特定意义的的大写英文缩略词(XML等),必须满足变量的前两个字母要么全部大写,要么全部小写,这样的属性在启动spring容器的时候会报错

3.构造函数注入

按类型匹配入参

<!--构造函数注入:type -->
	<bean id="car1" class="com.smart.ditype.Car">
		<constructor-arg type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg type="double">
			<value>20000</value>
		</constructor-arg>
	</bean>

按索引匹配入参

  <bean id="boss" class="com.smart.auto.Boss" autowire="constructor">
     <constructor-arg index="0" value="John"/>
  </bean>

联合使用类型和索引匹配入参:用于解决有多个重载的构造方法,且入参数量相同产生的问题

<!--构造函数注入:type&index -->
	<bean id="car3" class="com.smart.ditype.Car">
		<constructor-arg index="0" type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg index="1" type="java.lang.String">
			<value>中国一汽</value>
		</constructor-arg>
		<constructor-arg index="2" type="int">
			<value>200</value>
		</constructor-arg>
	</bean>

循环依赖问题:解决方法是将构造函数注入方式调整为属性注入方式即可

4.工厂方式注入(不推荐使用,因为工厂方法需要额外的类和代码,这些功能和业务是没有关系的)

非静态工厂方法:由于是非静态的,所以需要先定义一个工厂类的bean

<!-- 工厂方法-->
	<bean id="carFactory" class="com.smart.ditype.CarFactory" />
	<bean id="car5" factory-bean="carFactory" factory-method="createHongQiCar">

静态工厂:直接在<bean>中通过class属性指定工厂类,然后通过factory-method指定对应的工厂方法

<bean id="car6" class="com.smart.ditype.CarFactory"
		factory-method="createCar"></bean>

三、注入参数详解

1.字面值 

 指可用字符串表示的值,这些值可以通过<value>元素标签进行注入

<![CDATA[]]>作用是让XML解析器将标签中的字符串当做普通文本解析。

2.引用其他bean

<bean id="brand"
		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject">
			<ref bean="car" />
		</property>
		<property name="targetMethod">
			<value>getBrand</value>
		</property>
	</bean>

<ref>元素有三个属性:

  • bean:通过该属性引用同一容器或父容器中的bean
  • local:通过该属性只能引用同意配置文件中的bean
  • parent:引用父容器中的bean

3.内部bean

如果car只被boss引用,而不被容器中任何其他bean引用,则可以将car以内部bean的方式注入到Boss中

<!-- 内部Bean -->
	<bean id="boss2" class="com.smart.attr.Boss">
		<property name="car">
			<bean class="com.smart.attr.Car">
				<property name="maxSpeed" value="200" />
				<property name="price" value="2000.00" />
			</bean>
		</property>
	</bean>

4.null值

使用专门的null标签:<null/>

5.级联属性

下边的代码直接为car属性的brand属性赋值

<bean id="sportsCar" class="com.smart.attr.SportsCar">
		<property name="brand">
			<bean id="car.brand"
				class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
			</bean>
		</property>
	</bean>

6.集合类型属性

List

<bean id="favoriteList"
		class="org.springframework.beans.factory.config.ListFactoryBean">
		<property name="targetListClass" value="java.util.LinkedList" />
		<property name="singleton" value="false" />
		<property name="sourceList">
			<list>
				<value>看报</value>
				<value>赛车</value>
				<value>高尔夫</value>
			</list>
		</property>
	</bean>

Set:使用<set></set>标签,其他同list

Map

<property name="jobs">
	<map>
		<entry>
			<key><value>AM</value></key>
			<value>会见客户</value>
		</entry>
		<entry>
			<key><value>PM</value></key>
			<value>公司内部会议</value>
		</entry>
	</map>
</property>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章