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);
    }
}
  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值