From 5ede0e91dbfff557333937fd6c816c96ae7b9da0 Mon Sep 17 00:00:00 2001 From: Sam Wright Date: Tue, 20 Oct 2015 17:49:46 +0100 Subject: [PATCH] #664 Annotate mapper implementations with @Singleton when using jsr330. --- .../src/main/java/org/mapstruct/DecoratedWith.java | 6 +++--- core-common/src/main/java/org/mapstruct/Mapper.java | 2 +- .../src/main/java/org/mapstruct/MapperConfig.java | 2 +- .../org/mapstruct/itest/jsr330/other/DateMapper.java | 2 ++ .../internal/processor/Jsr330ComponentProcessor.java | 10 +++++++--- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core-common/src/main/java/org/mapstruct/DecoratedWith.java b/core-common/src/main/java/org/mapstruct/DecoratedWith.java index c3b3d191a..095fdccf8 100644 --- a/core-common/src/main/java/org/mapstruct/DecoratedWith.java +++ b/core-common/src/main/java/org/mapstruct/DecoratedWith.java @@ -123,9 +123,9 @@ import java.lang.annotation.Target; *

* JSR 330 doesn't specify qualifiers and only allows to specifically name the beans. Hence, the generated * implementation of the original mapper is annotated with {@code @Named("fully-qualified-name-of-generated-impl")} - * (please note that when using a decorator, the class name of the mapper implementation ends with an underscore). To - * inject that bean in your decorator, add the same annotation to the delegate field (e.g. by copy/pasting it from the - * generated class): + * and {@code @Singleton} (please note that when using a decorator, the class name of the mapper implementation ends + * with an underscore). To inject that bean in your decorator, add the same annotation to the delegate field (e.g. by + * copy/pasting it from the generated class): * *

  * public abstract class PersonMapperDecorator implements PersonMapper {
diff --git a/core-common/src/main/java/org/mapstruct/Mapper.java b/core-common/src/main/java/org/mapstruct/Mapper.java
index 4406e72d3..6428cb114 100644
--- a/core-common/src/main/java/org/mapstruct/Mapper.java
+++ b/core-common/src/main/java/org/mapstruct/Mapper.java
@@ -75,7 +75,7 @@ public @interface Mapper {
      * can be retrieved via {@code @Autowired}
      * 
  • * {@code jsr330}: the generated mapper is annotated with {@code @Named} and - * can be retrieved via {@code @Inject}
  • + * {@code @Singleton}, and can be retrieved via {@code @Inject} * * The method overrides an unmappedTargetPolicy set in a central configuration set * by {@link #config() } diff --git a/core-common/src/main/java/org/mapstruct/MapperConfig.java b/core-common/src/main/java/org/mapstruct/MapperConfig.java index 183ba25d4..d6a2ad243 100644 --- a/core-common/src/main/java/org/mapstruct/MapperConfig.java +++ b/core-common/src/main/java/org/mapstruct/MapperConfig.java @@ -77,7 +77,7 @@ public @interface MapperConfig { * can be retrieved via {@code @Autowired} *
  • * {@code jsr330}: the generated mapper is annotated with {@code @Named} and - * can be retrieved via {@code @Inject}
  • + * {@code @Singleton}, and can be retrieved via {@code @Inject} * * * @return The component model for the generated mapper. diff --git a/integrationtest/src/test/resources/jsr330Test/src/main/java/org/mapstruct/itest/jsr330/other/DateMapper.java b/integrationtest/src/test/resources/jsr330Test/src/main/java/org/mapstruct/itest/jsr330/other/DateMapper.java index 683b708c1..895aa4c41 100644 --- a/integrationtest/src/test/resources/jsr330Test/src/main/java/org/mapstruct/itest/jsr330/other/DateMapper.java +++ b/integrationtest/src/test/resources/jsr330Test/src/main/java/org/mapstruct/itest/jsr330/other/DateMapper.java @@ -23,7 +23,9 @@ import java.text.SimpleDateFormat; import java.util.Date; import javax.inject.Named; +import javax.inject.Singleton; +@Singleton @Named public class DateMapper { diff --git a/processor/src/main/java/org/mapstruct/ap/internal/processor/Jsr330ComponentProcessor.java b/processor/src/main/java/org/mapstruct/ap/internal/processor/Jsr330ComponentProcessor.java index 75315f625..05b8020aa 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/processor/Jsr330ComponentProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/processor/Jsr330ComponentProcessor.java @@ -42,16 +42,16 @@ public class Jsr330ComponentProcessor extends AnnotationBasedComponentModelProce @Override protected List getTypeAnnotations(Mapper mapper) { if ( mapper.getDecorator() == null ) { - return Collections.singletonList( named() ); + return Arrays.asList( singleton(), named() ); } else { - return Collections.singletonList( namedDelegate( mapper ) ); + return Arrays.asList( singleton(), namedDelegate( mapper ) ); } } @Override protected List getDecoratorAnnotations() { - return Collections.singletonList( named() ); + return Arrays.asList( singleton(), named() ); } @Override @@ -69,6 +69,10 @@ public class Jsr330ComponentProcessor extends AnnotationBasedComponentModelProce return true; } + private Annotation singleton() { + return new Annotation( getTypeFactory().getType( "javax.inject.Singleton" ) ); + } + private Annotation named() { return new Annotation( getTypeFactory().getType( "javax.inject.Named" ) ); }