Spring Boot 迈过深坑 - zohar24/zohar GitHub Wiki
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>
#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();
}
}
注意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);
}
}
//注解是重点,防止和自动配置数据源冲突
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class ZoharBootDemoApplication {
//启动代码
}
在配合shiro使用时,如果Realm中自动注入的bean使用了dataSource,有可能引发循环依赖问题。通过@Lazy注解解决
@Autowired
@Lazy
private IUserProvider userProvider;
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的方式启动,需要启动类继承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>