[JAVA] Différence entre Spring AOP et la classe cible de la bibliothèque

Contexte

Implémentez le traitement des transactions pour la méthode. Lorsque j'ai essayé de l'implémenter à l'aide de l'annotation @Transactional, une BeanCreationException s'est produite lorsque j'ai ajouté l'annotation.

Solution

Créez une interface pour la classe qui contient la méthode cible pour le traitement des transactions et ajoutez l'annotation @Transactional à la méthode de la classe d'implémentation. Il n'y a maintenant aucune erreur et vous pouvez compiler avec succès.

HogeProcessor.java


public interface HogeProcessor extends Processor<Object, Object> {
    Optional<Object> process(HogeEntity hogeEntity);
}

HogeProcessorImpl.java


public class HogeProcessorImpl implements HogeProcessor {

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public Optional<Object> process(HogeEntity hogeEntity) {
    ...
    ...
    }
}

Cause

J'ai fait des recherches par moi-même, mais je n'ai pas compris, alors je lui ai demandé de me le dire.

Si l'interface et la classe d'implémentation sont séparées et réparées, c'est la cause. http://stackoverflow.com/questions/15688689/unsatisfieddependencyexception-in-spring-illegal-arguments-for-constructor-a

En raison des spécifications de la bibliothèque utilisée pour AOP, les détails peuvent être trouvés ici. http://d.hatena.ne.jp/minokuba/20110321/1300705068

Je n'ai pas compris même après avoir lu la page qui m'a été enseignée, alors je l'ai recherchée. Voici un résumé du contenu recherché.

Différences entre Spring AOP et les bibliothèques

L'annotation @Transactional de Java est réalisée à l'aide de Spring AOP, mais cette bibliothèque AOP semble en être la cause.

Qu'est-ce que l'AOP

Programmation orientée aspect. L'aspect est un comportement et une unité de traitement commun. Un mécanisme qui vous permet de sortir pour un traitement systématique commun qui n'est pas essentiel pour les entreprises.

Cette fois, AOP est utilisé pour insérer le processus pour démarrer la transaction au moment où la méthode spécifiée est appelée.

Il semble que l'AOP peut être activé en écrivant ce qui suit dans le fichier de configuration.

aop.xml


<!--Activer AOP-->
<aop:aspectj-autoproxy/>

Type de bibliothèque Spring AOP

Au printemps AOP -JDK Dynamic Proxy ・ CGLib Deux types peuvent être utilisés. Seul le proxy dynamique JDK a été utilisé dans le projet qui a rencontré le problème cette fois.

Proxyisation

La classe ciblée par l'aspect AOP doit être un JavaBean.

  1. Spring crée un objet proxy pour la classe cible d'aspect au moment de l'exécution.
  1. Ensuite, à l'intérieur de l'objet proxy, effectuez le traitement de la classe cible d'aspect.
  2. Lorsque la classe cible d'aspect est spécifiée comme point de jointure, la méthode de conseil de la classe d'interception est appelée dans le proxy.

http://hamasyou.com/blog/2004/11/09/spring-framework-jue-shu-ki-aop/

En d'autres termes, lorsque la bibliothèque AOP crée un bean d'une classe cible d'aspect, elle crée un ProxyObject enveloppé dans un proxy (conversion de proxy).

Différences dans les classes cibles Proxy en fonction de la bibliothèque AOP

Il semble qu'il ne soit pas possible d'auto-câbler une instance d'un bean qui a été rendu Proxy par le proxy dynamique JDK en spécifiant directement la classe d'implémentation.

http://kamatama41.hatenablog.com/entry/20140327/1395928048

Lors de l'utilisation de JDK DynamicProxy, la classe qui implémente l'interface est ciblée pour la conversion Proxy. En d'autres termes, il semble que la classe d'implémentation ne puisse pas être directement DI. Cette fois, j'ai essayé d'utiliser l'AOP de @ Transactional alors que la classe d'implémentation était directement DI, donc ce n'était pas la cible de Proxyization de JDK DynamicProxy, et la cause était que BeanCreationException s'est produite.

J'ai donc créé une nouvelle interface pour la classe existante, l'ai modifiée pour qu'elle fasse DI pour cette interface et l'ai résolue en faisant de la classe existante une classe d'implémentation de l'interface. De plus, il semble que la classe d'implémentation puisse être transformée en Proxy en utilisant CGLib qui est une autre bibliothèque AOP, donc je ne l'ai pas essayée cette fois, mais il semble y avoir un moyen de l'utiliser.

Recommended Posts

Différence entre Spring AOP et la classe cible de la bibliothèque
Différence entre classe et instance
Différence entre la méthode d'instance et la méthode de classe
Différence entre la variable d'instance et la variable de classe
Différence entre vh et%
Différence entre i ++ et ++ i
[Java] Différence entre == et égal
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre l'installation de bundle et de bundle
Relation entre le package et la classe
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
Différence entre List et ArrayList
Différence entre .bashrc et .bash_profile
Différence entre StringBuilder et StringBuffer
Différence entre render et redirect_to
[Ruby] Différence entre obtenir et publier
Différence entre l'opérateur == et la méthode égale
[Java] Différence entre Hashmap et HashTable
[Terminal] Différence entre irb et pry
JavaServlet: différence entre executeQuery et executeUpdate
[Ruby] Différence entre is_a? Et instance_of?
Différence entre l'opérateur == et la méthode eqals
[Ruby] Peut-être que vous ne comprenez pas vraiment? [Différence entre la classe et le module]
Différence approximative entre RSpec et minitest
[Rails] Différence entre find et find_by
[JAVA] Différence entre abstrait et interface
Différence entre Thymeleaf @RestController et @Controller
Différence entre Stream map et flatMap
À propos de la différence entre la classe Applet et la classe JApplet
[Java] Différence entre array et ArrayList
Différence entre le type primitif et le type de référence
Différence entre string.getByte () et Hex.decodeHex (string.toCharaArray ())
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre StringBuffer et StringBuilder
[Java] Différence entre longueur, longueur () et taille ()
Facile à comprendre la différence entre la méthode d'instance Ruby et la méthode de classe.
[rails] Différence entre redirect_to et render
[Android] Différence entre finish () et return;
Remarque: Différence entre Ruby "p" et "met"
Différence entre final et immuable en Java
[Remarque] Différence entre l'installation et la mise à jour du bundle
Spring avec Kotorin --2 RestController et Data Class
Différence entre pop () et peek () dans la pile
[Pour les débutants] Différence entre Java et Kotlin
Différence entre isEmpty et isBlank de StringUtils
[Java] Différences entre les variables d'instance et les variables de classe
Différence entre getText () et getAttribute () de Selenium
À propos de la différence entre irb et pry
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
Différence entre EMPTY_ELEMENTDATA et DEFAULTCAPACITY_EMPTY_ELEMENTDATA dans ArrayList
[Ruby] Différence entre print, put et p