自动注入bean,简化持久化
import org.apache.commons.dbcp2.BasicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.FatalBeanException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
@Component
public class DataSourceRegistrar implements BeanDefinitionRegistryPostProcessor, ResourceLoaderAware {
private static final Logger logger = LoggerFactory.getLogger(DataSourceRegistrar.class);
private static final String DATABASE_PROPERTIES_FILE = "database.properties";
private ResourceLoader resourceLoader;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Properties databases = this.loadConfigProperties();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(BasicDataSource.class);
for (String prop : databases.stringPropertyNames()) {
String key = prop;
String value = databases.getProperty(prop);
beanDefinitionBuilder.addPropertyValue(key,value);
}
BeanDefinition dataSourceDef = beanDefinitionBuilder.getBeanDefinition();
registry.registerBeanDefinition("dataSource",dataSourceDef);
//<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
//<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
//<property name="url" value="jdbc:mysql://..."/>
//<property name="username" value="..."/>
//<property name="password" value="..."/>
//</bean>
String sqlSessionFactoryBean = SqlSessionFactoryBean.class.getSimpleName();
BeanDefinition sqlSessionFactoryBeanDef = BeanDefinitionBuilder.rootBeanDefinition(SqlSessionFactoryBean.class)
.addPropertyReference("dataSource","dataSource")
.getBeanDefinition();
registry.registerBeanDefinition(sqlSessionFactoryBean,sqlSessionFactoryBeanDef);
//<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
//<property name="dataSource" ref="dataSource"/>
//</bean>
String mapperScannerConfigurer = MapperScannerConfigurer.class.getSimpleName();
BeanDefinition mapperScannerConfigurerBeanDef =
BeanDefinitionBuilder.rootBeanDefinition(MapperScannerConfigurer.class)
.addPropertyValue("basePackage", "hw.test.db.dao")
.getBeanDefinition();
registry.registerBeanDefinition(mapperScannerConfigurer,mapperScannerConfigurerBeanDef);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
private Properties loadConfigProperties() {
Properties properties = new Properties();
InputStream inputStream = null;
try {
Resource resource = this.resourceLoader.getResource(DATABASE_PROPERTIES_FILE);
if (resource.exists()) {
inputStream = resource.getInputStream();
properties.load(inputStream);
} else {
logger.warn(DATABASE_PROPERTIES_FILE + " not found");
}
} catch (IOException e) {
throw new FatalBeanException("Load " + DATABASE_PROPERTIES_FILE + " failed");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
logger.error("Close inputStream failed", e);
}
}
}
logger.info("{}:{}", DATABASE_PROPERTIES_FILE, properties);
return properties;
}
}
以为代码自动编写bean的注入,不需要再写xml配置文件
dao层代码
import org.apache.ibatis.annotations.Select; public interface PcapFileDao { @Select("select * from pcap_file where id=#{id}") PcapFile getPcapFile(int id); }
最后使用
@Autowired
private PcapFileDao pcapFileDao;

浙公网安备 33010602011771号