引用没有id的bean

时间:2012-09-06 17:58:41

标签: spring el spring-el activiti

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

2 个答案:

答案 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;

}