上圖是整理的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í)行幾次
- scope="singleton" 單例模式,lazy_init=false 什么時候 創(chuàng)建對象祭示?
單例對象肄满,在實例化 spring 容器時 - scope="prototype" lazy-init="false"多例模式什么時 候創(chuàng)建對象?
多例质涛,在提取 bean 時候 - scope="singleton" 單例模式稠歉,lazy_init=false 什么時候 創(chuàng)建對象?
在第一次提取 bean 時候創(chuàng)建對象汇陆,只創(chuàng)建一次怒炸,再次提取不會重復創(chuàng)建 - 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>