使用Spring数据的Java库
问题描述:
我要写一个能够完成一些工作并使用弹簧数据的库。使用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);
}
答
如果您有一个根配置类可以简单到
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
}
}
你不应该启动这样的春天应用程序上下文库中。如果你正在建造一个图书馆,把它建成一个图书馆,而不是别的。让用户决定如何创建bean等。您可以提供xml或基于Java的配置来帮助lib用户更轻松地配置Spring。 –