Spring 实例化 Bean有三种方式:构造函数实例化、工厂方法实例化以及静态工厂方法实例化。两种 Bean类型:一种是普通的Bean,另一种则是工厂Bean。其中,工厂Bean中返回的不是指定的Class的实例,而是其内部方法 getObject 的返回对象。在Spring的内部实现中,存在很多的工厂方法bean。
1、新建bean对象 Human
package com.cfang.prebo.spring; import lombok.Data; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; @Data @NoArgsConstructor @RequiredArgsConstructor public class Human { @NonNull private Integer id; @NonNull private String name; private String text; }
2、新建工厂类 HumanFactory
package com.cfang.prebo.spring; public class HumanFactory { /** * 工厂方法实例化bean */ public Human initHuman() { return new Human(); } public Human initHuman(int id, String name) { return new Human(id, name); } /** * 静态工厂方法实例化bean */ public static Human staticInitHuman() { return new Human(); } }
3、新建配置文件 applicationContext.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 无参构造 --> <bean id="human" class="com.cfang.prebo.spring.Human"></bean> <!-- 有参构造 --> <bean id="human2" class="com.cfang.prebo.spring.Human"> <constructor-arg index="0" value="1"/> <constructor-arg index="1" value="huah"/> </bean> <!-- 工厂方法 --> <bean id="humanFactory" class="com.cfang.prebo.spring.HumanFactory"></bean> <bean id="human3" factory-bean="humanFactory" factory-method="initHuman"></bean> <!-- 静态工厂方法 --> <bean id="human4" class="com.cfang.prebo.spring.HumanFactory" factory-method="staticInitHuman"></bean> </beans>
4、单元测试类 TestBeanLoad
package com.cfang.prebo.spring; import org.apache.xbean.spring.context.ClassPathXmlApplicationContext; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import lombok.extern.slf4j.Slf4j; @Slf4j public class TestBeanLoad { private ApplicationContext context; @Before public void initXml() { log.info("test init..."); // context = new FileSystemXmlApplicationContext("src/test/resources/applicationContext.xml"); context = new ClassPathXmlApplicationContext("applicationContext.xml"); } @After public void closeXml() { log.info("test complete..."); } /** * 无参构造实例化bean */ @Test public void test1() { Human human = (Human) context.getBean("human"); log.info("无参构造实例化bean : {}", human); } /** * 有参构造实例化bean */ @Test public void test2() { Human human2 = (Human) context.getBean("human2"); log.info("有参构造实例化bean : {}", human2); } /** * 工厂方法实例化bean */ @Test public void test3() { Human human3 = (Human) context.getBean("human3"); log.info("工厂方法实例化bean : {}", human3); } /** * 静态工厂方法实例化bean */ @Test public void test4() { Human human4 = (Human) context.getBean("human4"); log.info("静态工厂方法实例化bean : {}", human4); } }
原文:https://www.cnblogs.com/eric-fang/p/11718672.html