Spring Boot配置類編寫
阿新 • • 發佈:2019-01-02
編寫Spring Boot配置類
解釋
多個配置類的編寫(一主多從)
啟動類為:Application
主配置類為:SpringConfiguration
從配置類為:SpringWebMvcConfigurer
1.啟動類匯入主配置類
@SpringBootApplication
@Import(SpringConfiguration.class)
public class Application {
...
}
2.主配置類匯入從配置類
@Configurable
@Import(SpringWebMvcConfigurer.class)
public class SpringConfiguration {
...
}
3.編寫從配置類
@Configuration
public class SpringWebMvcConfigurer {
...
}
確定包掃描路徑
指定掃描元件的包路徑,可以減少掃描的時間。在主配置類上使用@ComponentScan註解。
@ComponentScan({ "team.sevendwarfs.persistence", "team.sevendwarfs.web.controller" })
public class SpringConfiguration {
...
}
例子中只掃描 Controller和持久層中Entity, Repository, Server 元件
指定屬性檔名
預設情況下,資原始檔名為application.properties,也可以自定義,不過需要顯式指定
@PropertySource({"classpath:application-dev.properties"})
public class SpringConfiguration {
...
}
編寫多個屬性檔案
將屬性檔案分為 開發環境屬性檔案 和 生產環境屬性檔案。結構為:一主多從
application.properties 主配置檔案
application-dev.properties
application-prod.properties
// fileName:application.properties
spring.profiles.active=dev
// fileName:application-dev.properties
server.port=8082
...
// fileName:application-prod.properties
server.port=80
...
配置類預設讀取application.properties,而application.properties中指定了當前啟用的屬性檔案為application-dev.properties,那麼就匯入了application-dev.properties的屬性
示例
啟動類
// FileName: Application
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
@Import(SpringConfiguration.class)
public class Application {
/**
* @Description 整個web應用的入口點.
*/
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
主配置類
// fileName: SpringConfiguration
@Configurable
@ComponentScan({ "team.sevendwarfs.persistence", "team.sevendwarfs.web" +
".controller" })
@PropertySource({"classpath:application.properties"})
@Import(SpringWebMvcConfigurer.class)
public class SpringConfiguration {
private static final String HIBERNATEDIALECT = "hibernate.dialect";
private static final String HIBERNATESHOWSQL = "hibernate.show_sql";
private static final String HIBERNATEDDLAUTO = "hibernate.hbm2ddl.auto";
private static final String HIBERNATEPACKAGESCAN = "hibernate.packagesToScan";
private static final String HIBERNATEFORMATSQL = "hibernate.format_sql";
@Value("${spring.datasource.jdbcUrl}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.minPoolSize}")
private Integer minPoolSize;
@Value("${spring.datasource.maxPoolSize}")
private Integer maxPoolSize;
@Value("${spring.datasource.maxIdleTime}")
private Integer maxIdleTime;
@Value("${spring.datasource.acquireIncrement}")
private Integer acquireIncrement;
@Value("${spring.datasource.maxStatements}")
private Integer maxStatements;
@Value("${spring.datasource.initialPoolSize}")
private Integer initialPoolSize;
@Value("${spring.datasource.idleConnectionTestPeriod}")
private Integer idleConnectionTestPeriod;
@Autowired
private Environment env;
@Bean(name = "dataSource")
@Primary
public DataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setDriverClass(driverClassName);
dataSource.setMinPoolSize(minPoolSize);
dataSource.setMaxPoolSize(maxPoolSize);
dataSource.setMaxIdleTime(maxIdleTime);
dataSource.setAcquireIncrement(acquireIncrement);
dataSource.setMaxStatements(maxStatements);
dataSource.setInitialPoolSize(initialPoolSize);
dataSource.setIdleConnectionTestPeriod(idleConnectionTestPeriod);
return dataSource;
}
@Bean("localSessionFactoryBean")
public LocalSessionFactoryBean localSessionFactoryBean(DataSource dataSource) throws
PropertyVetoException, IOException {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(HIBERNATEPACKAGESCAN));
// 設定完屬性之後需要呼叫 afterPropertiesSet方法使配置生效
sessionFactoryBean.setHibernateProperties(hibProperties());
sessionFactoryBean.afterPropertiesSet();
return sessionFactoryBean;
}
@Bean("sessionFactory")
@Primary
public SessionFactory sessionFactory(LocalSessionFactoryBean localSessionFactoryBean) throws
PropertyVetoException, IOException {
SessionFactory sessionFactory = localSessionFactoryBean.getObject();
return sessionFactory;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory
(DataSource dataSource) {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setPackagesToScan(env.getRequiredProperty(HIBERNATEPACKAGESCAN));
// 設定完屬性之後需要呼叫 afterPropertiesSet方法使配置生效
em.setJpaProperties(hibProperties());
em.afterPropertiesSet();
return em;
}
@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean
public FilterRegistrationBean registerOpenEntityManagerInViewFilterBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(5);
return registrationBean;
}
private Properties hibProperties() {
Properties properties = new Properties();
properties.put(HIBERNATEDIALECT, env.getRequiredProperty(HIBERNATEDIALECT));
properties.put(HIBERNATESHOWSQL, env.getRequiredProperty(HIBERNATESHOWSQL));
properties.put(HIBERNATEDDLAUTO, env.getRequiredProperty(HIBERNATEDDLAUTO));
properties.put(HIBERNATEFORMATSQL, env.getRequiredProperty(HIBERNATEFORMATSQL));
return properties;
}
}
MVC從配置類
// FileName: SpringWebMvcConfigurer
@Configuration
public class SpringWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 新增攔截規則
// 只有使用者登入過後才能訪問 user/目錄下資源
registry.addInterceptor(new UserInterceptor()).addPathPatterns
("/api/user/**");
/**
* 只有登入管理員賬號後才能訪問管理員目錄
* 例外:管理員登入路徑 /api/admin/login
*/
registry.addInterceptor(new AdminInterceptor()).addPathPatterns
("/api/admin/**").excludePathPatterns("/api/admin/login");
super.addInterceptors(registry);
}
}