-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 
    } 

} 
相關問題