**概要:**說起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(先進先出)
-->