業務描述:實現登錄系統執行操作之前和之後輸出聲明式日誌信息的功能
採用OOP編程方式實現業務邏輯
僞代碼
public class OutPutLogging {
public void doLogin() {
beginLogin();
//模擬用戶登錄操作
logging("======用戶登錄======");
afterLogin();
}
private void logging(String string) {
Logger logger = Logger.getLogger(OutPutLogging.class.getName());
logger.info(string);
}
private void beginLogin() {
logging("======beginLogin======");
}
private void afterLogin() {
logging("======afterLogin======");
}
}
打印控制檯輸出
一月 09, 2019 4:40:40 下午 log.OutPutLogging logging
信息: beginLogin
一月 09, 2019 4:40:41 下午 log.OutPutLogging logging
信息: 用戶登錄
一月 09, 2019 4:40:41 下午 log.OutPutLogging logging
信息: afterLogin
分析不足之處
OutPutLogging 類中的doLogin()方法,不僅需要完成輸出日誌信息的功能,同時還要完成具體的業務邏輯代碼,在一個大型的項目中,很多地方都需要輸出日誌,因此導致很多地方出現相同的輸出日誌信息代碼。這樣做降低的代碼的耦合度,同時增加了代碼的維護成本。
採用aop思想實現業務邏輯(java反射技術)
創建一個接口Login
public interface Login {
void doLogin();
}
創建一個接口的實現類LoginImpl
public class LogImpl implements Login {
@Override
public void doLogin() {
Logger logger = Logger.getLogger(LogProxy.class.getName());
//模擬用戶登錄操作
logger.info("======用戶登錄======");
}
}
創建並編寫代理類LogProxy
public class LogProxy implements InvocationHandler {
private Object proxyObj;
public LogProxy(Object obj) {
this.proxyObj=obj;
}
//創建代理對象,綁定代理對象
public static Object bind(Object obj) {
Class<? extends Object> cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new LogProxy(obj));
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beginLogin();
Object invoke = method.invoke(proxyObj, args);
afterLogin();
return invoke;
}
private void logging(String string) {
Logger logger = Logger.getLogger(LogProxy.class.getName());
logger.info(string);
}
private void beginLogin() {
logging("======beginLogin======");
}
private void afterLogin() {
logging("======afterLogin======");
}
}
創建測試類TestLog
public class TestLog {
public static void main(String[] args) {
Login login=(Login)LogProxy.bind(new LogImpl());
login.doLogin();
}
}
打印控制檯輸出
一月 09, 2019 4:43:44 下午 log.LogProxy logging
信息: beginLogin
一月 09, 2019 4:43:44 下午 log.LogImpl doLogin
信息: 用戶登錄
一月 09, 2019 4:43:44 下午 log.LogProxy logging
信息: afterLogin
綜上
通過java反射代理技術實現AOP思想,從而實現了具體業務邏輯代碼與日誌打印邏輯代碼的解耦