Springs XmlBeanFactory is deprecated

JavaSpringDeprecatedXmlbeans

Java Problem Overview


I try to learn Spring. I am following this site http://www.roseindia.net/spring/spring3/spring-3-hello-world.shtml

I tried one example in that. I am using some what like below, but here it shows:

> The type XmlBeanFactory is deprecated

What do I have to use as an alternative to this?

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();
	}
}

Java Solutions


Solution 1 - Java

> ApplicationContext is a sub-interface of BeanFactory.You can use this way

public class SpringHelloWorldTest {
    public static void main(String[] args) {
        ApplicationContext context= new ClassPathXmlApplicationContext("SpringHelloWorld.xml");
        Spring3HelloWorld myBean= (Spring3HelloWorld) context.getBean("Spring3HelloWorldBean");
        myBean.sayHello();
    }
}

Solution 2 - Java

Here is the substitute code,

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();
}

Solution 3 - Java

BeanDefinitionRegistry beanDefinitionRegistry = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanDefinitionRegistry);
reader.loadBeanDefinitions(new ClassPathResource("SPRING_CONFIGURATION_FILE"));

Solution 4 - Java

You can use the ClassPathXmlApplicationContext class.

Solution 5 - Java

New way to get beans context (without class casting):

BeanDefinitionRegistry beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));

When starting an apppication-wide context one should use

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

Solution 6 - Java

how about this:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("config/Beans.xml"));
Messager msg = (Messager) factory.getBean("Messager");

Solution 7 - Java

Here is the best way to implement

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;

Solution 8 - Java

Alternative to XMLBeanFactory found on Spring documentation

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");

Solution 9 - Java

Use "FileSystemXmlApplicationContext" as

ApplicationContext  context =  new FileSystemXmlApplicationContext("SpringHelloWorld.xml");

Spring3HelloWorld myBean= (Spring3HelloWorld) context.getBean("Spring3HelloWorldBean");

myBean.sayHello();

Solution 10 - Java

There is a warning "Resource leak: 'context' is never closed" with the accepted answer.

The solution suggested in the SO post Spring ApplicationContext - Resource leak: 'context' is never closed fixes the issue.

Hope it helps someone.

Solution 11 - Java

I recognized a huge difference between the ApplicationContext and the XmlBeanFactory regarding to the runtime initialization of the objects.

The applicationcontext calls the object constructors immediatly thus creating the objects at once.

The XmlBeanFactory creates an object only if the beanFactory.getBean(String name) is called.

If this is important for the problem domain give the following code a try as an equivalent to the origin source avoiding 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();

To make Captain Obvious satisfied a full example with comparasion follows.

First there is the model 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 + "]";
    }
}

Then the object data in the 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>

And the main method who calls the objects.

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"));
    }

}

The interssting part is the comparasion when the constructor is loaded with the output "calling Employee constructor" in the console output.

--- 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]

Solution 12 - Java

I tried the following code

    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();
	}
}

and it works

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVishwanath.MView Question on Stackoverflow
Solution 1 - JavahalilibrahimView Answer on Stackoverflow
Solution 2 - JavakrishnaView Answer on Stackoverflow
Solution 3 - JavaBaxView Answer on Stackoverflow
Solution 4 - JavaeolithView Answer on Stackoverflow
Solution 5 - JavaVitalyView Answer on Stackoverflow
Solution 6 - JavahuoergaiView Answer on Stackoverflow
Solution 7 - Javauser1517878View Answer on Stackoverflow
Solution 8 - JavahemantoView Answer on Stackoverflow
Solution 9 - JavaAlferd NobelView Answer on Stackoverflow
Solution 10 - JavaAKGView Answer on Stackoverflow
Solution 11 - JavaDaniel GschösserView Answer on Stackoverflow
Solution 12 - JavaRosanero4EverView Answer on Stackoverflow