AOP à l'aide de Spring Boot
Je suis en utilisant ce Printemps AOP code dans mon Printemps de Démarrage démarreur projet en STS. Après le débogage pendant un certain temps je ne vois pas de problème avec le AspectJ syntaxe. Les dépendances Maven sont générés par STS pour un AOP starter projet. Est-il une lacune évidente dans ce code comme une annotation ? L'autre problème pourrait être avec l'AOP starter projet ou avec la façon dont j'essaie de tester le code dans un @PostConstruct
méthode.
J'ai installé AJDT mais il semble STS doit montrer AspectJ marqueurs dans l'IDE sur son propre. Droit ? Je ne vois pas de marqueurs. Quelles sont les autres AspectJ options de débogage sont inclus dans la mission STS ? -Xlint
est ce que j'ai utilisé dans Eclipse/AJDT.
StateHandler.java
public class StateHandler<EVENTTYPE extends EventType> {
private State<EVENTTYPE> state;
private Event<EVENTTYPE> event;
public StateHandler(State<EVENTTYPE> state, Event<EVENTTYPE> event) {
this.state = state;
this.event = event;
}
public void handle( Event<EVENTTYPE> event ){
state = state.handle( event );
}
public State<EVENTTYPE> getState() {
return state;
}
}
DeviceLogger .java
@Aspect
@Component
public class DeviceLogger {
private static Logger logger = Logger.getLogger("Device");
@Around("execution(* com.devicemachine.StateHandler.*(..))")
public void log() {
logger.info( "Logger" );
}
}
LoggerApplication.java
@SpringBootApplication
public class LoggerApplication {
private static Logger logger = Logger.getLogger("Device");
public static void main(String[] args) {
SpringApplication.run(LoggerApplication.class, args);
}
@PostConstruct
public void log(){
DeviceState s = DeviceState.BLOCKED;
StateHandler<DeviceEvent> sh = new StateHandler<DeviceEvent>( s,
Event.block(DeviceEvent.BLOCKED, "AuditMessage") );
sh.handle(Event.block(DeviceEvent.UNBLOCKED, "AuditMessage"));
}
}
OriginalL'auteur Mohan Radhakrishnan | 2015-06-26
Vous devez vous connecter pour publier un commentaire.
Il y a 3 choses évidentes mal et 1 ne sont pas si évidents mal.
Object
et l'utilisation d'unProceedingJoinPoint
et appelproceed()
.@PostConstruct
méthode, il pourrait être que les procurations ne sont pas encore créé, et que rien ne soit interceptéspring.aop.proxy-target-class=true
à votreapplication.properties
. Par défaut JDK Proxies Dynamiques sont utilisés qui sont de l'interface de base.Fixer Aspect
Votre aspect actuel n'utilise pas
ProceedingJoinPoint
et, comme telle, ne jamais l'appel de la méthode. À côté de qui maintenant, si vous auriez une méthode qui retourne une valeur, il serait tout d'un coup, retournull
. Comme vous n'êtes pas à l'appel deproceed
sur leProceedingJoinPoint
.Créer un bean pour corriger l'utilisation de proxy et
@PostConstruct
Ajouter la propriété à permettre à la classe de procurations
Dans votre
application.properties
danssrc\main\resources
ajouter la propriété suivante avec une valeur detrue
C'est une omission dans votre question, vous n'avez rien dit à ce sujet. Si vous souhaitez utiliser le moment de la compilation de tissage que vous n'avez pas nee dthe
@Component
. Vous avez besoin d'ajouter unaop.xml
et correctement setup compiler timeweaving dans maven (ou gradle). d'autre rien ne pourra être tissé.J'ai fait tous les changements pour l'utilisation de proxy, sans aucun effet.
Alors vous ne devez pas avoir tout fait ou ne pas être l'aide d'un récent Printemps version de Démarrage. Vous avez AspectJ n votre chemin de classe (ou de la
spring-boot-starter-aop
qui devrait permettre à que). Assurez-vous également que leLoggerApplication
est dans un super emballage ou le même package que la@Component
annoté aspect sinon il ne sera pas détecté et faire exactement rien. (Ou il vous suffit de l'ajouter en tant que@Bean
de votre configuration).J'ai dû le déplacer vers le même package.Il a travaillé. Il y a @Bean et le paquet de restrictions et j'ai dû changer de code pour appliquer les aspects.
OriginalL'auteur M. Deinum