Java Springs XmlBeanFactory已弃用
我努力学习春天。我正在关注这个网站 我试过一个例子。我正在使用一些类似于下面的内容,但这里显示: 不推荐使用XmlBeanFactory类型 我必须使用什么作为替代方案Java Springs XmlBeanFactory已弃用,java,spring,deprecated,xmlbeans,Java,Spring,Deprecated,Xmlbeans,我努力学习春天。我正在关注这个网站 我试过一个例子。我正在使用一些类似于下面的内容,但这里显示: 不推荐使用XmlBeanFactory类型 我必须使用什么作为替代方案 public class SpringHelloWorldTest { public static void main(String[] args) { XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("Spri
public class SpringHelloWorldTest {
public static void main(String[] args) {
XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("SpringHelloWorld.xml"));
Spring3HelloWorld myBean = (Spring3HelloWorld)beanFactory.getBean("Spring3HelloWorldBean");
myBean.sayHello();
}
}
您可以使用该类。这是替换代码
public static void main(String[] args){
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"SpringHelloWorld.xml"});
BeanFactory factory=context;
Spring3HelloWorld myBean=(Spring3HelloWorld)factory.getBean("Spring3HelloWorldBean");
myBean.sayHello();
}
我尝试了以下代码
public class Spring3HelloWorldTest {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ((BeanFactory) new ClassPathResource("SpringHelloWorld.xml"));
Spring3HelloWorld myBean = (Spring3HelloWorld) beanFactory.getBean("Spring3HelloWorldBean");
myBean.sayHello();
}
}
它是有效的
ApplicationContext是BeanFactory的子接口。您可以使用这种方式
无需类转换即可获取bean上下文的新方法:
BeanDefinitionRegistry beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));
启动应用程序范围的上下文时,应使用
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
下面是实现的最佳方法
Resource res = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
or
ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
or
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) appContext;
这个怎么样:
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("config/Beans.xml"));
Messager msg = (Messager) factory.getBean("Messager");
Spring文档中XMLBeanFactory的替代品
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new
ClassPathResource("applicationContext.xml"));
PropertiesBeanDefinitionReader propReader = new
PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new
ClassPathResource("otherBeans.properties"));
ctx.refresh();
MyBean myBean = (MyBean) ctx.getBean("myBean");
将FileSystemXmlApplicationContext用作
ApplicationContext context = new FileSystemXmlApplicationContext("SpringHelloWorld.xml");
Spring3HelloWorld myBean= (Spring3HelloWorld) context.getBean("Spring3HelloWorldBean");
myBean.sayHello();
存在警告资源泄漏:“上下文”永远不会用接受的答案关闭
SO帖子中建议的解决方案解决了这个问题
希望它能帮助别人 我认识到ApplicationContext和XmlBeanFactory在对象的运行时初始化方面存在巨大差异
package com.stackoverflow.questions_5231371;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
// ./spring-tutorial/src/main/java/com/stackoverflow/questions_5231371/Main.java
public class Main {
public static void main(final String[] args) {
// Spring #1 IoC application context
System.out.println("--- ApplicationContext");
final ApplicationContext context = new ClassPathXmlApplicationContext("personbeans.xml");
System.out.println("context created ---");
System.out.println(context.getBean("p1"));
System.out.println(context.getBean("p2"));
System.out.println(context.getBean("p3"));
// Spring #2 IoC bean factory
System.out.println("--- DefaultListableBeanFactory");
final Resource resource = new ClassPathResource("personbeans.xml");
final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
final XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
xmlBeanDefinitionReader.loadBeanDefinitions(resource);
System.out.println("bean definition loaded ---");
System.out.println(beanFactory.getBean("p1"));
System.out.println(beanFactory.getBean("p2"));
System.out.println(beanFactory.getBean("p3"));
}
}
applicationcontext立即调用对象构造函数,从而立即创建对象
只有在调用beanFactory.getBeanString名称时,XmlBeanFactory才会创建对象
如果这对问题域很重要,请尝试以下代码,将其等效于源代码XmlBeanFactory
final Resource resource = new ClassPathResource("SpringHelloWorld.xml");
final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
final XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
xmlBeanDefinitionReader.loadBeanDefinitions(resource);
Spring3HelloWorld myBean = beanFactory.getBean("Spring3HelloWorldBean", Spring3HelloWorld.class);
myBean.sayHello();
为了使船长明显满意,下面是一个具有可比性的完整示例
首先是Person.java模型
package com.stackoverflow.questions_5231371;
// ./spring-tutorial/src/main/java/com/stackoverflow/questions_5231371/Person.java
public class Person {
int id;
String name;
public Person() {
System.out.println("calling Employee constructor");
}
public int getId() {
return id;
}
public void setId(final int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
然后是personbeans.xml中的对象数据
<?xml version="1.0" encoding="UTF-8"?>
<!-- ./spring-tutorial/src/main/java/personbeans.xmlxml -->
<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="p1" class="com.stackoverflow.questions_5231371.Person">
<property name="id" value="1" />
<property name="name" value="Sheldon" />
</bean>
<bean id="p2" class="com.stackoverflow.questions_5231371.Person">
<property name="id" value="2" />
<property name="name" value="Penny" />
</bean>
<bean id="p3" class="com.stackoverflow.questions_5231371.Person">
<property name="id" value="3" />
<property name="name" value="Leonard" />
</bean>
</beans>
当构造函数在控制台输出中加载了调用Employee构造函数的输出时,Interstation部分是比较
--- ApplicationContext
calling Employee constructor
calling Employee constructor
calling Employee constructor
context created ---
Person [id=1, name=Sheldon]
Person [id=2, name=Penny]
Person [id=3, name=Leonard]
--- DefaultListableBeanFactory
bean definition loaded ---
calling Employee constructor
Person [id=1, name=Sheldon]
calling Employee constructor
Person [id=2, name=Penny]
calling Employee constructor
Person [id=3, name=Leonard]
嗨..谢谢它工作了。你能告诉我一些学习Spring的书籍和教程吗?嗨..谢谢它工作了。你能告诉我一些学习Spring的书籍和教程吗?这将失败,因为资源不是BeanFactory。-1阅读javadoc。我想如果我提供完整路径和文件名,as xmlBeanFactory将作为其构造函数接受FileSystemResource的对象,那么它将不起作用;由于我们可以使用AbstractApplicationContext类使用close-to-shutdown容器,因此我们可以使用RegisterSudownHook方法来确保正常关闭,并调用可能与bean生命周期相关的销毁方法,而不是ApplicationContext。
package com.stackoverflow.questions_5231371;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
// ./spring-tutorial/src/main/java/com/stackoverflow/questions_5231371/Main.java
public class Main {
public static void main(final String[] args) {
// Spring #1 IoC application context
System.out.println("--- ApplicationContext");
final ApplicationContext context = new ClassPathXmlApplicationContext("personbeans.xml");
System.out.println("context created ---");
System.out.println(context.getBean("p1"));
System.out.println(context.getBean("p2"));
System.out.println(context.getBean("p3"));
// Spring #2 IoC bean factory
System.out.println("--- DefaultListableBeanFactory");
final Resource resource = new ClassPathResource("personbeans.xml");
final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
final XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
xmlBeanDefinitionReader.loadBeanDefinitions(resource);
System.out.println("bean definition loaded ---");
System.out.println(beanFactory.getBean("p1"));
System.out.println(beanFactory.getBean("p2"));
System.out.println(beanFactory.getBean("p3"));
}
}
--- ApplicationContext
calling Employee constructor
calling Employee constructor
calling Employee constructor
context created ---
Person [id=1, name=Sheldon]
Person [id=2, name=Penny]
Person [id=3, name=Leonard]
--- DefaultListableBeanFactory
bean definition loaded ---
calling Employee constructor
Person [id=1, name=Sheldon]
calling Employee constructor
Person [id=2, name=Penny]
calling Employee constructor
Person [id=3, name=Leonard]