SSM的疑難雜症--持續更新



1. Spring


單例Bean的線程安全問題

單例bean存在線程安全問題,當多線程操做成員變量時會有衝突發生,若是定義在方法入參處那樣在棧中則不會。避免使用成員變量或推薦使用ThreadLocal成員變量拉html


Bean的生命週期


預先知識前端

其實在學習Spring時就有接觸,沒有使用就很容易忘記,見名知意java

一、實現InitializingBean接口中的afterPropertiesSet方法spring

二、實現DisposableBean接口中的destroy方法sql

三、bean標籤中init-method方法數據庫

四、bean標籤中destroy-method方法編程

五、實現BeanPostProcessor接口的postProcessBeforeInitialization和postProcessAfterInitialization:分別在容器初始化bean對象以前以後執行json

六、實現xxxAware接口,獲取Spring框架的對象:設計模式

  • ApplicationContextAware:得到ApplicationContext對象,能夠用來獲取全部Bean definition的名字
  • BeanFactoryAware:得到BeanFactory對象,能夠用來檢測Bean的做用域
  • BeanNameAware:得到Bean在配置文件中定義的名字
  • ResourceLoaderAware:得到ResourceLoader對象,能夠得到classpath中某個文件
  • ServletContextAware:在一個MVC應用中能夠獲取ServletContext對象,能夠讀取context中的參數
  • ServletConfigAware:在一個MVC應用中能夠獲取ServletConfig對象,能夠讀取config中的參數


總結:緩存

  • Bean容器讀取配置文件並註冊類信息
  • Bean容器反射建立Bean的實例
  • Bean容器根據註冊信息進行依賴注入
  • 若實現BeanNameAware接口,則調用setBeanName方法,傳入Bean的名字
  • 若實現BeanClassLoaderAware接口,則調用setBeanClassLoader方法,傳入ClassLoader對象的實例
  • 若實現BeanFactoryAware接口,調用setBeanClassLoader()方法,傳入ClassLoader對象的實例
  • 與上面的相似,若是實現了其餘*Aware接口,就調用相應的方法
  • 若實現BeanPostProcessor接口,執行postProcessBeforeInitialization方法
  • 若實現InitializingBean接口,執行afterPropertiesSet方法
  • 如有配置init-method屬性,執行指定的方法
  • 若實現BeanPostProcessor接口,執行postProcessAfterInitialization方法
  • 當銷燬Bean時,若實現DisposableBean接口,執行destroy方法
  • 當銷燬Bean時,若配置destroy-method屬性,執行指定的方法




Spring用到的設計模式

工廠模式:BeanFactory和ApplicationContext建立bean對象

代理模式:AOP的動態代理

單例模式:默認bean時單例的

模板模式:JDBCTemplate對數據庫操做的類

觀察者模式:Spring的事件


Bean的加載和使用過程

Spring從配置文件中讀取類的信息將其放入容器的BeanDefinition註冊表中,而後根據註冊表實例化bean對象將其放入緩存池中,當須要使用時,若是使用@Autowired註解,則根據類類型匹配key值,(map存放bean對象),匹配不到報錯、匹配多個,則按名字再匹配,沒有或多個也報錯。能夠用@Qualifier指定名字匹配


AOP的實現方式

Spring的AOP是面向切面編程,其有JDK的基於接口和cglib基於子類的實現,Spring都集成了兩者,因此是開發者是透明的,單例使用JDK,多例使用cglib效率會更好








2. SpringMVC


流程

一句話總結:請求發送到前端控制器,而後轉移給映射器返回處理器和攔截器鏈,前端控制器經過控制器獲取適配器,而後調用裏面的hanlder方法執行控制器方法,控制器將json返回值返回到客戶端,具體請看 SpringMVC知識梳理


亂碼

post:使用CharacterEncodingFilter

get:參數重編譯,更改tomcat配置文件的編碼、

使用json的話映射註解中加入@RequestMapping(value = "/user", produces = "application/json;charset=utf-8")

或者springmvc.xml全局配置

<!--  開啓mvc的註解支持,而且在Responsebody上使用UFT-8  -->
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value="text/html;charset=UTF-8"></property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>


轉發和重定向

//     項目名 ssm
//     @RequestMapping(value = "/user")
//     /index2.html表示項目根地址,沒有帶項目名
//     index2.html被mapping帶亂變成 /ssm/user/index2.html
//     因此全寫上

response.sendRedirect("/ssm/index2.html");
request.getRequestDispatcher("/ssm/index2.html").forward(request,response);








3. Mybatis


Dao接口中參數不一樣可重載嗎?

不行,由於是根據全限定類名+方法名做爲key值惟必定位一個MappedStatmented的


分頁原理

  • 物理分頁:使用RowBounds在結果集中進行分頁
  • 邏輯分頁:在語句查詢中進行limit分頁


分頁插件原理

使用Mybatis提供的接口,攔截語句後再改寫語句


延遲加載原理

使用cglib動態代理,攔截方法,當發現調用的屬性爲空時,會單獨發送事先保存的關聯對象的sql語句


動態代理的要求

  • 代理接口的全限定類名與映射文件命名空間相同
  • 代理接口的方法名與映射文件語句的id相同
  • 代理接口的參數類型與映射文件語句的參數類型相同
  • 代理接口的返回值類型與映射文件語句的返回值類型相同





終於階段性完成一部份內容了,好想出去啊 2020/03/06

相關文章
相關標籤/搜索