1. 程式人生 > >Sping框架的兩大核心技術知識

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();
			 
		}
}

來自小小程式設計師的歸納與具體的實現步驟。學藝不精,還請其他各位大佬多多指教!!!