Sping框架的兩大核心技術知識
Spring框架的兩大核心技術分別為:
一.IOC(Inversion of Control, 控制反轉)把建立物件的操作交給框架,亦被稱為 DI(Dependency Injection, 依賴注入)
二.AOP(面向切面程式設計)
IOC
控制反轉
最基礎的呼叫的物件是通過new一個物件出來,例如:People p=new People
我們Spring框架中的IOC即改變這種方式的呼叫,將後面“new People”轉換為xml檔案去呼叫,即使用第三者呼叫
舉個生活中的小例子說明這樣的好處:
People p=new People 相當於兩個人之前的直接呼叫,假如張三和李四,張三需要用到只有李四電腦裡面的一份檔案,張三就必須直接向李四要,假如李四的電腦壞了,那麼張三也就拿不到這份檔案,然而IOC就相當於張三叫王五去拿這份檔案,李四將檔案拷貝給了王五,在這過程中即使李四的電腦壞了,那麼張三也能從王五那拿到檔案,張三不會受到影響。這就是控制反轉的最大好處。即用來降低程式程式碼之間的耦合度
依賴注入
實現依賴注入的三種方式:setter方式注入,構造注入,使用P命名實現注入
setter方式注入
建立學生類,給予學生類一個學號,一個姓名的屬性(此兩個屬性必須生成set方法,才能完成setter方式的注入)
public class Student {
//學號
private int num;
//姓名
private String name;
public void setNum(int num) {
this.num = num;
}
public void setName(String name) {
this.name = name;
}
}
在applicationContext.xml檔案中賦值
<!-- setter方法注入 --> <bean id="stu" class="Student" > <property name="num" value="1"></property> <property name="name" value="李四"></property> </bean>
構造注入
給學生類寫個帶參的建構函式(寫完帶參的建構函式後,必須再定義一個無參的建構函式)
//構造器注入
public class Student {
public Student(){
}
public Student(int num,String name){
}
//學號
private int num;
//姓名
private String name;
}
在applicationContext.xml檔案中賦值
<!-- 構造器注入 -->
<bean id="st" class="Student">
<constructor-arg>
<value type="java.lang.int">101</value>
</constructor-arg>
<constructor-arg>
<value type="java.lang.String">張三</value>
</constructor-arg>
</bean>
使用P名稱空間注入
在Student最基礎類的基礎上,給ApplicationContext.xml檔案中匯入一個頭的包
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
</beans>
之後在xml用bean標籤賦值
<!-- 使用P命名注入 -->
<bean id="stu" class="test.Student" p:name="張三" p:num="1001">
</bean>
AOP
面向切面程式設計,簡單地說就是在不改變原程式的基礎上為程式碼段增加新功能,對程式碼段進行增強處理
前置增強、後置增強、最終增強、異常增強、環繞增強(定義一個用於增強的FirstAop類)
public class FirstAop {
/*
*
* 1.前置 2.後置 3.環繞 4.異常 5.最終
*/
//前置增強
public void pre_study(JoinPoint jp){
System.out.println("我是前置增強!");
}
//後置增強
public void do_work(JoinPoint jp,Object result){
//這個result是目標方法的返回值,
System.out.println("我是後置增強!");
}
//最終增強
public void do_final(JoinPoint jp){
System.out.println("我是最終增強");
}
//異常增強
public void do_exception(JoinPoint jp,Exception e){
System.out.println("我是異常增強");
}
//環繞增強
public Object around(ProceedingJoinPoint pjp){
System.out.println("我是環繞增強的前值增強");
try {
Object result=pjp.proceed();//執行目標方法並且獲取目標方法的返回值
result="改造之後的返回值";
System.out.println("我是環繞增強的後置");
return result; //這個result會完美的替換目標方法的返回值
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Student類中定義一個study方法用作於切口
public lass Student{
//學號
private int num;
//姓名
private String name;
//學習的方法,當做於切口
public void study(){
System.out.println("學生"+name+"學號"+num+"在學習");
}
}
ApplicationContext.xml檔案中配置的程式碼如下
<!-- 配置切面 -->
<aop:config>
<!-- 宣告目標點 -->
<aop:pointcut expression="execution(public void study())" id="target"/>
<!-- 連線切點跟被切點 -->
<aop:aspect ref="first">
<!-- 前置增強 -->
<aop:before method="pre_study" pointcut-ref="target"/>
<!-- 後置增強 -->
<aop:after-returning method="do_work" returning="result" pointcut-ref="target"/>
<!-- 最終增強 -->
<aop:after method="do_final" pointcut-ref="target"/>
<!-- 異常增強 -->
<aop:after-throwing method="do_exception" throwing="e" pointcut-ref="target"/>
<!-- 環繞增強 -->
<aop:around method="around" pointcut-ref="target"/>
</aop:aspect>
</aop:config>
測試類中的關鍵程式碼(包括IOC以及AOP的測試)
public class Test {
public static void main(String[] args) {
//第一步:讀取Spring的核心檔案
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:根據ac物件獲得裡面所有的bean
Student st=(Student) ac.getBean("stu");
//呼叫study的方法
st.study();
}
}
來自小小程式設計師的歸納與具體的實現步驟。學藝不精,還請其他各位大佬多多指教!!!