1. 程式人生 > >Spring Boot配置類編寫

Spring Boot配置類編寫

編寫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);
    }
}