FactoryBean接口作用
FactoryBean是一个生产Bean产品的工厂,它是一个接口,只要实现了这个接口就可以生产Bean.
package com.xuecheng.content.a01;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/27 22:29*/
@Slf4j
@Component("bean1")
public class MyFactoryBean implements FactoryBean {//提供产品对象@Overridepublic Object getObject() throws Exception {Bean1 bean1 = new Bean1();log.debug("creating bean: {}",bean1);return bean1;}//决定了根据类型获取或依赖注入能否成功@Overridepublic Class<?> getObjectType() {return Bean1.class;}@Overridepublic boolean isSingleton() {//单例return true;}
}
实现这个接口需要重写上面三个方法。
1.getObject()返回实体
2.getObjectType()返回实体的类型
3.isSingleton()决定生产的Bean对象是否是单例
对FactoryBean类进行测试:
首先创建Bean1
package com.xuecheng.content.a01;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Autowired;import javax.annotation.PostConstruct;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/27 22:30*/
@Slf4j
public class Bean1 implements BeanFactoryAware {private Bean2 bean2;@Autowiredpublic void setBean2(Bean2 bean2){this.bean2 = bean2;}public Bean2 getBean2(){return bean2;}@PostConstructpublic void init(){log.debug("init");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {log.debug("setBeanFactory{}",beanFactory);}
}
Bean1(没有被Spring管理)里面依赖了Bean2,并把Bean2交给Spring管理,方便后期测试,同时实现BeanFactoryAware 接口,设置Bean1的BeanFactory。
package com.xuecheng.content.a01;import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/27 22:35*/
@Component
public class Bean2 {
}
package com.xuecheng.content.a01;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/27 22:49*/
@ComponentScan
public class TestFactoryBean {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestFactoryBean.class);Bean1 bean1 = (Bean1) context.getBean("bean1");System.out.println(bean1);context.close();}
}
把测试类交给Spring管理,我们通过容器获取名字为bean1的bean。容器从BeanFactory里面拿到了bean1。
测试结果:
Bean1被创建,但是没有做Bean1中写的一些初始化的操作。