Spring中的Bean实例化三种方式
Bean的实例化方式有三种,分别为:默认无参的构造器实例化、静态工厂方法实例化、实例工厂方法实例化
创建一个User对象,什么都没有,只用来做测试
public class User {
}
1. 默认无参的构造器实例化
编写配置文件bean.xml
<?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.xsd">
<!-- 默认无参的构造器实例化 -->
<bean id="defaultBean" class="com.jack.User"></bean>
</beans>
编写测试类
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:bean.xml");
User user = (User) ac.getBean("defaultBean");
System.out.println(user);
}
}
运行结果
2. 静态工厂方法实例化
编写一个工厂类,类中有一个静态的工厂方法,用来实例化对象使用的
public class StaticBeanFactory {
public static User createStaticBean(){
System.out.println("静态工厂方法的实例化");
return new User();
}
}
在bean.xml文件中配置bean
<?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.xsd">
<!-- 静态工厂方法的实例化 -->
<bean id="staticBean" class="com.jack.StaticBeanFactory"
factory-method="createStaticBean"></bean>
</beans>
测试类
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:bean.xml");
User user = (User) ac.getBean("staticBean");
System.out.println(user);
}
}
运行
类中的静态方法可以通过:类名 . 静态方法名进行调用
3. 实例工厂方法实例化
实例工厂方法代码
public class InstanceBeanFactory {
public User createInstanceBean(){
System.out.println("实例工厂方法的实例化");
return new User();
}
}
bean.xml配置
<?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.xsd">
<!-- 实例工厂方法的实例化 -->
<bean id="instanceBeanFactory" class="com.jack.InstanceBeanFactory"></bean>
<bean id="instanceBean" factory-bean="instanceBeanFactory" factory-method="createInstanceBean"></bean>
</beans>
测试类
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:bean.xml");
User user = (User) ac.getBean("instanceBean");
System.out.println(user);
}
}
运行
对于实例工厂方法的实例化,个人想法:Spring IOC容器是将配置文件中Bean管理的实例工厂类InstanceBeanFactory实例化加载进IOC容器中,当获取Bean时(getBean("instanceBean")),会根据factory-bean属性中的instanceBeanFactory,在IOC容器中找到与之匹配的值,获取工厂对象,调用工厂对象中的createInstanceBean方法来实例化。所以就叫做实例工厂方法的实例化。当然实例工厂方法实例化不推建使用,我觉得比较繁琐。