JAVA框架學習——基礎準備(log4j,靜態代理與動態代理,列舉,註解)
阿新 • • 發佈:2018-11-27
一、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動態代理:第三方架包——這個可以沒有介面。
三、列舉
- 註解
- 一種資料型別。
- 定義註解:和定義類,介面,列舉的概念一樣。一般不會自己定義。
- @interface 註解名字
- 一般是使用框架中的定義註解,我們使用註解
- 使用註解
- 程式設計師根據需要新增對應的註解
- 讀取註解
- 註解是給程式碼看的,一般是由框架反射讀取註解
- 可以使用註解的位置:
- 類
- 方法
- 構造器
- 引數
- 區域性變數
- 欄位
- 包
- 註解中可以新增屬性,也可以新增預設值
- 可以使用的資料型別
- 基本資料型別
- String
- 列舉
- Class(反射型別
- 註解
- 以上所有的一維陣列
- 可以使用的資料型別