OOP編程 VS AOP編程

業務描述:實現登錄系統執行操作之前和之後輸出聲明式日誌信息的功能

採用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思想,從而實現了具體業務邏輯代碼與日誌打印邏輯代碼的解耦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章