SpringBoot迈过深坑

技术文档网 2021-04-21
如何支持jsp

spring boot 不建议使用jsp,因为jsp的整体性能不如thymeleaf等模板引擎。但是如果有特殊需求要jsp,可以参考下面操作:
引入依赖包:

<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-jasper</artifactId>
   <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    <type>jar</type>
</dependency>

<!--无论你的项目中jsp,是放到web下还是放到webapp下,都要打包到META-INF/resources才能映射到,手动修改的路径映射目测只能映射静态资源-->
<resources>
  <resource>
 <directory>${basedir}/src/main/webapp</directory>
  <targetPath>META-INF/resources</targetPath>
  <includes>
    <include>**/*.jsp,**/*.xml,**/*.jpg</include>
  </includes>
</resource>
</resources>
数据源配置

1. 如何使用c3p0数据源

#applications.properties中增加配置
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/SUSONG51?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
c3p0.user = root
c3p0.password = root
c3p0.minPoolSize=20
c3p0.maxPoolSize=20
c3p0.initialPoolSize=20
/**
*数据源配置
**/
@Configuration
public class DatasourceConfiguration {

    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix="c3p0")
    public DataSource dataSource() {
        return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build();
    }
}

2. sqlSessionFactory配置以及添加插件

注意return的对象应该是SqlSessionFactory而不是SqlSessionFactoryBean

    @Autowired
    DataSource dataSource;

    @Bean(name = "sqlSessionFactory")
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactoryBean() {
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setDataSource(dataSource);
        ssfb.setPlugins(new Interceptor[] { new TagParserInterceptor(), new SpringInterceptor() });
        try {
            return ssfb.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

3. 防止发生冲突

//注解是重点,防止和自动配置数据源冲突
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class ZoharBootDemoApplication {
 //启动代码
}

在配合shiro使用时,如果Realm中自动注入的bean使用了dataSource,有可能引发循环依赖问题。通过@Lazy注解解决

    @Autowired
    @Lazy
    private IUserProvider userProvider;
自定义starter

starter主要有两个功能,一个是自动装配,二十管理依赖。
假设starter中有以下代码

@Configuration
public class OrganAutoConfigration {
   @Bean
    public OrganService organService() {
        return new OrganService();
    }
}

resources/META-INF/spring.factories中添加配置

  org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zohar.OrganAutoConfigration

这样引入starter后,就可以自动配置OrganService的bean了,如果没有spring.factories中的配置,就需要在项目中手动扫描或者import.

项目内的文件操作

应该尽量避免项目内的File文件操作,否则打成jar后,会有获取不到的情况。应使用Resource的方式获取资源。

以war方式启动应用

以war的方式启动,需要启动类继承SpringBootServletInitializer,并重写configure方法。SpringBootServletInitializer还提供了onstart等方法,用来替换web.xml中的相关功能。

@SpringBootApplication
@ServletComponentScan
public class AtyApplacation extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(AtyApplacation.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(AtyApplacation.class);
    }

}

pom中改动:

<packaging>war</packaging>

这里可以把自带的tomcat替换成想要的版本,或者替换成jetty等其他容器。 修改scope保证不被导出到war包里

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

相关文章

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo

随机推荐

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo