@Autowire失败了@Repository

时间:2013-11-08 10:02:01

标签: spring annotations repository autowired

我无法使用@Repository注释类使@Autowire注释工作。

我有一个界面:

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实例始终为空:< / p>

@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"});),并且它确实自动装配了用@Component注释的其他类,但是在这个用@Repository注释的类中,它总是为空。< / p>

我错过了什么吗?

3 个答案:

答案 0 :(得分:5)

您的问题很可能是您使用new自己实例化bean,因此Spring不知道它。改为注入bean,或者创建bean @Configurable并使用AspectJ。

答案 1 :(得分: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初始化。

答案 2 :(得分:0)

需要由Spring实例化FooClass才能管理其依赖项。 确保将FooClass设置为bean(@Component或@Service注释或XML声明)。

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

此致