首页 > 解决方案 > 如何在没有自动装配的情况下实例化spring数据jpa存储库

问题描述

我的存储库界面为

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

import org.springframework.stereotype.Repository;


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

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

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

标签: javaspringspring-bootautowired

解决方案


有几个选项可用。

首先,您可以将其用作普通依赖项并使用工厂 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);
    }
}

此外,您可以AutowireCapableBeanFactory像往常一样使用 为不受 Spring 管理的对象注入依赖项。请记住,您需要使用严格的 setter 注入。

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
}

推荐阅读