目录
前言
基于XML的Spring对象的注册,一般分为两种形式;一是直接将类注册到Spring容器,通过构造方法、setter方法。二是将一个已经创建好的对象进行注册,通过静态方法、另外一个bean的实例化方法。
一、将类直接注册
通过这种方法,我们就直接将对象的创建过程交给了Spring容器去完成。
将类注册分为两种:1.构造方法注册 2.setter方法注册
1.构造方法注册与注入
public class EmptyClass {
public EmptyClass() {
System.out.println("EmptyClass 正在被调用");
}
}
将上面这个类通过XML的配置注册Spring容器中。
在XML中相关的配置:
<bean id="我的第一个商品" class="com.ioc2.EmptyClass" />
其中对于id,只是起的一个名字,只要不重复就可以。这种方式相当于将EmptyClass 类的无参构造提供给Spring容器,使其完成创建。
注册新的类,且通过他的构造方法注入其他对象:
// 构造我们的 SecondClass,请将 EmptyClass 送货上门(注入进来)
// 同时,将 SecondClass 也委托 Spring 容器进行实例化 + 售卖
public class SecondClass {
public SecondClass(EmptyClass emptyClass) {
System.out.println("我是 SecondClass(), emptyClass 是 : " + emptyClass.toString());
}
}
XML配置中相关的配置:
<!-- 注册新的类,并且进行构造方法注入 -->
<bean id="我的第二个商品" class="com.ioc2.SecondClass">
<!-- 请用 "我的第一个商品" 的对象,注入我的构造方法参数中 -->
<constructor-arg ref="我的第一个商品" />
</bean>
这样,我们我们不仅新注册了一个新的SecondClass对象,而且还通过构造方法注入了需要的对象。注意: 这里我们注入的这个对象,必须是已经注册过的,才可以被Spring注入。
2.setter方法注册与注入
public class ThirdClass {
private EmptyClass emptyClass;
private SecondClass secondClass;
public ThirdClass() {
System.out.println("ThirdClass()");
}
public void setEmptyClass(EmptyClass emptyClass) {
System.out.println("setEmptyClass(), " + emptyClass);
this.emptyClass = emptyClass;
}
public void setSecondClass(SecondClass secondClass) {
System.out.println("setSecondClass() + " + secondClass);
this.secondClass = secondClass;
}
}
对于上述的代码,我们想要将ThirdClass注册到Spring容器,并且通过setter方法,将EmprtClass、SecondClass 这两个对象注入。
下面是XML相关的配置:
<!-- setter 方法注入 -->
<bean id="我的第三个商品" class="com.ioc2.ThirdClass">
<property name="emptyClass" ref="我的第一个商品" />
<property name="secondClass" ref="我的第二个商品" />
</bean>
这样配置以后,相关的注册和注入都已经实现了。
二、将已经建好的对象注册
这相当于对象的创建过程在我们手里。
1.通过静态方法
想要将Person对象注册进入Spring容器
public class Person {
public Person() {
System.out.println("Person() 构造方法被调用了");
}
}
public class SomeClass {
public SomeClass() {
System.out.println("SomeClass() 构造方法被调用了");
}
// 静态方法(直接通过类名调用)
// 语义:返回一个对象
// 这类方法被称为工厂方法
public static Person createPerson() {
System.out.println("createPerson() 被调用");
return new Person();
}
}
对应XML相关的配置:
<!-- bean 的实例化过程我们介入 -->
<bean id="通过工厂注册" class="com.ioc.SomeClass" factory-method="createPerson" />
这里需要注意一下:通过上述的执行,只会将Person对象注册进入Spring容器,SomeClass类不会被注册进去。
2.通过另一个bean的实例化方法
public class SomeClass {
public SomeClass() {
System.out.println("SomeClass() 构造方法被调用了");
}
public Person instanceCreatePerson() {
System.out.println("instanceCreatePerson() 被调用");
return new Person();
}
}
注意:在这个代码中,我们如果要将Person对象注册进去,那么,我们的SomClass类也需要被注册进入Spring容器。因为我们这个是实例化方法,所以在Spring容器中需要有一个SomeClass对象,来调用这个方法,完成Person对象的注册。
关于XML的相关的配置:
<bean id="只是一个工具bean" class="com.ioc.SomeClass" />
<bean id="通过实例化工厂" factory-bean="只是一个工具bean" factory-method="instanceCreatePerson" />
也就是说,此处的SomeClass类,就是为了调用实例化方法而被注册进去的一个“辅助工具”。
总结
加油哦~~