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 是根项目,下面两个是模块。

我的课程如下所示:

DITestMain 位于 spring-di-test-core

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

applicationContext.xml 位于 spring-di-test-core 的资源文件夹中

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

DITest 位于 spring-di-test-store

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

applicationContext.xml 位于 spring-di-test-store

<?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:您没有在 main 方法中创建 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的对象,此时您将获得 NPE。DITest

希望这对您有所帮助。

于 2012-10-30T10:04:51.510 回答