1: FactoryBean 加载与获取过程
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="myFactoryBean" class="com.self.factory.bean.MyFactoryBean"/>
</beans>
public class MyFactoryBean implements FactoryBean<FactoryBeanBean> {
@Override
public FactoryBeanBean getObject() throws Exception {
FactoryBeanBean factoryBeanBean = new FactoryBeanBean();
factoryBeanBean.setName("zhangyi");
return factoryBeanBean;
}
@Override
public Class<?> getObjectType() {
return FactoryBeanBean.class;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
public class FactoryBeanTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("factory-bean.xml");
Object myFactoryBean = classPathXmlApplicationContext.getBean("&myFactoryBean");
FactoryBeanBean factoryBeanBean = (FactoryBeanBean) classPathXmlApplicationContext.getBean("myFactoryBean");
System.out.println(factoryBeanBean.getName());
}
}
MyFactoryBean 通过doCreateBean创建, 位于一级缓存
MyFactoryBean 通过 doGetObjectFromFactoryBean创建实际对象
创建出的实际bean对象位于factoryBeanObjectCache
@Override
public boolean isSingleton() {
return false;
}
如果指定非单例,则不会放入缓存,每次请求实际对象都将新建一个新的对象,此时不再受spring管理。
此过程对应于流程图中的 获取并返回当前bean对象