我无法使用@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>
我错过了什么吗?
答案 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
范围内
此致