Возможное решение - использование инжектора зависимостей + аннотации.
Здесь приведен пример того, как реализовать то, что вы хотите, используя Сварка в приложении JavaSE.
Вам нужно добавить эту зависимость:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>3.1.0.Final</version>
</dependency>
Затем создайте аннотацию, которая будет использоваться для указания тех методов, которые вы хотите регистрировать.
package org.loggable;
import javax.interceptor.InterceptorBinding;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
Создание перехватчика
package org.loggable;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import java.util.logging.Logger;
@Loggable
@Interceptor
public class LoggableInterceptor {
@AroundInvoke
public Object logMethod(InvocationContext context) throws Exception {
Logger logger = Logger.getLogger(context.getTarget().getClass().getSimpleName());
logger.info("Starting method: " + context.getMethod().getName());
Object response = context.proceed();
logger.info("Finished method: " + context.getMethod().getName());
return response;
}
}
Как видите, @AroundInvoke
позволяет нам контролировать при входе в метод и при выходе из него.
Мы должны сообщить Weld, что существует новый Interceptor, мы делаем это, добавляя beans.xml
вПапка META-INF.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
<interceptors>
<class>org.loggable.LoggableInterceptor</class>
</interceptors>
</beans>
Наконец, нам нужно вызвать нашу сущность через Weld, так как она отвечает за создание и выполнение перехватчиков.
package org.loggable;
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.se.SeContainerInitializer;
import java.io.IOException;
import java.util.logging.Logger;
public class Main {
public static void main(String... args) throws IOException {
SeContainer seContainer = SeContainerInitializer.newInstance()
.initialize();
Main main = seContainer.select(Main.class).get();
main.loggableMethod();
seContainer.close();
}
@Loggable
public void loggableMethod() {
Logger.getLogger(Main.class.getSimpleName()).info("Inside method.");
}
}
И вы получите вывод, подобный:
[2019-04-06 11:07:20] [INFO ] Starting method: loggableMethod
[2019-04-06 11:07:20] [INFO ] Inside method.
[2019-04-06 11:07:20] [INFO ] Finished method: loggableMethod
Это структура проекта в случае необходимости.
Примечание: В случаевы находитесь в проекте JavaEE, все, что связано с созданием сварных швов, управляется вашим контейнером.