SpringBoot引入模板引擎
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<properties>
<!--切換thymeleaf版本-->
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本 -->
<!-- thymeleaf2 layout1-->
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
</properties>

image.png
SpringBoot持久化(mybatis)
<!-- mysql 數(shù)據(jù)庫驅(qū)動. -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--
spring-boot mybatis依賴:
請不要使用1.0.0版本,因為還不支持?jǐn)r截器插件,
1.1.1 是博主寫帖子時候的版本,大家使用最新版本即可
-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
配置事務(wù)
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- aop應(yīng)用事務(wù)管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* cn.itsource.eloan.core.service..*.*(..))" id="coreServicePointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="coreServicePointcut"/>
</aop:config>
獲取自增id
####注解
```java
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into Demo(name,password) values(#{name},#{password})")
public long save(Demo name);//對象上面也有
xml
<insert id="save" parameterType="User" useGeneratedKeys="true"
keyColumn="id"
keyProperty="id"
>
Spring boot 啟動分析
創(chuàng)建SpringApplication對象
initialize(sources);
private void initialize(Object[] sources) {
//保存主配置類
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
//判斷當(dāng)前是否一個web應(yīng)用
this.webEnvironment = deduceWebEnvironment();
//從類路徑下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起來
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
//從類路徑下找到ETA-INF/spring.factories配置的所有ApplicationListener
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//從多個配置類中找到有main方法的主配置類
this.mainApplicationClass = deduceMainApplicationClass();
}
運行run方法
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
//獲取SpringApplicationRunListeners;從類路徑下META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//回調(diào)所有的獲取SpringApplicationRunListener.starting()方法
listeners.starting();
try {
//封裝命令行參數(shù)
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//準(zhǔn)備環(huán)境
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
//創(chuàng)建環(huán)境完成后回調(diào)SpringApplicationRunListener.environmentPrepared();表示環(huán)境準(zhǔn)備完成
Banner printedBanner = printBanner(environment);
//創(chuàng)建ApplicationContext;決定創(chuàng)建web的ioc還是普通的ioc
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
// 準(zhǔn)備上下文
// 1.將environment保存到容器中
// 2.觸發(fā)監(jiān)聽事件——調(diào)用每個SpringApplicationRunListeners的contextPrepared方法
// 3.調(diào)用ConfigurableListableBeanFactory的registerSingleton方法向容器中注入applicationArguments與printedBanner
// 4.觸發(fā)監(jiān)聽事件——調(diào)用每個SpringApplicationRunListeners的contextLoaded方法
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//刷新容器;ioc容器初始化(如果是web應(yīng)用還會創(chuàng)建嵌入式的Tomcat);Spring注解版
//掃描,創(chuàng)建,加載所有組件的地方;(配置類,組件,自動配置)
refreshContext(context);
//從ioc容器中獲取所有的ApplicationRunner和CommandLineRunner進(jìn)行回調(diào)
//ApplicationRunner先回調(diào),CommandLineRunner再回調(diào)
afterRefresh(context, applicationArguments);
//所有的SpringApplicationRunListener回調(diào)finished方法
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//整個SpringBoot應(yīng)用啟動完成以后返回啟動的ioc容器;
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}
/**
* 原來spring項目啟動
* 1)啟動Tomcat
* 2)啟動Spring容器 DispatcherServlet(xml) 創(chuàng)建一個spring容器(WebApplicationContext)
* 3)把相關(guān)的組件納入到spring容器,Controller就在spring中生效
* 在xml中還配置了service,controller,mapper的掃描,
*/
@SpringBootApplication
@MapperScan("cn.itsource.mapper")
public class App {
//java -jar 入口
public static void main(String[] args) {
/**
* 1 啟動一個內(nèi)置Tomcat
* 2 創(chuàng)建一個spring容器
* 3 這個spring容器也管理子子孫孫包下面的組件
* ===========
* 由于自動配置功能,在我們使用某個功能基本不用做任何xml配置,它以javaconfig的方式
* 給我們做了自動,讓我們使用起來非常happy。
* 由于有一個main函數(shù)的入門,可以打jar,直接java-jar進(jìn)行執(zhí)行,讓我們部署起來非常方便。
*/
SpringApplication.run(App.class,args);
}
}