Appearance
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获取的,才是方法返回的对象