我有一个管理我的存储库的存储库管理器。我有@Autowired来实例化我的属性,但它们总是为空。在我的xml中正确配置了bean。有什么理由吗?
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
@Repository("userRepository")
public class UserRepository extends
BaseRepository<User, Long> implements
IUserRepository {
@Autowired
public UserRepository(SessionFactory sessionFactory) {
super(sessionFactory);
}
答案 0 :(得分:22)
我自己就碰到了这个。问题是,当你做
时new RepositoryManager();
在Instance()中,您没有使用Spring创建RepositoryManager,因此您的实例不会发生依赖注入(没有自动装配)。
解决方案是取消Instance()单例模式。如果你想坚持使用Singleton,那么就这样做
@Component
@Scope(value = "singleton")
public class RepositoryManager {
...
}
然后,只要您需要存储库管理器,只需在引用中自动装配(假设调用bean也由Spring管理!)
@Autowired
private RepositoryManager repositoryManager = null;
答案 1 :(得分:5)
请确保您的配置中包含以下内容:
<context:annotation-config />
<context:component-scan base-package="name.of.your.package"></context:component-scan>
如果你有,那么发布你的配置xml
答案 2 :(得分:3)
实际上有一种非常优雅的方式可以让你的蛋糕吃掉它,也就是说,有一个JVM单例也是由Spring管理的。假设您有一个带有自动装配bean的纯java单例,如下所示:
public final class MySingletonClass{
private static MySingletonClass instance;
public static MySingletonClass getInstance(){
if(instance==null){
synchronized{
if(instance==null){
instance = new MySingletonClass();
}
}
}
return instance;
}
@Autowired
private SomeSpringBean bean;
// other singleton methods omitted
}
您可以通过在应用程序上下文中添加以下行来强制Spring管理此单例:
<bean class="com.mypackage.MySingletonClass" factory-method="getInstance"/>
现在你的单身人士将拥有一个SomeSpringBean
自动装配的实例(如果在上下文中可用)。
此外,对于Spring单例bean的典型问题,这是一个'修复',它不是真正的JVM单例,因为它们是由Spring实例化的。使用上面的模式强制执行JVM级单例,即编译器强制单例,以及容器单例。
答案 3 :(得分:0)
发生这种情况的原因是静态方法Instance()
您正在弹簧环境之外创建POJO。
您可以通过向配置中添加<context:spring-configured />
,然后使用RepositoryManager
@Configurable
来解决此问题