如何在不自动接线的情况下实例化Spring Data JPA存储库

时间:2018-07-30 13:51:08

标签: java spring spring-boot autowired

我的存储库界面为

import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.stereotype.Repository;


@Repository
public interface MyRepository extends JpaRepository<Tokens, Long>{
}

并且我要在上面的存储库中使用的服务隐含文件不是 @Component或@Service,因为其对象是使用new创建的。因此,不允许在我的服务impl类中自动装配或注入存储库。

在这种情况下,还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:1)

有两个可用选项。

首先,您可以将其用作常规依赖项,并使用工厂bean实例化您的对象。

@Component
public class MyFactoryBean {

    private Repository repository;

    @Autowired
    public MyFactoryBean(Repository repository) {
        this.repository = repository;
    }

    public Instance getInstance(Parameter parameter) {
        return new Instance(repository, parameter);
    }
}

如果您的parameter在运行时没有更改,则可以在配置中提供一个bean:

@Configuration
public class MyConfiguration {

    private Repository repository;

    @Autowired
    public MyConfiguration(Repository repository) {
        this.repository = repository;
    }

    @Bean 
    public Instance instance(){
        Parameter parameter = ... // value in a config file or static value 
        return new Instance(repository, parameter);
    }
}

此外,对于非Spring管理的对象,您可以使用AutowireCapableBeanFactory正常注入依赖项。请记住,您需要使用强壮的二传手注射。

private AutowireCapableBeanFactory beanFactory;

@Autowired
public MyFactoryBean(AutowireCapableBeanFactory beanFactory) {
    this.beanFactory = beanFactory;
}

public void doStuff() {
    MyService service = new MyService();
    beanFactory.autowireBean(service); // dependencies will be autowired
}