code: @Override
    public Object invoke(final MethodInvocation invocation) throws Throwable {
      final Method method = invocation.getMethod();
      final Transactional annotation = method.getAnnotation(Transactional.class);
  
      Object result;
      if (null == annotation) {
        result = invocation.proceed();
      } else {
        result = AbstractDao.withTransaction(new TransFunc<Object>() {
          @Override
          public Object apply() throws IOException {
            try {
              return invocation.proceed();
            } catch (Throwable throwable) {
              throw new IOException("withTransaction invocation.proceed()", throwable);
            }
          }
        }, true, supplier.get());
      }
  
      return result;
    }
docs: Implement this method to perform extra treatments before and after the invocation. Polite implementations would certainly like
  to invoke {@link org.aopalliance.intercept.Joinpoint#proceed()}.
  
  @param invocation the method invocation joinpoint
  @return the result of the call to {@link org.aopalliance.intercept.Joinpoint#proceed()}, might be intercepted by the
  interceptor.
  @throws Throwable if the interceptors or the target-object throws an exception.