1. 程式人生 > >瞭解xqy骨架專案

瞭解xqy骨架專案

專案的載入流程

專案的啟動預設會載入: web.xml web-fragment.xml

web-fragment.xml 是web.xml的一部分,是web應用的一個邏輯分割槽,相當於對web.xml進行擴充套件。有助於servlet、filter、listener更好的封裝,便於模組化的管理。

看一個web專案

先看父的pom.xml中打包方式,看配置為war方式的模組,找到這個模組,並看這個web.xml(web-fragment.xml),這個是整個程式的入口,在web.xml中會有解決衝突的配置(tomcat伺服器中可能會放多個專案),如果web.xml中沒有spring等的配置的話,就去web-fragment.xml中查詢,這倆種檔案都是會隨著Tomcat的啟動而載入的。

檢視web-fragment.xml,有如下配置:

 <!-- 在啟動Web容器時,自動裝配Spring applicationContext.xml的配置資訊 -->
    <listener>
        <listener-class>cn.com.servyou.xqy.framework.boot.application.ApplicationContextLoaderListener</listener-class>
    </listener>

點選ApplicationContextLoaderListener可以看到裡面的具體實現,它會預設載入servyou.properties檔案

在servyou.properties檔案中有:

servyconf.env=dev 

這個就表明了入口是dev包,然後執行spring-config.xml的配置,依據如下:

String contextConfigLocation = "classpath*:/" + env + "/spring-config.xml";

spring-config.xml中有spring-application-boot.xml,該檔案會配置各種配置檔案,比如

 <!-- 載入資料來源-->
    <import resource="classpath:spring/framework-dao-mybatis/spring-datasource.xml"
/>
<!-- 載入mybatis配置檔案--> <import resource="classpath:spring/framework-dao-mybatis/spring-mybatis.xml"/> <!--框架服務模板--> <import resource="classpath:spring/spring-service-template.xml"/> <!--載入框架中的utils--> <import resource="spring-utils.xml"/> <!--載入vault服務--> <import resource="spring-vault-reference.xml"/> <import resource="spring-scan-bean.xml"/>

各層作用

core層:主要是對一些通用程式碼的提取,沉澱 dao層:持久層,與資料庫進行互動 deploy層:配置、部署、將模組結合起來 facade層:類似service的介面 facadeImpl層:service業務邏輯的處理 web層:controller

spring載入方式

①基於ClassPathXmlApplicationContext

ClassPathXmlApplicationContext classPathXmlApplicationContext=new ClassPathXmlApplicationContext("classpath:conf/spring-mq-container.xml");

②基於作業系統(不理解) ③基於容器的方式(web.xml 自己理解的那種)

查詢的執行流程(自己的理解)

Controller(web)呼叫facade(facadeImpl),facadeImpl呼叫core(service===>serviceImpl),再呼叫dao,dao(ITestDAO===>TestDO)與資料庫進行互動 core會呼叫dao

認知框架中不用配置密碼(待完善)

在spring-application-boot.xml中找到相關資料庫的配置,即為spring-datasource.xml,開啟這個檔案,裡面沒有密碼的配置,但是有以下配置:

<property name="passwordCallback" ref="dbPasswordCallback"/>

然後就就檢視所引用的物件裡面具體做了什麼……

spring中bean標籤中的id解析

spring中的bean標籤中,一般都有一個唯一標識的,如果沒有的話,spring會自動生成一個以class類名小寫的id,來唯一標識這個bean,如果bean中id有重名字的話,後面的一般會覆蓋前面的(預設,因為allowBeanDefinitionOverriding=true) 原始碼在org.springframework.beans.factory.support.DefaultListableBeanFactory中

synchronized (this.beanDefinitionMap) {  
    Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);  
    if (oldBeanDefinition != null) {  
        if (!this.allowBeanDefinitionOverriding) {  
            throw new BeanDefinitionStoreException(beanDefinition  
                    .getResourceDescription(), beanName,  
                    "Cannot register bean definition ["  
                            + beanDefinition + "] for bean '"  
                            + beanName + "': There is already ["  
                            + oldBeanDefinition + "] bound.");  
        } else {  
            if (this.logger.isInfoEnabled()) {  
                this.logger  
                        .info("Overriding bean definition for bean '"  
                                + beanName + "': replacing ["  
                                + oldBeanDefinition + "] with ["  
                                + beanDefinition + "]");  
            }  
        }  
    } else {  
        this.beanDefinitionNames.add(beanName);  
        this.frozenBeanDefinitionNames = null;  
    }  
    this.beanDefinitionMap.put(beanName, beanDefinition);  
    resetBeanDefinition(beanName);  
}

須知知識

①classpath*====>表示會載入所有的配置 包括外部包的中的配置 ②Servlet是什麼? 執行在web容器或者其他伺服器上的java程式 ③DispathcerServlet 排錯時或debug除錯時,最能看出問題出在哪,前端控制器這是是註解等都要配置的) (對於除錯自己沒有嘗試過 ****) ④本地 遠端==>通過執行緒(JVM)來區分 ⑤流的作用:對檔案進行讀寫操作 使用檔案可以儲存想要的資料以便在java執行緒關閉後可以再次獲取到資料,同樣也可以放到資料庫中 ⑥新增依賴的方式 找到自己所需要的類在哪個jar下,然後在去maven的官方倉庫中找,一般找稍微比較新、用的人比較多的版本

本地與遠端

一般本地指的是當前程序本身或者本地物理機磁碟。例如本地檔案,指的是放在當前物理機磁碟上的檔案,本地記憶體是相對於參照程序來看的,比如Java的本地記憶體就是指作業系統分配給jvm虛擬機器的記憶體空間,而且一般特指堆記憶體空間。遠端的話就是非當前程序,別的程序,或者另一物理機上的程序或者檔案。 如果是一臺機器上的倆個不同的程序話,那麼這倆程序就屬於遠端,如果存在呼叫,那麼就是遠端呼叫(遠端呼叫一般指內網中不同程序之間的呼叫)