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思想,从而实现了具体业务逻辑代码与日志打印逻辑代码的解耦

发布了55 篇原创文章 · 获赞 8 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览