Spring學習筆記 --Spring基礎介紹

**概要:**說起Spring,作爲java開發程序員必備技能,掌握Spring常用開發技術點是必須的。包含DI IOC AOP思想。Spring全家桶(boot cloud security等).
在這裏插入圖片描述

Spring 框架是一個開源的 Java 平臺,它最初是由 Rod Johnson 編寫的,
並且於 2003 年 6 月首次在 Apache 2.0 許可下發布。
Spring 是輕量級的框架,其基礎版本只有 2 MB 左右的大小。
Spring 框架的核心特性是可以用於開發任何 Java 應用程序,
但是在 Java EE 平臺上構建 web 應用程序是需要擴展的。
Spring 框架的目標是使 J2EE 開發變得更容易使用,
通過啓用基於 POJO 編程模型來促進良好的編程實踐。

**核心點

簡介:**
在這裏插入圖片描述

1,控制反轉(DI):
本質上底層實現機制用的就是java的反射,依賴注入僅僅是控制反轉的一個具體的例子。當編寫一個複雜的 Java 應用程序時,應用程序類應該儘可能的獨立於其他的 Java 類來增加這些類可重用可能性,當進行單元測試時,可以使它們獨立於其他類進行測試。依賴注入(或者有時被稱爲配線)有助於將這些類粘合在一起,並且在同一時間讓它們保持獨立。

2.面向切面編程(AOP):
在面向切面之前介紹下面向接口,如果兩個類之間要想建立起關聯信息的話,就必須在一個類中持有別的類的引用這種方式,代碼之間的耦合性比較強。面向接口的話就是:A和B之間建立聯繫,將B定義爲接口,C爲B的實現類,將A與C之間建立聯繫。
AOP核心理念就是,降低類與類之間的耦合,提升系統的源碼重用性,在不增加代碼的基礎之上完成功能的縱向添加。比如我們常用的日誌,安全監控,事務以及緩存等機制都可以使用AOP來進行解決。

Spring 核心組件:
在這裏插入圖片描述

Spring框架的好處:
(1)Spring 可以使開發人員使用 POJOs 開發企業級的應用程序。只使用 POJOs 的好處是你不需要一個 EJB 容器產品,比如一個應用程序服務器,但是你可以選擇使用一個健壯的 servlet 容器,比如 Tomcat 或者一些商業產品。
(2)支持MVC開發模式,視圖與實際的業務邏輯進行相分離,

模型(Model)封裝了應用程序數據,通常它們將由POJO類組成。
視圖(View)負責渲染模型數據,一般來說它生成客戶端瀏覽器可以解釋HTML輸出。
控制器(Controller)負責處理用戶請求並構建適當的模型,並將其傳遞給視圖進行渲染。

(3)Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低。
(4)Spring提供了一致的事務管理接口,可向下擴展到(使用一個單一的數據庫,例如)本地事務並擴展到全局事務(例如,使用 JTA)。
(5)輕量級IOC容器。

Spring框架的缺點:
配置繁瑣,而且整體項目工程比較重。總結性的來講Spring底層實現很繁瑣但也很精妙。個人理解就是在bean管理還有運用上,配置比較繁瑣。因爲使用框架的初衷就是簡化開發,相比繁重的配置更推薦使用微服務框架。

Spring機制與實現框架圖:
在這裏插入圖片描述

Spring註解驅動式開發常用註解:
在這裏插入圖片描述關於註解驅動式開發結合實際案例進行再一步詳細說明;

傳統SSM框架集成配置:
說起框架的配置,更加習慣將Spring看做一個容器,也就是說需要什麼功能,進行配置使用就OK。那麼搭框架真的很難嗎?下面跟隨小編一起看一下:
在這裏插入圖片描述(1)利用Maven創建動態web項目(以eclipse爲例);IDEA可以直接創建Spring的項目(boot 直接配置pom文件加載依賴);
(2)項目目錄結構
├──pom.xml
├──main
| ├──java
| | └──com
| | └──web
| | ├── core
| | | ├── controller //控制器包
| | | ├── entity //POJO包
| | | ├── mapper //Mapper接口包
| | | ├── service //Service接口包
| | | └── serviceImpl //service實現類包
| | └──util //工具包
| ├── resources //資源文件夾(配置文件)
| | ├──applicationContext.xml //Spring配置文件
| | ├──dbconfig.properties //數據庫配置文件
| | ├──log4j.properties //log4j配置文件
| | ├──mybatis-config.xml //mybatis配置文件
| | ├──spring-mvc.xml //springMvc配置文件
| | ├──spring-mybatis.xml //spring-mybatis整合配置
| | └── mapping //mapper.xml文件夾
| | └── StudentMapper.xml
| └── webapp ///web應用部署根目錄
| ├──login.html //登錄頁
| ├──pages //jsp文件將愛
| | └── studentList.jsp
| ├──static //靜態資源文件夾
| | ├──css
| | | └── login.css
| | ├──images
| | | ├──login-img.png
| | | └── login_logo.png
| | └── js
| | └── JQuery.js
| └── WEB-INF
| └── web.xml
└──test
├── java
├── resources
(3)引入相關jar包依賴;
(4)配置整合:在applicationContext.xml進行配置組件bean之間的關係,根據項目的需要配置也可以進行拆分,爲方便管理一般會進行分幾個xml文件進行分開配置。進行統一管理。

<context:property-placeholder location="classpath:db.properties"/>
<!-- 1、數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   ....
</bean>

<!-- 2、配置mybatis交給spring來管理   -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    		<!-- 加載mybatis的全局配置文件 -->
	<property name="configLocation" value="resouces/:spring-mybatis.xml" />
</bean>
<!--2.1 告訴Spring  mybatis的mapper文件在哪,如果是註解可以不用-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    <property name="basePackage" value="com.qd.userprofile.dao" />
    
</bean>

<!-- 3、事務 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--開啓事務註解-->
<tx:annotation-driven transaction-manager="transactionManager"/>

配置Mybatis:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false" />
        <setting name="useColumnLabel" value="true"/>
        <setting name="useGeneratedKeys" value="true"/>
        <setting name="defaultStatementTimeout" value="25"/>
        <setting name="defaultFetchSize" value="100"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="localCacheScope" value="SESSION"/>
        <setting name="jdbcTypeForNull" value="NULL"/>
        <setting name="logImpl" value="LOG4J2" />
    </settings>

</configuration>

配置SpringMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 掃描controller -->
	<context:component-scan base-package="com.controller" />
	
	<!-- Spring 來掃描指定包下的類,並註冊被@Component,@Controller,@Service,@Repository等註解標記的組件 -->
	<mvc:annotation-driven />
	
	<!-- 配置SpringMVC的視圖解析器-->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>

配置dbconfig.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root

思考問題?爲什麼用這種配置底層是怎麼做的?是hash?線程是否安全?隨便一想有答案的大佬可以解答下 不勝感激。

配置Log4J

(log4j.properties)

log4j.rootLogger=error,CONSOLE,A
log4j.addivity.org.apache=false

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=error
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%t] %-5p  %x - %m%n
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=gbk
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout


log4j.appender.A=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.A.File=${catalina.home}/logs/FH_log/PurePro_
log4j.appender.A.DatePattern=yyyy-MM-dd'.log'
log4j.appender.A.layout=org.apache.log4j.PatternLayout  
log4j.appender.A.layout.ConversionPattern=[FH_sys]  %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L \: %m%n

Log4j.xml配置

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- Appenders --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy HH:mm:ss} %-5p %c - %m%n" /> </layout> </appender> <!-- Application Loggers --> <logger name="com"> <level value="error" /> </logger> <!-- 3rdparty Loggers --> <logger name="org.springframework.core"> <level value="error" /> </logger>	<logger name="org.springframework.beans"> <level value="error" /> </logger> <logger name="org.springframework.context"> <level value="error" /> </logger> <logger name="org.springframework.web"> <level value="error" /> </logger> <logger name="org.springframework.jdbc"> <level value="error" /> </logger> <logger name="org.mybatis.spring"> <level value="error" /> </logger> <logger name="java.sql"> <level value="error" /> </logger> <!-- Root Logger --> <root> <priority value="error" /> <appender-ref ref="console" /> </root> </log4j:configuration>

根據項目需要還會配置Ehcache:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false">
 <!-- 磁盤保存路徑 -->
 <diskStore path="D:\44\ehcache" />
 
 <defaultCache 
   maxElementsInMemory="1" 
   maxElementsOnDisk="10000000"
   eternal="false" 
   overflowToDisk="true" 
   timeToIdleSeconds="120"
   timeToLiveSeconds="120" 
   diskExpiryThreadIntervalSeconds="120"
   memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>
 
<!-- 
屬性說明:
l diskStore:指定數據在磁盤中的存儲位置。
l defaultCache:當藉助CacheManager.add("demoCache")創建Cache時,EhCache便會採用<defalutCache/>指定的的管理策略
 
以下屬性是必須的:
l maxElementsInMemory - 在內存中緩存的element的最大數目 
l maxElementsOnDisk - 在磁盤上緩存的element的最大數目,若是0表示無窮大
l eternal - 設定緩存的elements是否永遠不過期。如果爲true,則緩存的數據始終有效,如果爲false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
l overflowToDisk - 設定當內存緩存溢出的時候是否將過期的element緩存到磁盤上
 
以下屬性是可選的:
l timeToIdleSeconds - 當緩存在EhCache中的數據前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些數據便會刪除,默認值是0,也就是可閒置時間無窮大
l timeToLiveSeconds - 緩存element的有效生命期,默認是0.,也就是element存活時間無窮大
 diskSpoolBufferSizeMB 這個參數設置DiskStore(磁盤緩存)的緩存區大小.默認是30MB.每個Cache都應該有自己的一個緩衝區.
l diskPersistent - 在VM重啓的時候是否啓用磁盤保存EhCache中的數據,默認是false。
l diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運行間隔,默認是120秒。每個120s,相應的線程會進行一次EhCache中數據的清理工作
l memoryStoreEvictionPolicy - 當內存緩存達到最大,有新的element加入的時候, 移除緩存中element的策略。默認是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
 -->
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章