引言:自己整理的springboot学习笔记,适合从未接触过springboot的小白猿,简单易上手,通过本文希望没接触过springboot的你也能顺利完成简单学习,有任何问题请联系作者 [email protected]
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
创建独立的spring应用程序
内嵌tomcat,不需要部署
简化maven配置
自动配置
无需xml相关的配置
spring1.x xml
spring2.x 注解 数据持久层使用xml 业务层使用注解
spring.3.x java配置
spring 4.x java配置
spring 4.x java配置
xml | @configuration |
---|---|
bean标签的形式 | @Bean |
注意 @Bean用来修饰方法,表明返回值交由对象管理
** @configuration 用来修饰类表名当前类为配置类.**
src/main/java
com.baizhi 主包
entity 子包
dao
service
controller
conf
入口类 注意:入口类必须在主包下和子包同级
src/main/resources
springboot的配置文件 注意:配置文件名字必须叫application,将配置文件放置在resources目录下
src/test/java
src/test/resources
导入jar
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.8.RELEASEversion>
parent>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
开发入口类
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
开发配置文件 yml的配置文件需要注意属性名和属性值之间有空格的间隔
注意:默认启动端口号为8080
默认启动没有项目名
server:
port: 8989
context-path: /springboot
1.@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan
//当前的注解是一个组合注解
@Configuration //作用:声明当前类是一个配置类
@ComponentScan //作用:组件扫描 把一些加有@service @controller @component @repository注解的对象交由工厂管理
@EnableAutoConfiguration //开启自动配置 datasource sqlsessionFactorybean mapperScanner
2.@RestController //作用:组合注解 @Controller @ResponseBody 声明当前类为控制器,并且类中所用方法返回json
注意:springboot默认不支持jsp,默认的视图层模版为thmyleaf
1.导入jar
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.0.0version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.0.19version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.38version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.2.8version>
dependency>
2.相关的配置
注意:springboot采用自动配置 装配相关对象所以不需要手动配置相关的组件,但是需要声明动态的参
数,如数据源相关参数
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
driver-class-name: oracle.jdbc.OracleDriver
username: hr
password: hr
mybatis:
mapper-locations: classpath:com/baizhi/mapper/*Mapper.xml
type-aliases-package: com.baizhi.entity
3.手动声明dao包的位置加入注解@MapperScan
使java代码变的更加优雅,以注解的方式代替之前的冗长代码,底层采用字节码技术生成相应方法
1.下载lombok相关插件
2.下载lombok的jar
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.4version>
<scope>providedscope>
dependency>
3.常用注解的解释
@Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setting 方法
@Getter :注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
mybatis的一个插件,根据创建数据库表,生成实体类,dao,mapper文件
1.导入jar以及插件
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.2version>
dependency>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.2version>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.35version>
dependency>
dependencies>
<configuration>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xmlconfigurationFile>
<overwrite>trueoverwrite>
configuration>
plugin>
2.添加generator.xml配置文件
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin">plugin>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin">plugin>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin">plugin>
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true" />
commentGenerator>
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:xe" userId="hr" password="hr">
jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
javaTypeResolver>
<javaModelGenerator targetPackage="com.baizhi.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.baizhi.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
javaClientGenerator>
<table tableName="city" domainObjectName="City"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">table>
context>
generatorConfiguration>
3.执行 mybatis-generator:generate
MBG | 通用Mapper |
---|---|
反向生成实体,dao,mapper | 通过实体帮你生成sql语句 |
1.导入的jar
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>2.1.1version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.0.19version>
dependency>
<dependency>
<groupId>com.oraclegroupId>
<artifactId>oracleartifactId>
<version>1.0.0version>
dependency>
2.配置
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
username: hr
password: hr
driver-class-name: oracle.jdbc.OracleDriver
mybatis:
type-aliases-package: com.baizhi.entity
3.包扫描@MapperScan 注意:不要使用mybatis原生的注解而是采tk.mybatis.spring.annotation.MapperScan
4.mapper接口继承Mapper
@Table //用在类上 声明数据库的表名
@Id //用在属性上 声明当前属性为主键
@Column(name ="username") //作用在属性上 用来指定数据库中的字段名称
//注意:建议使用驼峰命名法 数据库中以下划线分割如 userage 实体类中要使用驼峰规则如 userAge
//主键策略 两种形式分别是oracle 和 mysql
//oracle
@KeySql(sql = "select sm_user_seq.nextval from dual", order = ORDER.BEFORE)
//mysql
@KeySql(useGeneratedKeys = true)
@Transient //用在属性上 作用声明当前属性不是数据库中的列
// 分页 RowBounds rowBounds=new RowBounds(4,4); 第一个参数是起始下标 第二个参数是每页的条数
<dependency>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-jasperartifactId>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
spring:
mvc:
view:
prefix: /
suffix: .jsp
注意:由于内嵌tomcat默认不支持页面热部署的功能需要添加相关的配置
server:
jsp-servlet:
init-parameters:
development: true
1.由于springboot启动其中已经配置了编码过滤器,源码如下,并且默认值为UTF-8,所以不需要配置
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
2.如果配置配置项如下
spring:
http:
encoding:
charset: utf-8
force: true
1.springboot默认装配了文件处理器,源码如下 默认单个文件大小为1MB,一次请求携带的文件大小为10MB
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
2.自定义配置
spring:
http:
multipart:
max-file-size: 10MB
max-request-size: 100MB
1.方法1:在实体类上加上注解
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
2.方法2:全局配置,配置yaml
#配置Jackson时间格式转换
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
1.不需要处理
get请求优先找静态资源,找controller
post请求直接找controller
1.导入测试相关的启动器,默认集成的junit所以无需再次导入junit的jar
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
2.注解
@Runwith(SpringRunner.class) //启动spring的工厂
@SpringbootTest //开启自动配置,并且装配项目中相关bean,如dao,service,controller
1.由于实际开发时需要生产环境和测试环境,为了减少测试环境上线时频繁修改配置文件的问题,可以做配置文件的切分,主配置文件中主要配置公共的参数,小配置文件中配置独立的参数
2.如何选择激活哪个配置文件
spring:
profiles:
active: test
1.导入jar
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.54version>
dependency>
2.将类型转换器交由工厂管理 声明一个类
@Configuration
public class FastJsonConf {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1. 需要定义一个converter转换消息的对象
FastJsonHttpMessageConverter fasHttpMessageConverter = new
FastJsonHttpMessageConverter();
// 2. 添加fastjson的配置信息,比如:是否需要格式化返回的json的数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 3. 在converter中添加配置信息
fasHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fasHttpMessageConverter;
return new HttpMessageConverters(converter);
}
}
3.相关注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
1.日志的级别:debug—info—warn–error 日志级别越低打印日志量越多,越详细
2.日志的分类: 父日志(根日志) 控制全局日志
子日志 某个包中的日志 子日志优先级高于父日志
3.Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
4.Layout:日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
5.打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
1.由于springboot集成了logback所以不需要引入jar直接导入配置文件即可
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> [%p] [%d{yyyy-MM-dd HH:mm:ss}] %m %npattern>
layout>
appender>
<root level="info">
<appender-ref ref="stdout"/>
root>
<logger name="com.baizhi.mapper" level="DEBUG"/>
configuration>
@Configuration
@PropertySource(value = "classpath:jdbc.properties")
public class JavaConf {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driver}")
String driver;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driver);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
1.第一种属性注入方式
声明配置属性类
@ConfigurationProperties(prefix = "jdbc")
public class JDBCProp {
String url;
String driver;
String username;
String password;
}
在相关配置类中引入当前属性类
@EnableConfigurationProperties(value = JDBCProp.class)
public class JavaConf {
@Autowired
JDBCProp jdbcProp;
}
2.第二种注入方式 注意:配置文件中的属性必须和当前对象属性保持一致
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
注意:通过属性注入的方式可以修改容器中的bean
springboot通过启动器的形式将一些必须创建的bean先创建出来,比如视图解析器,处理器适配器,处理器映射器,后续开发者可以通过手工配置bean的形式覆盖原来的对象,或者可以通过更简单的属性注入的方式修改该实例.
################################################################################### @ Bxy_buxiaoyu 原创