Spring实例化bean的三种方式

⽅式⼀:使⽤⽆参构造函数

最常用的一种方式。 在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象。如果类中没有⽆参构造函数,将创建失败。 applicationContext.xml:

1
2
3
<!--配置service对象-->
<bean id="userService" class="com.lagou.service.impl.TransferServiceImpl">
</bean>

class属性中是类的全限定名。

1
2
3
4
5
6
7
8
9
 @Test
public void testIoC() throws Exception {
// 通过读取classpath下的xml文件来启动容器(xml模式SE应用下推荐)
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

Object connectionUtils = applicationContext.getBean("userService");

System.out.println(connectionUtils);applicationContext.close();
}

方式二:使用静态方法

用来实例化自己new出来的对象。当发现某个对象在配置文件中配置(第一种方式)的时候特别麻烦的时候,可以使用这种方法。 applicationContext.xml:

1
2
3
<!--方式二:静态方法-->
<bean id="connectionUtils" class="com.lagou.edu.factory.CreateBeanFactory"
factory-method="getInstanceStatic"/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.lagou.edu.factory;

import com.lagou.edu.utils.ConnectionUtils;

/**
* @author 应癫
*/
public class CreateBeanFactory {

public static ConnectionUtils getInstanceStatic() {
return new ConnectionUtils();
}

}

测试:

1
2
3
4
5
6
7
8
9
10
 @Test
public void testIoC() throws Exception {
// 通过读取classpath下的xml文件来启动容器(xml模式SE应用下推荐)
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

Object connectionUtils = applicationContext.getBean("connectionUtils");

System.out.println(connectionUtils);
applicationContext.close();
}

方式三 实例化方法

applicationContext.xml:

1
2
3
4
5
 <!--方式三:实例化方法-->
<bean id="createBeanFactory" class="com.lagou.edu.factory.CreateBeanFactory"></bean>

<bean id="connectionUtils" factory-bean="createBeanFactory"
factory-method="getInstance"/>

CreateBeanFactory:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.lagou.edu.factory;

import com.lagou.edu.utils.ConnectionUtils;

/**
* @author 应癫
*/
public class CreateBeanFactory {

// public static ConnectionUtils getInstanceStatic() {
// return new ConnectionUtils();
// }
public ConnectionUtils getInstance() {
return new ConnectionUtils();
}
}

实例化方法和静态方法的唯一区别就是CreateBeanFactory里面的方法是静态的还是非静态的,如果是静态的那么就不需要实例化CreateBeanFactory,如果是非静态的,则首先需要实例化CreateBeanFactory这个类,然后再去引用这个类中的方法 测试:

1
2
3
4
5
6
7
8
9
10
 @Test
public void testIoC() throws Exception {
// 通过读取classpath下的xml文件来启动容器(xml模式SE应用下推荐)
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

Object connectionUtils = applicationContext.getBean("connectionUtils");

System.out.println(connectionUtils);
applicationContext.close();
}

总结

Spring实例化bean的方式有三种,分别是使用无参构造函数、使用静态方法、实例化方法。