ApplicationContextAware не работает в Spring 3.0

1

Я попробовал простой пример, но это не сработало.

Класс ApplicationContextHolder, реализующий Aware:

@Component
public class ApplicationContextHolder implements ApplicationContextAware {

private static ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext context)
        throws BeansException {
    this.context = context;
}

public static ApplicationContext getApplicationContext(){
    return context;
}
}

App.java

public static void main( String[] args )
{
    ApplicationContext context = ApplicationContextHolder.getApplicationContext();
    // context in above line is coming as null
}

Ниже приведена запись xml:

<context:component-scan base-package="com.XXX" />

Пожалуйста, дайте мне знать, почему в классе App.jaa context становится нулевым. Должен ли я сделать некоторую запись для класса, реализующего Aware где-нибудь в файле xml?

Теги:
spring
spring-mvc

3 ответа

4
Лучший ответ

Сначала необходимо инициализировать ApplicationContext

public static void main( String[] args )
{
  ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
  // 'spring.xml' has to add ApplicationContextHolder to its scan path

  ApplicationContext contextFromHolder =
    ApplicationContextHolder.getApplicationContext();
}
1

Интерфейс ApplicationContetAware должен быть реализован любым объектом, который хочет быть уведомленным о ApplicationContext, в котором он работает.

В вашем случае их нет. Вы должны сначала загрузить Spring, поскольку это автономное/консольное приложение через Java-код. Вы должны сначала инициализировать applicationcontext/BeanFactory.

Используйте ApplicationContext (предпочтительнее ClassPaспасибоmlApplicationContext, если вы используете конфигурацию xml)

ApplicationContext context = new ClassPathXmlApplicationContext(contextfile.xml);

Теперь ApplicationContextHolder будет иметь ссылку на текущий ApplicationContext.

0

Полный рабочий процесс Пример ниже:

MyContext.java

package jbr;

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;

    public class MyContext implements ApplicationContextAware {

        private static ApplicationContext ctx;

        public void setApplicationContext(ApplicationContext context) throws BeansException {
            ctx = context;
        }

        public static ApplicationContext getCtx() {
            return ctx;
        }
    }

Person.java

package jbr;

public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private int age;
}

conf.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" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="jbr" />

    <bean id="myCtx" class="jbr.MyContext" />
    <bean id="person" class="jbr.Person">
        <property name="name" value="Ranjith" />
        <property name="age" value="23" />
    </bean>

</beans>

App.java

package jbr;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("jbr/conf.xml");
        Person p = (Person) context.getBean("person");
        System.out.println(p.getName() + " > " + p.getAge());

        ApplicationContext ctx = MyContext.getCtx();
        Person p1 = (Person) ctx.getBean("person");
        System.out.println(p1.getName());
    }
}

ВЫВОД

May 11, 2017 3:26:15 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@37bba400: startup date [Thu May 11 15:26:14 IST 2017]; root of context hierarchy
May 11, 2017 3:26:15 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [jbr/conf.xml]
Ranjith > 23
Ranjith

Ещё вопросы

Сообщество Overcoder
Наверх
Меню