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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值