我了解
BeanFactory
和 ApplicationContext
之间的区别。
我还知道 BeanFactory 实例可以从 xml 文件创建,这些文件位于类路径或文件系统中的任何其他位置。因此,在这种情况下会创建一个 XMLBeanFactory 实例。
同时,我正在深入研究
BeanFactory
文档并偶然发现了这一点。
通常 BeanFactory 将加载存储在配置源(例如 XML 文档)中的 bean 定义,并使用 org.springframework.beans 包来配置 bean。然而,实现可以简单地返回它根据需要直接在 Java 代码中创建的 Java 对象。定义的存储方式没有限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持 bean 之间的引用(依赖注入)。
那么,这是否意味着 bean 定义也可以采用非 XML 格式?即,LDAP、RDBMS、属性文件等?如果是,请提供其中的一个片段。我只寻找 BeanFactory 而不是任何 ApplicationContext 实现。
如何加载
ApplicationContext
,这是一个BeanFactory
:.
public class SpringContextsApplication {
public static void main(String[] args) throws Exception {
GenericApplicationContext contextFromProperties =
new GenericApplicationContext();
BeanDefinitionReader reader =
new PropertiesBeanDefinitionReader(contextFromProperties);
reader.loadBeanDefinitions("classpath:application-context.properties");
contextFromProperties.refresh();
doGreeting(contextFromProperties);
contextFromProperties.stop();
}
private static void doGreeting(ApplicationContext ctx) {
Greeter greeter = ctx.getBean(Greeter.class);
Person person = ctx.getBean(Person.class);
greeter.greet(person);
}
}
有
GenericApplicationContext
的地方也可以使用 DefaultListableBeanFactory
代替并达到相同的结果。
public class SpringContextsApplication {
public static void main(String[] args) throws Exception {
GenericApplicationContext contextFromProperties =
new DefaultListableBeanFactory();
BeanDefinitionReader reader =
new PropertiesBeanDefinitionReader(contextFromProperties);
reader.loadBeanDefinitions("classpath:application-context.properties");
doGreeting(contextFromProperties);
contextFromProperties.stop();
}
private static void doGreeting(BeanFactory ctx) {
Greeter greeter = ctx.getBean(Greeter.class);
Person person = ctx.getBean(Person.class);
greeter.greet(person);
}
}
要加载 bean 定义,需要为您要使用的特定实现提供
BeanDefinitionReader
。这里是属性文件,但您也可以为 LDAP、JDBC、YAML 等编写 BeanDefinitionReader
。
Spring 支持开箱即用
但是,如果需要,您可以创建任何您喜欢的实现。