Skip to content

factory bean

FactoryBean 是spring提供的一种整合第三方框架的机制. 和普通的bean不同,配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置这个类的对象,而是通过getObject()方法的返回值.

代码演示

  • 定义一个Plugin接口
java
package com.wyizd.factorybean;
public interface Plugin {
    void start();
    void stop();
}
  • 简单实现SimpleSayHiPluginImpl
java
package com.wyizd.factorybean;
public class SimpleSayHiPluginImpl implements Plugin {
    @Override
    public void start() {
        System.out.println("hello!");
    }
    @Override
    public void stop() {
        System.out.println("bye!");
    }
}
  • 实现BeanFactory接口
java
package com.wyizd.factorybean;
import org.springframework.beans.factory.FactoryBean;
public class PluginFactoryBean implements FactoryBean<Plugin>,Plugin{
    @Override
    public Plugin getObject() {
       return new SimpleSayHiPluginImpl();
    }
    @Override
    public Class<?> getObjectType() {
        return Plugin.class;
    }
    @Override
    public void start() {
    }
    @Override
    public void stop() {
    }
}
  • 注入spring
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="pluginFactoryBean" class="com.wyizd.factorybean.PluginFactoryBean" />
</beans>
  • 进行测试
java
package com.wyizd.factorybean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-factory.xml");
        Plugin plugin = (Plugin) context.getBean("pluginFactoryBean");
        plugin.start();
        plugin.stop();
    }
}
  • 总结:
    • 注入之后获取pluginFactroyBean,得到的是方法返回的对象,并且这个对象是有spring 管理的.这就和普通的工厂有了区别
      • [ ] 有个问题,通过类获取的bean还是factoryBean本身,通过id获取的,才是方法返回的对象