4

我无法使@Autowire 注释与@Repository 注释类一起工作。

我有一个界面:

public interface AccountRepository {
    public Account findByUsername(String username);
    public Account findById(long id);
    public Account save(Account account);
}

实现带有 @Repository 注释的接口的类:

@Repository
public class AccountRepositoryImpl implements AccountRepository {
    public Account findByUsername(String username){
        //Implementing code
    }
    public Account findById(long id){
        //Implementing code            
    }
    public Account save(Account account){
        //Implementing code
    }
}

在另一个类中,我需要使用此存储库通过用户名查找帐户,因此我使用自动装配,但我正在检查它是否有效并且 accountRepository 实例始终为 null

@Component
public class FooClass {
    @Autowired
    private AccountRepository accountRepository;

    ...

    public barMethod(){
        logger.debug(accountRepository == null ? "accountRepository is NULL" : "accountRepository IS NOT NULL");
    }
}

我还设置了要扫描组件的包sessionFactory.setPackagesToScan(new String [] {"com.foo.bar"});

我错过了什么吗?

4

3 回答 3

6

您的问题很可能是您自己使用 bean 实例化 bean new,因此 Spring 没有意识到这一点。而是注入 bean,或者制作 bean@Configurable并使用 AspectJ。

于 2013-11-13T22:10:12.043 回答
2

您似乎还没有配置要启用的 Spring 注释。我建议您查看您的组件扫描注释。例如在 Java 配置应用程序中:

@ComponentScan(basePackages = { "com.foo" })

... 或 XML 配置:

<context:annotation-config />
<context:component-scan base-package="com.foo" />

如果您的 FooClass 不在该配置中定义的基本包下,则 @Autowired 将被忽略。

另外一点,我建议尝试@Autowired(required = true) - 这应该会导致您的应用程序在启动时失败,而不是等到您使用该服务抛出 NullPointerException。但是,如果没有配置注解,则​​不会失败。

您应该使用 JUnit 测试来测试您的自动装配是否正确完成。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
    classes = MyConfig.class, 
    loader = AnnotationConfigContextLoader.class)
public class AccountRepositoryTest {

    @Autowired
    private AccountRepository accountRepository;

    @Test
    public void shouldWireRepository() {
        assertNotNull(accountRepository);
    }

}

这应该表明您的基本配置是否正确。下一步,假设这是作为 Web 应用程序部署的,将检查您是否在 web.xml 和 foo-servlet.xml 配置中放置了正确的部分以触发 Spring 初始化。

于 2013-11-08T10:16:37.370 回答
0

FooClass 需要由 Spring 实例化才能管理他的依赖项。确保 FooClass 被实例化为 bean(@Component 或 @Service 注释,或 XML 声明)。

编辑:sessionFactory.setPackagesToScan正在寻找 JPA/Hibernate 注释,而@Repository它是 Spring Context 注释。 AccountRepositoryImpl应该在 Springcomponent-scan范围内

问候,

于 2013-11-08T10:05:13.237 回答