3

我正在尝试在 Activiti 中使用 Spring 表达式语言引用 JPA 存储库。但是,由于 Spring 使用 来创建存储库 bean <jpa:repositories/>,因此它们没有关联的 id。有没有办法使用 SpEL 来引用某种类型的 bean 而不是通过 id?我尝试使用我认为会为 生成的名称(locationRepository)LocationRepository,但没有成功。

4

2 回答 2

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; }
}

在您的应用上下文 xml 中:

<bean name="locationRepository" class="your.package.LocationRepositoryFactoryBean"/>

然后,您应该能够LocationRepository使用 bean id locationRepository 引用您的对象。

于 2012-09-07T17:52:03.673 回答
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{

}

现在@MyRepository在存储库 bean 和其他要注入它的地方使用注释。

@Repository   
@MyRepository  
class JPARepository implements AbstractRepository    
{
  //....
}

注入它

@Service 
class fooService   
{
    @Autowire 
    @MyRepositiry
    AbstractRepository repository;

}
于 2012-09-07T06:16:45.940 回答