Spring 装配Bean 可分为基于XML的配置,基于注解的配置,基于Java类的配置
一 实体类
package com.learn.bean;
public class Car {
private String color;
private String brand;
private String maxSpeed;
public Car(){
}
public Car(String color,String brand,String maxSpeed){
this.color = color;
this.brand =brand;
this.maxSpeed = maxSpeed;
}
public void show(){
System.out.println("car:color" + color);
System.out.println("car:brand" + brand);
System.out.println("car:maxSpeed" + maxSpeed);
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(String maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
Boss类中包含Car类
package com.learn.bean;
public class Boss {
private Car car;
public Boss(){
}
public Boss(Car car){
this.car = car;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
一 基于XML的配置
基于XML的配置可分为基于属性的配置和基于构造函数的配置
1.1 基于属性的依赖注入
<!--不指定属性值-->
<bean id="car" class="com.learn.bean.Car"/>
<bean name="car2" class="com.learn.bean.Car"></bean>
<bean class="com.learn.bean.Car"></bean>
<!--spring 属性注入 使用属性注入 必须为bean提供一个不带参数的构造函数-->
<bean id="car3" class="com.learn.bean.Car">
<property name="brand"><value>200</value></property>
<property name="color"><value>red</value></property>
<property name="maxSpeed"><value>1000</value></property>
</bean>
基于属性依赖注入,需要实体类至少有一个无参的构造函数,其中id不可重复,也可以用name标识。可以简写为如下,如果不指定id和name,则可以通过getBean("类的全局 限定名")方式获得。
<bean id="car10" class="com.learn.bean.Car">
<property name="brand" value="111"/>
<property name="color" value="222"/>
<property name="maxSpeed" value="333"/>
</bean>
1.2 构造函数注入
构造函数注入是除属性注入以外另一种常用的注入方式
在前边的Car类中加入 double price 属性,并增加一个构造函数
public Car(String brand,double price){
this.brand = brand;
this.price = price;
}
在可以按照以下方式注入
<bean id="carnew" class="com.learn.bean.Car">
<constructor-arg type="java.lang.String">
<value>宝马</value>
</constructor-arg>
<constructor-arg type="double">
<value>100</value>
</constructor-arg>
</bean>
<constructor-arg>的元素中有一个type属性,它为Spring提供了判断配置项构造函数对应关系的信息。但是如果在Car中定义有多个具有相同入参类型的构造函数,这种方式就是失效了,Spring 提供了一种按照入参索引的方式来确定
<bean id="carnew2" class="com.learn.bean.Car">
<constructor-arg index="0" type="java.lang.String" value="123"/>
<constructor-arg index="1" type="java.lang.String" value="123"/>
<constructor-arg index = "2" type ="double" value="123"/>
</bean>
通过index和type结合的方式Spring容器即可确定需要通过调用哪个构造函数来初始化bean。
1.3 在Bean中引入其他bean
在上面的Boss类中,需要引入一个Car类,可以通过如下构造方法注入
<bean name="car2" class="com.learn.bean.Car"></bean>
<bean id="boos" class="com.learn.bean.Boss">
<constructor-arg index ="0">
<ref bean="car2"/>
</constructor-arg>
</bean>
或者属性注入
<bean name="car2" class="com.learn.bean.Car"></bean>
<bean id="boos2" class="com.learn.bean.Boss">
<property name="car" ref="car2"/>
</bean>
如果尝试通过配置方式为car的brand属性赋值一个null值则可以通过,
<property name="maxSpeed"><null></null></property>
的方式进行,等同于setMaxSpeed(null);
1.4 通过p命名空间简化装配方式
使用p命名空间可以简化Spring配置文件的xml的配置方式
在使用p命名空间前,配置文件
<bean id="carnew2" class="com.learn.bean.Car">
<constructor-arg index="0" type="java.lang.String" value="123"/>
<constructor-arg index="1" type="java.lang.String" value="123"/>
<constructor-arg index = "2" type ="double" value="123"/>
</bean>
<bean name="bossnew" class="com.learn.bean.Boss">\
<property name="car" ref="carnew2"/>
</bean>
使用p命名空间
!--使用p命名空间-->
<bean id="car5" class="com.learn.bean.Car"
p:maxSpeed="100"
p:brand="baoma"
p:color="red"/>
<bean id="boss3" class="com.learn.bean.Boss"
p:car-ref="car5"/>
可以看到配置方式得到大大简化,使用p命名空间需要在beans中引入p命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
1.5 Bean之间的关系
<bean>元素标签之间可以建立继承,依赖,引用等关系
继承关系:
如果多个<bean>存在相同的配置信息,则Spring允许定义一个父<Bean>,子<bean>将自动继承父<bean>的配置信息,写法如下
<bean id="abstraceCar" class="com.learn.bean.Car" p:brand="baoma" p:color="red" p:maxSpeed="100"
p:price="1000" abstract="true"/>
<bean id="car7" p:color="black" parent="abstraceCar"/>
<bean id="car8" p:color="blue" parent="abstraceCar"/>
abstract=“true”表示这个父<bean>不实例化为一个bean,如果没有指定,则Spring会实例化一个名为abstraceCar的bean
依赖关系:
如果要保证一个类中另一个类之前初始化,可以通过<bean>的depends-on属性,写法如下
<bean name="bossnew1" class="com.learn.bean.Boss" depends-on="car11"/>
<bean name="car11" class="com.learn.bean.Car"/>
这样即可保证car11在bossnew1 之前初始化