1

次の構造のMavenプロジェクトがあります。

spring-di-test
 +--spring-di-test-core
 |     com.example.core.DITestMain
 +--spring-di-test-store
       com.example.store.DITest
       com.example.store.RandomStringService

ここで、spring-di-testはルートプロジェクトであり、以下の2つはモジュールです。

私のクラスは次のようになります。

spring-di-test-coreにあるDITestMain

public class DITestMain {
    public static void main(String[] args) {
        new DITest().run();
    }
}

spring-di-test-coreのresourcesフォルダーにあるapplicationContext.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-3.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:spring-configured/>
    <context:component-scan base-package="com.example.*" annotation-config="true"/>

</beans>

spring-di-test-storeにあるDITest

@Configurable(preConstruction = true)
@Controller
public class DITest {   
    @Autowired(required=true)
    private RandomStringService randomStringService;

    public void run() {
        System.out.println(randomStringService.getRandomString());
    }
}

spring-di-test-storeにあるRandomStringService

@Service("randomStringService")
public class RandomStringService {

    private final Random random;

    public RandomStringService() {
        random = new Random();
    }

    public String getRandomString() {
        StringBuilder sb = new StringBuilder();
        int length = random.nextInt(20);
        for (int i = 0; i < length + 1; i++) {
            sb.append(new Character((char) ('a' + random.nextInt(20))));
        }
        return sb.toString();
    }
}

spring-di-test-storeにあるapplicationContext.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-3.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:spring-configured/>
    <context:component-scan base-package="com.example.*" annotation-config="true"/>

</beans>

DITestMainを実行すると、randomStringServiceに対してNullPointerExceptionが発生します。何が悪かったのか?

4

2 に答える 2

2

1: メイン メソッドで Spring コンテキストを作成していない

2: ロード時のウィービングを有効にするために必要なすべての構成を完了しましたか ( @ConfigurableBean が機能するように)。

http://static.springsource.org/spring/docs/3.0.x/reference/aop.html#aop-using-aspectjを見て、章全体をよく読んでください。

于 2012-10-30T10:07:02.700 に答える
0

DITestMainクラスをJavaアプリケーションとして実行しているため、これは機能しません。また、アプリケーション コンテキストは読み込まれません。テストするには、これを Web アプリケーションとして実行する必要があります。Java アプリケーションとして実行する場合、randomStringServiceinのオブジェクトはDITest作成されず、その時点で NPE が取得されます。

これがお役に立てば幸いです。

于 2012-10-30T10:04:51.510 に答える