Springs XmlBeanFactory is deprecated
Asked Answered
B

12

58

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();
    }
}
Barracks answered 8/3, 2011 at 10:44 Comment(1)
-1 Read the javadoc. static.springsource.org/spring/docs/3.1.x/javadoc-api/org/…Palaeolithic
R
53

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();
    }
}
Regenerative answered 9/2, 2012 at 12:35 Comment(3)
i guess it will not work if i provide full path and file name where as xmlBeanFactory will work as its constructor accept object of FileSystemResource.Rafael
We can also use AbstractApplicationContext context = new ClassPathXmlApplicationContext("SpringHelloWorld.xml"); instead of ApplicationContext because we can use close() to shutdown containerEnjambment
By using the AbstractApplicationContext class, we can also use the registerShudownHook() method to ensure a graceful shutdown and call the relevant destroy methods that may be associated with the bean lifecycle.Awlwort
M
16

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();
}
Modulator answered 8/3, 2011 at 20:44 Comment(1)
Hi..Thanks Its worked.Can you tel me some books and tutorials to learn springs.Barracks
T
11
BeanDefinitionRegistry beanDefinitionRegistry = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanDefinitionRegistry);
reader.loadBeanDefinitions(new ClassPathResource("SPRING_CONFIGURATION_FILE"));
Tui answered 17/4, 2012 at 8:34 Comment(0)
T
7

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");
Trieste answered 13/4, 2013 at 6:48 Comment(0)
D
6

You can use the ClassPathXmlApplicationContext class.

Dereliction answered 8/3, 2011 at 10:54 Comment(1)
Hi..Thanks Its worked.Can you tel me some books and tutorials to learn springs.Barracks
W
2

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");
Weinhardt answered 18/5, 2017 at 8:32 Comment(0)
H
1

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;
Headwind answered 12/2, 2015 at 10:27 Comment(0)
A
1

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");
Andalusia answered 7/7, 2017 at 19:41 Comment(0)
E
0

Use "FileSystemXmlApplicationContext" as

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

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

myBean.sayHello();
Execution answered 21/9, 2018 at 21:58 Comment(0)
M
0

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.

Maine answered 3/7, 2019 at 23:11 Comment(0)
B
0

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]
Berfield answered 25/4, 2020 at 21:24 Comment(0)
P
-1

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

Pericycle answered 10/11, 2011 at 10:48 Comment(1)
This will fail with a ClassCastException since Resources are not BeanFactories.Giefer

© 2022 - 2024 — McMap. All rights reserved.