1

Spring を介して取得する 2 つの Bean を持つ Java アプリケーションを試みています。1 つは名前で取得され、もう 1 つは自動配線されています。そのコードは次のとおりです。

package firstspring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FirstSpring
{
  private final static Logger logger = LoggerFactory.getLogger(FirstSpring.class);

  @Autowired
  private Car currentCar;
  public void setCurrentCar(Car car) { this.currentCar = car; }
  public Car getCurrentCar() { return currentCar; }

  private static void say(String message) { System.out.println(message); }

  public static void main(String[] args)
  {
    FirstSpring firstSpring = new FirstSpring();
    firstSpring.go();
  }

  public void go()
  {
    logger.info("here we go");
    ApplicationContext appContext = new ClassPathXmlApplicationContext("/appContext.xml");
    Car firstCar = (Car)appContext.getBean("firstCar");

    say ("firstCar was " + firstCar.getColor());
    say ("currentCar is " + currentCar.getColor());

  }

}

およびその構成:

<?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-2.5.xsd">

      <context:annotation-config/>

    <bean id="firstCar" class="firstspring.Car">
        <property name="color" value="blue" />
        <property name="doors" value="2" />
        <property name="transmission" value="automatic" />
    </bean>

    <bean id="currentCar" class="firstspring.Car" >
        <property name="color" value="red" />
        <property name="doors" value="4" />
        <property name="transmission" value="5-speed" />
    </bean>

    <bean id="firstSpring" class="firstspring.FirstSpring">
            <property name="currentCar" ref="currentCar" />
    </bean>

</beans>

そして、それを完成させるための Car クラス:

package firstspring;

public class Car
{
  String  color;
  int     doors;
  String  transmission;

  public String getColor() { return color; }
  public void setColor(String color) { this.color = color; }

  public int getDoors() { return doors; }
  public void setDoors(int doors) { this.doors = doors; }

  public String getTransmission() { return transmission; }
  public void setTransmission(String transmission) { this.transmission = transmission; }
}

null ポインター例外が発生します。

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5e6458a6: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,firstCar,currentCar,firstSpring,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
Exception in thread "main" java.lang.NullPointerException
    at firstspring.FirstSpring.go(FirstSpring.java:33)
    at firstspring.FirstSpring.main(FirstSpring.java:23)
firstCar was blue

他にもさまざまなことを試しました-構成のcurrentCar Beanに「byName」を配置しましたが、読んだドキュメントによると、それは必要ではないと思います。ここで何が欠けていますか?

4

1 に答える 1

3

と言うとnew FirstSpring()、Spring の制御外にあるそのクラスの独自のインスタンスを作成しているため、Spring はそれを自動配線できません。したがって、 に到達するとcurrentCar.getColor()currentCarnull になります。これが適切に機能するには、オブジェクトを自分で作成する代わりにApplicationContext、メイン メソッドで作成しFirstSpring、Spring からインスタンスを取得して、それを呼び出す必要があります。go()

要するに、Spring は、それ自体が作成していないオブジェクトを管理することはできません (つまり、autowire、initialize、destroy など)。

*これを達成するためにバイトコード ウィービングで AspectJ を使用している場合を除きますが、AspectJ の他の経験がない限り、おそらくまだ触れたくないかなり高度なトピックです。

于 2013-03-03T15:21:25.287 に答える