Pointcut для классов внутри различных пакетов или подпакетов, помеченных как устаревшие и в то время, когда они используются или создаются? - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу написать сокращение для создания экземпляров классов в различных пакетах, таких как классы внутри подпакетов внутри com.kepler.xenon (например, com.kepler.xenon.modules.ticklers.pojo.Tickler, com.kepler.xenon.modules.product.pojo.Product и т. д.).

//This is my advice
@Aspect
@Component
public class OxAspect {
@After("execution(* com.oxane.xenon..*new(..)) && @within(java.lang.Deprecated)")
public void myAdvice(final JoinPoint jp){
    System.out.println(jp.getSignature().getName()+""+jp.getTarget().getClass());
 }
}
//This is my class
package com.kepler.xenon.modules.ticklers.pojo;
@Deprecated
public Class Ticklers{
@Id
@TableGenerator(name = "TICKLERS_ID", table = "ID_GENERATOR", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE", pkColumnValue = "TICKLERS_ID", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "TICKLERS_ID")
@Column(name = "TICKLERS_ID", unique = true, nullable = false)
private int ticklersId;

@Column(name = "TASK", nullable = false, length = 256)
private String taskName;

public int getTicklersId() {
    return ticklersId;
}

public void setTicklersId(int ticklersId) {
    this.ticklersId = ticklersId;
}

public String getTaskName() {
    return taskName;
}

public void setTaskName(String taskName) {
    this.taskName = taskName;
}

}

Что я хочу, так это то, что если кто-то пытается получить доступ к классу, который устарел, тогда pointcut фильтрует этот вызов и вызывает совет.Я сделал это для методов, но я не смог сделать это для классов.

Я добавляю аспект, который работает для методов, контроллера и Дао

@Aspect
@Component
public class OxAspect {

private final OxAspectService oxAspectService;

public OxAspect(OxAspectService oxAspectService) {
    this.oxAspectService=oxAspectService;
}

@Pointcut("execution(@java.lang.Deprecated * com.oxane.xenon..*(..))"
        + " || execution(* com.oxane.xenon..*.*(..)) && @within(java.lang.Deprecated)")
public void deprecated() {
}

@Before("deprecated()")
public void log(final JoinPoint jp) {
    oxAspectService.logDeprecatedMethod(jp);
}

}

Редактировать: я провел некоторые исследованияна весну и обнаружил, что это не может быть сделано с помощью Spring AOP.Мне нужно использовать время загрузки или время компиляции, чтобы достичь того, чего я хочу.Для этого я должен использовать чистую реализацию аспекта j.Поправь меня, если я ошибаюсь.

1 Ответ

0 голосов
/ 29 ноября 2018

Если бы я был тобой, я бы отклонил @Pointcut на условие условия, как показано ниже:

@Pointcut("execution(* com.oxane.xenon..*(..))")
public void anyClassInSubpackage() {
}

@Pointcut("@annotation(java.lang.Deprecated)")
public void deprecatedClass() {
}

@Pointcut("execution(* com.oxane.xenon..*new(..))")
public void anyMethodInSubpackege() {
}

@Pointcut("@within(java.lang.Deprecated)")
public void deprecatedMethod() {
}

@Before("(anyClassInSubpackage() && deprecatedClass()) || (anyMethodInSubpackege() && deprecatedMethod())")
public void myAdvice(final JoinPoint jp){
    //TODO
}
...