我开始研究Hazelcast功能,并且一直在尝试通过HazelcastRepository将MapStore用作数据库的Write-Behind缓冲区。我的目标是在MapStore中使用JpaRepository来加载和存储缓存。
我使用的是Spring Boot,经过一些研究,我发现我可以使用@SpringAware在MapStore中自动装配我的存储库,但是每次到达那里,我的Bean都是null
,我得到一个{{ 1}}。
即使经过许多不同的测试,我也无法正常工作,我无法在MapStore中自动装配我的bean
启用SpringAware的此配置有问题吗?还是我看错地方了?
找到了This stackoverflow post,它给了我一些线索,但是由于大多数配置都是xml而不是java,所以我仍然不知道这个问题。 也 在Github Issue中找到了有关如何通过Java配置在Hazelcast中配置SpringAware的信息
然后我在此Git Repo Here中提交了示例代码。
答案 0 :(得分:2)
在研究了提供的代码之后,我发现根据我在Hazelcast上发现的GitHub问题,默认情况下从未默认启用@SpringAware。该问题描述了SpringAware已被禁用,因为它影响了性能,这使我进入了另一个封闭式解决方案,该解决方案使用 SpringManagedContext 通过代码启用注释(避免使用XML),但是并没有这样做仍然解决问题。
找到了真正的解决方案here,将 MapLoaderLifecycleSupport 接口添加到MapStore实现中,并实现票证中所示的init方法:
@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
hazelcastInstance.getConfig().getManagedContext().initialize(this);
}
这将强制在MapStore类中启用 @SpringAware ,因此,能够将任何spring组件自动连接到该类中,如下图所示。
答案 1 :(得分:1)
这里的问题是,当您使用pr
自动接线时,您正在创建名称为personRepository
的spring bean。
在pr
中将personRepository
更改为PersonRepository.java
或者从("pr")
PersonRepository.java
@Autowired
PersonRepository personRepository;
DAO
@Repository("pr")
public interface PersonRepository extends JpaRepository<Person, Integer> {
@Query("SELECT id FROM Person")
Iterable<Integer> findAllId();
}
答案 2 :(得分:0)
将MapStore bean懒惰地注入到您初始化地图的类中也可以:
@Inject
HazelcastConfiguration(@Lazy MyMapStore myMapStore) {
this.myMapStore = myMapStore;
}
在此示例中,MyMapStore
bean包含注入的MyRepository
bean。