-1

我要写一个能够完成一些工作并使用弹簧数据的库。使用Spring数据的Java库

这个想法是使用这个库的项目可以导入这个jar并使用这个库:MyLib.doSomeStuff()。

以这种方式使用Spring是可能的,我怎样才能在doSomeStuff()方法中初始化ApplicationContext,以便DI和带有DataSources的@Configuration类将被加载?

public class MyLib { 

@Autowired 
private static SomeJpaRepository someJpaRepository; 

    public static void doSomeStuff(){ 
    ...init ApplicationContext.... 
    ...setup DataSources... 
    List<SomeEntity> someEntityList = someJpaRepository.someMethod(); 
    } 

// or 
    public static List<SomeEntity> getSomeEntityList() { 
    return someJpaRepository.finAll(); 
    } 
} 

//other package 
@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef = "gxEntityManager", transactionManagerRef = "gxTransactionManager", 
     basePackages = "com.gx") 
public class GxConfig { 

    @Primary 
    @Bean(name = "gxDataSource") 
    public DataSource gxDataSource() { 
    DataSourceBuilder dataSourceBuilderGx = null; 
    //.. 
    return dataSourceBuilderGx.build(); 
    } 

    @Primary 
    @Bean(name = "gxEntityManager") 
    public LocalContainerEntityManagerFactoryBean gxEntityManagerFactory(EntityManagerFactoryBuilder builder) { 
    return builder.dataSource(gxDataSource()).packages("com.gx").build(); 
} 

    @Primary 
    @Bean(name = "gxTransactionManager") 
    public PlatformTransactionManager gxTransactionManager(
     @Qualifier("gxEntityManager") EntityManagerFactory entityManagerFactory) { 
    return new JpaTransactionManager(entityManagerFactory); 
    } 
} 

//other package 
public interface SomeEntity extends JpaRepository<SomeEntity, Long> 
{ 
    SomeEntity findById(Long id); 
} 
+0

你不应该启动这样的春天应用程序上下文库中。如果你正在建造一个图书馆,把它建成一个图书馆,而不是别的。让用户决定如何创建bean等。您可以提供xml或基于Java的配置来帮助lib用户更轻松地配置Spring。 –

回答

0

如果您有一个根配置类可以简单到

ApplicationContext context = 
    new AnnotationConfigApplicationContext(GxConfig.class); 

只是每次调用doStuff()如创建一个应用程序上下文的时候不要做它是昂贵的。如果你的图书馆是用来作为一个黑匣子,我想可以有这个孤立的应用程序上下文。

你可以做这样的事情:

public class MyLib { 

    private ApplicationContext context; 

    public MyLib() { 
    context = new AnnotationConfigApplicationContext(GxConfig.class); 
    } 

    public void doStuff() { 
    SomeBean bean = context.getBean(SomeBean.class); 
    // do something with the bean 
    } 

}