1. 程式人生 > >JAVA框架學習——基礎準備(log4j,靜態代理與動態代理,列舉,註解)

JAVA框架學習——基礎準備(log4j,靜態代理與動態代理,列舉,註解)

一、log4j。
    1.log4j基礎科普:記錄日誌。
        有兩種日誌模式:
            a.Apatcha提供:Log4j(MyBatis使用這種)和Log4j2(Hibernate使用這個)
            b.JDK自帶,由於自帶不好用所以用上一個
    2.日誌的優點:
        a.可以控制輸出的地方。——配置檔案設定——log4j.properties
            log4j.rootLogger=INFO(許可權),console(控制檯),file(檔案記錄)
            控制檯輸入
            log4j.appender.console=org.apache.log4j.ConsoleAppender
            log4j.appender.console.layout=org.apache.log4j.PatternLayout
            log4j.appender.console.layout.ConversionPattern=[%p] %m [%t] %c [%l]%n
            檔案輸入
            log4j.appender.file.File=d:/file.log
            log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
            log4j.appender.file.layout=org.apache.log4j.PatternLayout
            log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m                 
            [%t] %c [%l]%n
        b.可以控制輸出的等級。
            輸出等級優先順序如下:
                All,Trace,Debug,Info,Warm,Error,Fatal
    3.用處。
        記錄所需要的日誌。
        

二、靜態代理與動態代理

這一塊是代理模式在JAVA中的應用,通過對真實物件的封裝,來實現功能的擴充套件。

這個模式有“代理三要素”:

     1.共同的介面

      2.代理的物件

      3.真實的物件

          1.靜態代理。

               共同的介面:

public interface SomeService {

	void doSome();
}

          真實的物件:

           

//目標類
public class SomeServiceImpl implements SomeService {

	//目標方法
	@Override
	public void doSome() {
		System.out.println("doSome");
	}

      代理物件:

        

//代理類
public class SomeServiceProxy implements SomeService {

	//目標物件
	SomeService someService;
	
	public SomeServiceProxy(SomeService someService) {
		this.someService=someService;
	}

	@Override
	public void doSome() {
		System.out.println("前置增強");
		someService.doSome();
		System.out.println("後置增強");
	}
}

結果如下:

前置增強
dosome

後置增強

靜態代理的優點是:不用修改原始碼就可以進行功能的擴充套件

缺點:如果需要擴充套件的太多,程式碼就太過冗餘

2.動態代理:面向執行,由反射進行讀取

public void test01() {
		//建立目標物件
		SomeService someServiceImpl=new SomeServiceImpl();
		//動態代理--返回值就是代理物件
		SomeService someserviceProxy = (SomeService) Proxy.newProxyInstance(
							   someServiceImpl.getClass().getClassLoader(),//類載入器,通過目標物件獲取
							   someServiceImpl.getClass().getInterfaces(), //介面的Class型別,通過目標物件獲取
							   //如何增強目標物件InvocationHandler是一個介面,使用匿名內部類
							   new InvocationHandler() {
								@Override
								//proxy:代理物件
								//method:目標方法
								//args:目標方法引數列表
								public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
									System.out.println("前置增強");
									//通過反射呼叫目標物件的方法
									Object obj = method.invoke(someServiceImpl, args);
									return obj;
								}
							});
		//$Proxy4--就是底層使用反射定義的代理類
		System.out.println(someserviceProxy.getClass());
		someserviceProxy.doSome();
	}

     這個有兩種操作方法:

       a.JDK自帶方法:這個必須要有介面

              這個要用到一個介面。裡面引數有寫。

      b.第三方工具類進行

           cglib動態代理:第三方架包——這個可以沒有介面。

三、列舉

  • 註解
    1. 一種資料型別。
    2. 定義註解:和定義類,介面,列舉的概念一樣。一般不會自己定義。
      1. @interface 註解名字
      2. 一般是使用框架中的定義註解,我們使用註解
    3. 使用註解
      1. 程式設計師根據需要新增對應的註解
    4. 讀取註解
      1. 註解是給程式碼看的,一般是由框架反射讀取註解
    5. 可以使用註解的位置:
      1. 方法
      2. 構造器
      3. 引數
      4. 區域性變數
      5. 欄位
    6. 註解中可以新增屬性,也可以新增預設值
      1. 可以使用的資料型別
        1. 基本資料型別
        2. String
        3. 列舉
        4. Class(反射型別
        5. 註解
        6. 以上所有的一維陣列