我正在尝试使用Activiti中的Spring表达式语言引用JPA存储库。但是,由于Spring使用<jpa:repositories/>
创建存储库bean,因此它们没有与之关联的id。有没有办法使用SpEL引用某种类型的bean而不是id?我尝试使用我认为是LocationRepository
的生成名称(locationRepository),但没有成功。
答案 0 :(得分:1)
我假设LocationRepository
是一个接口,并且正在为您生成支持实现。当Spring创建bean并且没有显式指定id时,它通常使用实现类的类名来确定bean id。所以在这种情况下,LocationRepository
的id可能就是生成的类的名称。
但是由于我们不知道它是什么,我们可以创建一个Spring FactoryBean
,它通过自动装配从应用程序上下文中获取LocationRepository
并以新名称将其放回应用程序上下文中
public class LocationRepositoryFactoryBean extends AbstractFactoryBean<LocationRepository> {
@Autowired
private LocationRepository bean;
public Class<?> getObjectType() { return LocationRepository.class; }
public Object createInstance() throws Exception { return bean; }
}
在你的app环境中xml:
<bean name="locationRepository" class="your.package.LocationRepositoryFactoryBean"/>
然后,您应该能够使用bean id locationRepository引用您的LocationRepository
对象。
答案 1 :(得分:0)
不确定如何在SPEL中执行此操作,但您可以使用@Qualifier
来决定应该注入哪个bean。
如果您愿意,可以根据它创建自己的自定义@Qualifier注释和访问bean 喜欢
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier // Just add @Qualifier and you are done
public @interface MyRepository{
}
现在在存储库bean和您要注入它的其他位置使用@MyRepository
注释。
@Repository
@MyRepository
class JPARepository implements AbstractRepository
{
//....
}
注入
@Service
class fooService
{
@Autowire
@MyRepositiry
AbstractRepository repository;
}