FactoryBean - это интерфейс, который вы, как разработчик, реализуете при написании фабричных классов, и вы хотите, чтобы объект, созданный фабричным классом, управлялся как bean-компонентом Spring, тогда как BeanFactory представляет Spring.Контейнер IoC, он содержит управляемые компоненты и предоставляет доступ к их получению.Он является частью ядра платформы, которая реализует базовую функциональность инверсии контейнера управления.
В большинстве случаев вы не обнаружите, что используете или реализуете интерфейс BeanFactory напрямую, если только вы не расширяете ядро.функциональность фреймворка.Хотя вы бы реализовали FactoryBean, когда у вас есть объекты, созданные фабриками, которыми нужно управлять Spring.
Другими словами, BeanFactory представляет контейнер Spring, а FactoryBean представляет классы фабрики, чей созданный объектсобраны и зарегистрированы как бобовые в контейнере.
File: context.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="sha" class="MessageDigestFactoryBean">
<property name="algorithm" value="SHA1"/>
</bean>
<bean id="md5" class="MessageDigestFactoryBean"/>
</beans>
File: Main.java
import java.security.MessageDigest;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class Main {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("context.xml"));
String d1 = (String) factory.getBean("sha");
String d2 = (String) factory.getBean("md5");
System.out.println(d1);
System.out.println(d2);
}
}
class MessageDigestFactoryBean implements FactoryBean, InitializingBean {
private static final String DEFAULT_ALGORITHM = "MD5";
private String algorithm = DEFAULT_ALGORITHM;
public Object getObject() throws Exception {
return this.algorithm;
}
public Class getObjectType() {
return MessageDigest.class;
}
public boolean isSingleton() {
return true;
}
public void setAlgorithm(String algorithm) {
this.algorithm = algorithm;
}
public void afterPropertiesSet() throws Exception {
this.algorithm += " after setting";
}
}