业务描述:实现登录系统执行操作之前和之后输出声明式日志信息的功能
采用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思想,从而实现了具体业务逻辑代码与日志打印逻辑代码的解耦