一、构造方法实例化:XML配置使用bean构造器
这种创建方式使我们使用最多的一种创建方式,直接配置bean节点即可,比如我有一个User类,如下:
public class User {
public void add() {
System.out.println("add()---------");
}
}
然后通过简单配置一个bean节点就可以获取实例了,如下:
<bean class="org.sang.User" id="user"/>
OK,我们通过如下代码进行一个简单的测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
所以在像如上这种没有配置构造参数使用无参构造方法进行实例化时一定要保证对应的Class
拥有一个public
的无参构造方法。如果我们的构造方法是有参数的,则需要通过constructor-arg
来指定对应的参数,如下这种就是通过配置构造参数使用构造方法进行实例化的。
<bean class="org.sang.User" id="user"/>
<constructor-arg value="hello"/>
</bean>
二、静态工厂实例化:XML配置+factory类,使用静态工厂方法实例化
如果我们的bean
是通过指定Class
的静态方法进行实例化的,则我们可以通过指定Class
为拥有对应静态方法的Class
,指定factory-method
为对应的实例化静态方法。
public class HelloBeanFactory {
public static Hello createHelloBean() {
return new HelloBean();
}
}
﹤bean id="sayhello" class="test.service.impl.HelloBean"/﹥
﹤bean id="sayhello2" class="test.service.impl.HelloBeanFactory" factory-method="createHelloBean"/﹥
从以上定义我们可以看到在通过静态方法实例化对应的bean时是不需要指定对应的bean的类型的,指定的class是对应静态方法所在的Class。实例化的bean的类型Spring将根据factory-method
指定方法的返回值决定。
三、实例工厂实例化
有时候我们的bean可能是需要通过某个对象进行实例化的,这个时候我们可以通过factory-bean
指定用来实例化该bean的对应对象,通过factory-method
指定factory-bean
中用来实例化该bean的方法。factory-bean
必须也是属于ApplicationContext
中的一个bean。
public class Hello {
public World createWorld() {
return new World();
}
}
如果我们需要定义一个bean使用Hello的实例对象的createWorld方法来实例化对应的World对象,则可以这样定义:
<bean id="hello" class="com.app.Hello"/>
<bean id="world" factory-bean="hello" factory-method="createWorld"/>
参看:https://blog.csdn.net/u012702547/article/details/56021922