Java框架之Spring

Spring框架知識梳理.png

上圖是整理的Spring框架中常用的知識點.

Spring是什么嗎?

Spring是一種框架型的框架.可以整合其他框架一起使用.
Spring是J2EE應用程序框架从铲,是輕量級IOC和AOP的肉國企框架,主要是針對javaBean的生命周期進行管理的輕量級容器拼缝,可以單獨使用形入,也可以和Stryts框架,ibatis框架等組合使用熔任。
(1)IOC(Inversion of Control)控制反轉(zhuǎn)泽本,對象創(chuàng)建責任的反轉(zhuǎn)染突,在spring中BeanFactory是IOC容器的核心接口捻爷,負責實例化,定位份企,配置應用程序中的對象及建立這些對象間的依賴也榄。XMLBeanFacotory實現(xiàn)BeanFactory接口,通過獲取xml配置文件數(shù)據(jù)司志,組成應用對象及對象間的依賴關系手蝎。
spring中有三種注入方法,一種是set注入俐芯,一種是接口注入棵介,另一種是構造方法注入
(2)AOP面向切面編程
aop就是縱向的編程。比如吧史,業(yè)務1和業(yè)務2都需要一個共同的操作邮辽,與其往每個業(yè)務中都添加同樣的代碼,不如寫一遍代碼贸营,讓兩個業(yè)務共同使用這段代碼吨述。
spring中面向切面編程的實現(xiàn)有兩種方式,一種是動態(tài)代理钞脂,一種是CGLIB揣云,動態(tài)代理必須要提供接口,而CGLIB實現(xiàn)是有繼承冰啃。

為什么用它?

1.開發(fā)方便,代碼量少.
2.代替了new對象,節(jié)省內(nèi)存空間.
3.它可以整合其他框架.

Spring最核心的思想:

Spring最核心的功能:管理對象()
管理對象的生命周期邓夕,和對象之間的關系。
1.IOC控制反轉(zhuǎn):通過依賴注入來實現(xiàn)的把原來的自己new對象阎毅, 現(xiàn)在交給Spring容器焚刚。
DI依賴注入:注解 反射
2.AOP面向切面編程
3.與JDBC,DataSource hibernate s2sh整合
概念:JavBean(實體類)必須遵循一個規(guī)則(沒有用Spring框架寫實體類的方法):
1.必須有包
2.必須有無參構造器
3.實現(xiàn)序列化接口
4.有get()和set()方法
5.toString()
如果用Spring容器來做扇调,以上步驟只保留第一步就行了矿咕,其他都可以省略。
Spring搭建流程:
1.導包 (必須的2個)
2.在src目錄下創(chuàng)建applicationContext.xml(框架的核心配置文件)
3.約束文件
4.將實體類添加到Spring容器里

Spring框架的優(yōu)缺點:

優(yōu)點:

*    輕量級的容器框架,沒有侵入性碳柱。
*    IOC更加容易組合對象之間的關系捡絮,通過面向接口進行編程,可以低耦合開發(fā)莲镣。
*    易于本地測試(Junit單元測試福稳,不用部署服務器)
*    AOP可以更加容易的進行功能擴展,遵循ocp開發(fā)原則
*    Spring默認對象的創(chuàng)建為單例的剥悟,我們不需要在使用單例的設計模式開開發(fā)單體類灵寺。
*    Spring的集成很強大曼库,另外可以對其他框架的配置進行一元化管理区岗。
*    Spring的聲明式事物的方便使用。

缺點:

*    開發(fā)對設計要求較高毁枯,集成測試麻煩慈缔,對框架有一定的依賴性。

Spring創(chuàng)建對象的時間:

默認執(zhí)行步驟:(lazy-init=false)

1.默認無參構造器
2.初始化一個Spring容器
3.提取bean
4.調(diào)用方法并打印

提取幾次bean?

2.提取 2次打印
懶加載?((lazy-init=true )
1.初始化Spring容器
2.提取bean
3.默認構造器
4.調(diào)方法并打印

總結:同時提取2個bean 一個bean提取2次种玛,一個bean提取一次
如果配置文件中藐鹤,一個bean加入lazy-init=true,那么它會把執(zhí)行權交給下一個提取的對象赂韵。

兩個bean的執(zhí)行步驟:

1.初始化Spring容器
2.Hello中的默認無參構造器
3.Hello2中的默認無參構造器
4.提取hello的bean
5.提取hello2的bean
6.調(diào)用Hello的say();
7.調(diào)用hello2的say()

兩個bean中提取多次,執(zhí)行順序:(默認單例模式)

1.初始化Spring容器
2.單例模式:Hello2,構造器執(zhí)行
3.元型模式:hello構造器執(zhí)行
4.提取一次bean 打印一次(前提是在元型模式下執(zhí)行)
5.調(diào)用方法 按照順序依次執(zhí)行.

兩個bean Hello提取多次 單例模式,不是懶加載

     Hello2 提取一次 元型模式  是懶加載
  執(zhí)行順序:
  1.初始化Spring容器
  2.單例模式的構造器執(zhí)行
  3.提取單例的bean
  4.元型模式hello2,構造器執(zhí)行
  5.依次執(zhí)行

總結:作用域

如果指定scope=“singleton”單例模式 構造器只執(zhí)行一次
如果指定scope=“prototype”提取幾次bean娱节,構造器就執(zhí)行幾次

  1. scope="singleton" 單例模式,lazy_init=false 什么時候 創(chuàng)建對象祭示?
    單例對象肄满,在實例化 spring 容器時
  2. scope="prototype" lazy-init="false"多例模式什么時 候創(chuàng)建對象?
    多例质涛,在提取 bean 時候
  3. scope="singleton" 單例模式稠歉,lazy_init=false 什么時候 創(chuàng)建對象?
    在第一次提取 bean 時候創(chuàng)建對象汇陆,只創(chuàng)建一次怒炸,再次提取不會重復創(chuàng)建
  4. scope="singleton" 單例模式,lazy_init=true 什么時候 創(chuàng)建對象毡代?
    每次提取 bean 時候阅羹,創(chuàng)建對象

執(zhí)行順序和配置文件中的bean有關系:bean靠上位置,優(yōu)先執(zhí)行構造器
Spring中的bean對象是否是單例模式?
是,不管提取幾次同一個bean,都只會執(zhí)行一個構造器

注冊時寫兩個屬性

init-method="init" destroy-method="destory"

DI依賴注入:給參數(shù)賦值的過程就叫注入

(1)setter注入

 //實體類student的屬性,一定要有set()和get方法
     private Integer id;
     private String name;
     private Classes cls;
    
     private List list;
     private Set set;
     private Map map;

//實體類classes中什么也沒寫

 <beans xmlns="[http://www.springframework.org/schema/beans"]
xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance"]
xsi:schemaLocation="[http://www.springframework.org/schema/beans]
[http://www.springframework.org/schema/beans/spring-beans.xsd"]>

<!-- bean definitions here xmlns:xmlnamespace xml文件命名空間 -->
    <!--注冊hello對象注冊到Spring容器(appcationContext) 注冊進來后變成每個唯一bean標簽 id 是指該bean的唯一實例
       class是全類型 --><!--scope作用范圍:prototype元型模式 singleton單例模式 bean默認是單例模式 -->
<bean id="cls" class="cn.lanou3g.entity.Classes"/>
    <bean id="stu" class="cn.lanou3g.entity.Student">
       <!-- 普通類型的注入 所有的子標簽都是父標簽的屬性 -->
       <property name="id" value="1037227" />
       <property name="name" value="nana"></property>
       <!-- 當出現(xiàn)類類型的時候要有ref -->
       <property name="cls" ref="cls" />
       <!-- 常用集合類的注入 -->
       <property name="list">
           <!--list集合 -->
           <list >
               <value>大學英語</value>
               <value>數(shù)據(jù)結構</value>
               <value>高數(shù)</value>
           </list>
       </property>
<!-- set集合 -->
       <property name="set">
           <set>
               <value>大學英語1</value>
               <value>數(shù)據(jù)結構1</value>
               <value>高數(shù)1</value>
           </set>
       </property>
       <property name="map">
           <map>
               <entry value="1001" key="01"/>
                  <!-- <key>
                      <value>大學英語1</value>
                  </key>
               </entry> -->
               <entry value="1002" key="02"/>
                  <!--< key>
                      <value>大學英語2</value>
                  </key>
               </entry> -->
           </map>
       </property>
    </bean>
</beans>


//測試 
@Test
           public void testConn(){
              //初始化Spring容器
             ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
             //提起bean,根據(jù)容器中的id來獲取的
               Student stu=(Student)ctx.getBean("stu");
             //調(diào)方法
           stu.method();
            
           }

(2)構造函數(shù)的注入方法

實體類和上面setter注入的一樣,只多加一會有參的構造函數(shù)
在主配置文件中不同,這是通過下標賦值的

<bean id="cls" class="cn.lanou3g.entity.Classes"/>
     <bean id="stu" class="cn.lanou3g.entity.Student">
       <constructor-arg index="0" value="1001"/>
        <constructor-arg index="1" value="lida"/>
       <constructor-arg index="2" ref="cls"/>
      </bean>

還有一種方法是通過數(shù)據(jù)類型賦值的 實體類還和上面一樣
主配置不用

<bean id="cls" class="cn.lanou3g.entity.Classes"/>
        <bean id="stu" class="cn.lanou3g.entity.Student">      
       <constructor-arg type="java.lang.Integer" value="1001"/>
       <constructor-arg type="java.lang.String" value="lida"/>
       <constructor-arg type="cn.lanou3g.entity.Classes"/>
       </bean>

Spring創(chuàng)建對象的方式

1.無參構造器(默認)
2.工廠模式
靜態(tài)工廠的創(chuàng)建方式:
創(chuàng)建一個工廠
自定義一個靜態(tài)方法(被static修飾)
測試的時候直接.

//靜態(tài)工廠
public class StaticFactory {
    public static Hello getHello(){
      return new Hello();
     }
}

//測試 
@Test
           public void testConn(){
             Hello hello=StaticFactory.getHello();
             hello.say();
           }

實例工廠創(chuàng)建方式:
創(chuàng)建一個工廠
自定義方法
測試時需要從new

//實例工廠
public class InstanceFactory {
     public Hello getHello(){
        return new Hello();
     }
    
}

//測試
           @Test
           public void testCon(){
              InstanceFactory ins = new InstanceFactory();
              Hello hello=ins.getHello();
             hello.say();
           }

AOP通知

  • 前置通知
  • 后置通知
  • 異常通知
  • 最終通知
  • 環(huán)繞通知:可以做權限 可以代替前后通知
/開啟第一個切面  5中通知
public class SessionAspect {
     //前置通知
    public void before(JoinPoint join){
        System.out.println("前置通知");
    
    }
    
     //后置通知
        public void after_returning(JoinPoint join){
           System.out.println("后置通知");
        
        }
        //最終通知
                public void after(JoinPoint join){
                    System.out.println("最終通知");
                
                }
        //異常通知
                public void after_throwing(JoinPoint join,Throwable ex){
                    System.out.println("異常通知");
                
                }
        //環(huán)繞通知
                public void around(ProceedingJoinPoint point){
                    System.out.println("環(huán)繞通知1");
                    try {
                        //用連接點調(diào)進程
                        point.proceed();
                    } catch (Throwable e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("環(huán)繞通知2");
                
                }
    
}

 <?xml version="1.0" encoding="UTF-8"?>

-<beans xsi:schemaLocation="
[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)[http://www.springframework.org/schema/beans/spring-beans.xsd](http://www.springframework.org/schema/beans/spring-beans.xsd)[http://www.springframework.org/schema/aop](http://www.springframework.org/schema/aop)[http://www.springframework.org/schema/aop/spring-aop.xsd"](http://www.springframework.org/schema/aop/spring-aop.xsd%22);
 xmlns:aop="[http://www.springframework.org/schema/aop"];
xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance"];
xmlns="[http://www.springframework.org/schema/beans">];
<!-- bean definitions here -->
<bean class="cn.lanou3g.aspect.SessionAspect" id="sessionAspect"/>
<bean class="cn.lanou3g.aspect.TransactionAspect" id="transactionAspect"/>
<bean class="cn.lanou3g.entity.TargetObject" id="target"/>
-<aop:config>
<aop:pointcut id="p" expression="execution(* cn.lanou3g.entity.*.*(..))"/>
-<aop:aspect ref="sessionAspect">
<!-- 前置 -->
<!-- <aop:before method="before" pointcut-ref="p"/> -->
<!-- 后置-->
<!-- <aop:after-returning method="after_returning" pointcut-ref="p"/> -->
<!-- 最終 -->
<!-- <aop:after method="after" pointcut-ref="p"/> -->
<!-- 異常 -->
<!-- <aop:after-throwing method="after_throwing" throwing="ex" pointcut-ref="     p"/> -->
<!-- 環(huán)繞 -->
<aop:around pointcut-ref="p" method="around"/>
</aop:aspect>
</aop:config>
</beans>

測試結果
前置通知
環(huán)繞通知1
session.save
后置通知
最終通知
環(huán)繞通知2

總結:

1.前置通知和最終通知與目標方法是否執(zhí)行沒有直接關系教寂;
2.后置通知必須在目標方法執(zhí)行之后執(zhí)行灯蝴,如果目標方法沒有正常結束,后置通知不執(zhí) 行孝宗;
3.異常通知:目標方法出異常的時候執(zhí)行,捕捉異常
4.環(huán)繞通知: 可以控制目標方法的執(zhí)行(執(zhí)行順序是在目標方法之前和之后穷躁;

整合Spring-jdbc

1.導包(25個)
2.連接數(shù)據(jù)庫(jdbc.properties)
3.實體類
4.Spring配置文件(application.xml)
5.三層 dao service controller
6.注入到Spring容器中
7.測試

.Spring中有那些主要模塊:Dao ORM JEE Wed Aop IOC

Spring中用到的設計模式: 代理 單例模式 原型模式 工廠模式

Spring中事務該如何配置:

(1)配置工廠,產(chǎn)生session
(2)開啟session和事務,這里可以自動開啟
(3)進行動態(tài)代理
(4)配置切面及通知
(5)設置切入點,執(zhí)行通知
(6)自動提交事務

Spring框架注解按分層分幾種:

@Component 在類上面寫
@Controller 控制層,就是我們的action層.
@Service 業(yè)務邏輯層 就是我們的Service或者manager層
@Repository 注入的時候?qū)?/p>

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子问潭,更是在濱河造成了極大的恐慌猿诸,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡忙,死亡現(xiàn)場離奇詭異梳虽,居然都是意外死亡,警方通過查閱死者的電腦和手機灾茁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門窜觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人北专,你說我怎么就攤上這事禀挫。” “怎么了拓颓?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵语婴,是天一觀的道長。 經(jīng)常有香客問我驶睦,道長砰左,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任场航,我火速辦了婚禮缠导,結果婚禮上,老公的妹妹穿的比我還像新娘溉痢。我一直安慰自己僻造,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布适室。 她就那樣靜靜地躺著嫡意,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捣辆。 梳的紋絲不亂的頭發(fā)上蔬螟,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音汽畴,去河邊找鬼旧巾。 笑死,一個胖子當著我的面吹牛忍些,可吹牛的內(nèi)容都是我干的鲁猩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼罢坝,長吁一口氣:“原來是場噩夢啊……” “哼廓握!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤隙券,失蹤者是張志新(化名)和其女友劉穎男应,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娱仔,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡沐飘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牲迫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耐朴。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盹憎,靈堂內(nèi)的尸體忽然破棺而出筛峭,到底是詐尸還是另有隱情,我是刑警寧澤脚乡,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布蜒滩,位于F島的核電站滨达,受9級特大地震影響奶稠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捡遍,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一锌订、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧画株,春花似錦辆飘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至续挟,卻和暖如春紧卒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诗祸。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工跑芳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人直颅。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓博个,卻偏偏與公主長得像,于是被迫代替她去往敵國和親功偿。 傳聞我的和親對象是個殘疾皇子盆佣,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容