com.joutvhu.dynamic.jdbc.support.DynamicJdbcRepositoryFactoryBean Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of spring-dynamic-jdbc Show documentation
Show all versions of spring-dynamic-jdbc Show documentation
The Spring Dynamic JDBC will make it easy to implement dynamic queries with Spring Data JDBC
package com.joutvhu.dynamic.jdbc.support;
import com.joutvhu.dynamic.commons.util.ApplicationContextHolder;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.jdbc.core.convert.DataAccessStrategy;
import org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy;
import org.springframework.data.jdbc.core.convert.JdbcConverter;
import org.springframework.data.jdbc.core.convert.SqlGeneratorSource;
import org.springframework.data.jdbc.repository.QueryMappingConfiguration;
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean;
import org.springframework.data.mapping.callback.EntityCallbacks;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.util.Assert;
import java.io.Serializable;
/**
* Special adapter for Springs {@link DynamicJdbcRepositoryFactoryBean} interface to allow easy setup of
* repository factories via Spring configuration.
*
* @author Giao Ho
*/
public class DynamicJdbcRepositoryFactoryBean, S, ID extends Serializable> extends JdbcRepositoryFactoryBean
implements ApplicationContextAware {
private ApplicationEventPublisher publisher;
private BeanFactory beanFactory;
private RelationalMappingContext mappingContext;
private JdbcConverter converter;
private DataAccessStrategy dataAccessStrategy;
private QueryMappingConfiguration queryMappingConfiguration = QueryMappingConfiguration.EMPTY;
private NamedParameterJdbcOperations operations;
private EntityCallbacks entityCallbacks;
private Dialect dialect;
/**
* Creates a new {@link JdbcRepositoryFactoryBean} for the given repository interface.
*
* @param repositoryInterface must not be {@literal null}.
*/
public DynamicJdbcRepositoryFactoryBean(Class extends T> repositoryInterface) {
super(repositoryInterface);
}
@Override
protected RepositoryFactorySupport doCreateRepositoryFactory() {
DynamicJdbcRepositoryFactory jdbcRepositoryFactory = new DynamicJdbcRepositoryFactory(dataAccessStrategy,
mappingContext, converter, dialect, publisher, operations);
jdbcRepositoryFactory.setQueryMappingConfiguration(queryMappingConfiguration);
jdbcRepositoryFactory.setEntityCallbacks(entityCallbacks);
jdbcRepositoryFactory.setBeanFactory(beanFactory);
return jdbcRepositoryFactory;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
super.setApplicationEventPublisher(publisher);
this.publisher = publisher;
}
@Autowired
@Override
public void setMappingContext(RelationalMappingContext mappingContext) {
super.setMappingContext(mappingContext);
this.mappingContext = mappingContext;
}
@Autowired
@Override
public void setDialect(Dialect dialect) {
super.setDialect(dialect);
this.dialect = dialect;
}
@Override
public void setDataAccessStrategy(DataAccessStrategy dataAccessStrategy) {
super.setDataAccessStrategy(dataAccessStrategy);
this.dataAccessStrategy = dataAccessStrategy;
}
@Autowired(required = false)
@Override
public void setQueryMappingConfiguration(QueryMappingConfiguration queryMappingConfiguration) {
super.setQueryMappingConfiguration(queryMappingConfiguration);
this.queryMappingConfiguration = queryMappingConfiguration;
}
@Override
public void setJdbcOperations(NamedParameterJdbcOperations operations) {
super.setJdbcOperations(operations);
this.operations = operations;
}
@Autowired
@Override
public void setConverter(JdbcConverter converter) {
super.setConverter(converter);
this.converter = converter;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
this.beanFactory = beanFactory;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHolder.appContext = applicationContext;
}
@Override
public void afterPropertiesSet() {
Assert.state(this.mappingContext != null, "MappingContext is required and must not be null!");
Assert.state(this.converter != null, "RelationalConverter is required and must not be null!");
if (this.operations == null) {
Assert.state(beanFactory != null, "If no JdbcOperations are set a BeanFactory must be available.");
this.operations = beanFactory.getBean(NamedParameterJdbcOperations.class);
}
if (this.dataAccessStrategy == null) {
Assert.state(beanFactory != null, "If no DataAccessStrategy is set a BeanFactory must be available.");
this.dataAccessStrategy = this.beanFactory.getBeanProvider(DataAccessStrategy.class) //
.getIfAvailable(() -> {
Assert.state(this.dialect != null, "Dialect is required and must not be null!");
SqlGeneratorSource sqlGeneratorSource = new SqlGeneratorSource(this.mappingContext, this.converter,
this.dialect);
return new DefaultDataAccessStrategy(sqlGeneratorSource, this.mappingContext, this.converter,
this.operations);
});
}
if (this.queryMappingConfiguration == null) {
this.queryMappingConfiguration = QueryMappingConfiguration.EMPTY;
}
if (beanFactory != null) {
entityCallbacks = EntityCallbacks.create(beanFactory);
}
super.afterPropertiesSet();
}
}