2020-02-08 SpringBoot03

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);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容