【问题标题】:how to instantiate spring data jpa repository without autowired如何在没有自动装配的情况下实例化spring数据jpa存储库
【发布时间】:2019-01-06 19:06:41
【问题描述】:

我的存储库接口为

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 类中自动装配或注入存储库。

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

【问题讨论】:

  • 为什么在需要访问存储库的对象中使用 new 而不是自动装配?
  • 难道您不能使用 JNDI 查找来获取 MyRepository 的托管实例吗?我在 Pojos 中使用 EE bean 做到了这一点,但我从未在 Spring 中尝试过。但我认为,这样做没有区别。
  • 将应用程序上下文传递给new 类的构造函数。然后您可以使用.getBean 方法从上下文中提取Repository
  • 您可以通过使用其中一种静态方法从应用程序上下文获取Repository 实例来获取它。参考这里:stackoverflow.com/questions/129207/… 但是,为什么不让 Spring 妥善管理您的服务呢?如果使用 new 的代码不是您的或难以重构,您可以有一个包装器对象来执行此操作。如果您不按预期使用框架,它将对您不利,而不是为您提供依赖注入优势。
  • 我认为有更好的方法来做这件事,而不是实例化一个新的服务。为什么你不能自动装配这个服务?

标签: java spring spring-boot autowired


【解决方案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);
    }
}

此外,您可以使用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
}

【讨论】:

  • 我不知道AutowireCapableBeanFactory 存在。谢谢你教我一些新东西!
  • 我不明白你的回答或它如何解决问题。
  • 我可以使用“new”关键字吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2011-08-31
  • 2016-04-23
  • 2018-01-07
  • 2020-03-10
相关资源
最近更新 更多