Singleton和@Autowired返回NULL [英] Singleton and @Autowired returning NULL
问题描述
我有一个仓库管理器来管理我的仓库.我有@Autowired实例化我的属性,但它们始终为null.在我的xml中正确配置了bean.有什么原因吗?
I have a repository manager that manages my repositories. I have the @Autowired to instantiate my properties, but they are always null. The beans are correctly configured in my xml. Any reason why?
public class RepositoryManager {
private static RepositoryManager instance;
private RepositoryManager()
{
}
public static RepositoryManager Instance()
{
if(instance == null)
instance = new RepositoryManager();
return instance;
}
@Autowired
private IUserRepository userRepository;
@Autowired
private IRoleRepository roleRepository;
@Autowired
private IAssetRepository assetRepository;
public IUserRepository getUserRepository() {
return userRepository;
}
public void setUserRepository(IUserRepository userRepository) {
this.userRepository = userRepository;
}
public IRoleRepository getRoleReposttory() {
return roleRepository;
}
public void setRoleReposttory(IRoleRepository roleRepository) {
this.roleRepository = roleRepository;
}
public IAssetRepository getAssetRepository() {
return assetRepository;
}
public void setAssetRepository(IAssetRepository assetRepository) {
this.assetRepository = assetRepository;
}
}
dao.xml
<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:component-scan base-package="com.cisco.badges.data.*" />
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
<property name="annotatedClasses">
<list>
<value>com.cisco.badges.data.domain.User</value>
<value>com.cisco.badges.data.domain.Role</value>
<value>com.cisco.badges.data.domain.Asset</value>
<value>com.cisco.badges.data.domain.UserRole</value>
<value>com.cisco.badges.data.domain.UserRole$UserRolePK</value>
<value>com.cisco.badges.data.domain.UserAsset</value>
<value>com.cisco.badges.data.domain.UserAsset$UserAssetPK</value>
</list>
</property>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
userrepository.java
userrepository.java
@Repository("userRepository")
public class UserRepository extends
BaseRepository<User, Long> implements
IUserRepository {
@Autowired
public UserRepository(SessionFactory sessionFactory) {
super(sessionFactory);
}
推荐答案
我自己遇到了这个问题.问题是,当您这样做
I just ran into this myself. The problem is that when you do
new RepositoryManager();
在Instance()中,您没有使用Spring创建RepositoryManager,因此实例没有发生依赖项注入(没有自动装配).
in Instance(), you are not using Spring to create RepositoryManager, and thus the dependency injection isn't happening for your instance (no autowiring).
解决方案是取消Instance()单例模式.如果您要坚持使用Singleton,则可以这样做
The solution is to do away with the Instance() singleton pattern. If you want to insist on a Singleton, then do this
@Component
@Scope(value = "singleton")
public class RepositoryManager {
...
}
然后,在需要存储库管理器的任何地方,只需自动引用它即可(假设调用bean也由Spring管理!)
Then wherever you need the repository manager, just autowire in a reference to it (assuming the calling bean is also managed by Spring!)
@Autowired
private RepositoryManager repositoryManager = null;
这篇关于Singleton和@Autowired返回NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!