Множественные методы постконструкции? -- java поле с участием postconstruct пол Связанный проблема

Multiple PostConstruct methods?


22
vote

проблема

русский

Он говорит в Документация Java для Postconstruct что

Только один метод может быть аннотирован с этой аннотацией

Но я просто пытался аннотировать три метода автономной приложения с постконструкцией. Нет ошибок компиляции, и все три из них вызываются и выполнены гладко.

Так что мне не хватает? В каком классе можно и не может существовать несколько аннотаций постконструкции?

Английский оригинал

It says in Java's documentation page for PostConstruct that

Only one method can be annotated with this annotation

But I just tried annotating three methods of a standalone application with PostConstruct. No compile errors, and all three of them are invoked and executed smoothly.

So what am I missing? In what kind of class can and cannot exist multiple PostConstruct annotations?

</div
     
 
 

Список ответов

18
 
vote

Да, кажется, что весна не следит за этим ограничением. Я нашел код для обработки этой аннотации, который является <Код> InitDestroyAnnotationBeanPostProcessor и конкретный метод:

 <код> public void invokeInitMethods(Object target, String beanName) throws Throwable {         Collection<LifecycleElement> initMethodsToIterate =                 (this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods);         if (!initMethodsToIterate.isEmpty()) {             boolean debug = logger.isDebugEnabled();             for (LifecycleElement element : initMethodsToIterate) {                 if (debug) {                     logger.debug("Invoking init method on bean '" + beanName + "': " + element.getMethod());                 }                 element.invoke(target);             }         }     }   

Так, весенняя поддержка Multi Postconstruct

 

Yes, it's seem Spring doesn't follow this restriction. I have found code to process this annotation which is InitDestroyAnnotationBeanPostProcessor, and the specific method:

public void invokeInitMethods(Object target, String beanName) throws Throwable {         Collection<LifecycleElement> initMethodsToIterate =                 (this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods);         if (!initMethodsToIterate.isEmpty()) {             boolean debug = logger.isDebugEnabled();             for (LifecycleElement element : initMethodsToIterate) {                 if (debug) {                     logger.debug("Invoking init method on bean '" + beanName + "': " + element.getMethod());                 }                 element.invoke(target);             }         }     } 

So, spring support multi PostConstruct

</div
 
 
6
 
vote

Это, вероятно, зависит от реализации CDI, которую вы используете. Вы ввели объект, где у вас есть аннотации, не так ли?

Я просто попробовал его с сварным швом, что бросает исключение, как и ожидалось:

 <код> public class MyActivityManager {     private static MyActivityManager instance;     private Stack<Activity> activityStack;//activity's stack     private MyActivityManager() {     }     //singleton     public static MyActivityManager getInstance() {         if (instance == null) {             instance = new MyActivityManager();         }         return instance;     }     //push an activity to stack     public void pushOneActivity(Activity actvity) {         if (activityStack == null) {             activityStack = new Stack<Activity>();         }         activityStack.add(actvity);     }     //get last activity,fifo     public Activity getLastActivity() {         return activityStack.lastElement();     }     //remove an activity     public void popOneActivity(Activity activity) {         if (activityStack != null && activityStack.size() > 0) {             if (activity != null) {                 activity.finish();                 activityStack.remove(activity);                 activity = null;             }         }     }     //finish all activity     public void finishAllActivity() {         if (activityStack != null) {             while (activityStack.size() > 0) {                 Activity activity = getLastActivity();                 if (activity == null) break;                 popOneActivity(activity);             }         }     } } 0  
 

This probably depends on the CDI implementation you are using. You did inject the object, where you have the annotations, didn't you?

I just tried it with WELD, which throws an exception as expected:

WELD-000805: Cannot have more than one post construct method annotated with @PostConstruct for [EnhancedAnnotatedTypeImpl] public  class Test 
</div
 
 
1
 
vote

Поддержка весны multi postconstruct , во время выполнения Приложение выберут сначала запустить, тот, который заказывает в верхней части в классе. См. Пример ниже:

 <код> public class MyActivityManager {     private static MyActivityManager instance;     private Stack<Activity> activityStack;//activity's stack     private MyActivityManager() {     }     //singleton     public static MyActivityManager getInstance() {         if (instance == null) {             instance = new MyActivityManager();         }         return instance;     }     //push an activity to stack     public void pushOneActivity(Activity actvity) {         if (activityStack == null) {             activityStack = new Stack<Activity>();         }         activityStack.add(actvity);     }     //get last activity,fifo     public Activity getLastActivity() {         return activityStack.lastElement();     }     //remove an activity     public void popOneActivity(Activity activity) {         if (activityStack != null && activityStack.size() > 0) {             if (activity != null) {                 activity.finish();                 activityStack.remove(activity);                 activity = null;             }         }     }     //finish all activity     public void finishAllActivity() {         if (activityStack != null) {             while (activityStack.size() > 0) {                 Activity activity = getLastActivity();                 if (activity == null) break;                 popOneActivity(activity);             }         }     } } 1  

Тогда выполнение будет заказано соответственно, как изображение ниже:

Введите описание изображения здесь

 

Spring support multi PostConstruct, in runtime the application will choose to run first, the one ordered in the top in the class. see example below:

@PostConstruct private void firstPostConstructor() {  LOGGER.info("First Post Constructor"); }  @PostConstruct private void secondPostConstructor() {  LOGGER.info("Second Post Constructor"); }  @PostConstruct public void thirdPostConstructor() {  LOGGER.info("Third Post Constructor"); } 

Then the execution will be ordered accordingly as the picture below:

enter image description here

</div
 
 
 
 
0
 
vote

Я протестировал с одним классом с 2 @postconstruct, то я получаю ошибку WELD-000805: не может иметь более одного метода поступления Но все в порядке, если у меня будет несколько @postconstruct, каждый в одном классе. Так что я думаю, это предложение означает: Только один метод на класс может быть аннотирован с этой аннотацией.

 

I tested with one class with 2 @PostConstruct, then I get the error WELD-000805: Cannot have more than one post construct method But it's ok if I have multiple @PostConstruct, each in one class. So I guess this sentence means: Only one method per class can be annotated with this annotation.

</div
 
 

Связанный проблема

0  карта JSON на провал строки в Java  ( Json map to string failure in java ) 
В Java я пытаюсь преобразовать карту в JSon строку. используя код ниже <код> private void sendResponse(Map<String, String> responseMap) throws IOException {...

3  Eclipse Java Formatter - новая линия до закрытия скобок  ( Eclipse java formatter newline before closing parentheses ) 
Можно ли настроить Dippleter Eclipse Java для вставки новой строки до закрытия скобок выражений, деклараций метода и вызовы методов? Обратите внимание на же...

1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST  ( Rest convert xml content passed with post to a java object attribute inside th ) 
<Р> Я работаю с REST сервисов и я хочу передать XML-текст запроса POST. Мой сервер реализован в JAVA. Давайте предположим, что я посылаю этот XML: <код> <ran...

40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки?  ( Can you tell on runtime if youre running java from within a jar ) 
У меня есть приложение, которое некоторые из моих пользователей работают от Eclipse, и другие запускают его, используя файл JAR. Я хочу, чтобы некоторые дей...

0  Случайные 7-значные номера на andich android  ( Random 7 digit numbers on click android ) 
Я хотел бы, чтобы вы помогли мне в этом коде. Я могу генерировать случайные числа, но не в точном количестве. Вопрос: Как я могу генерировать 7 случайных ци...

1  Установка поля _ID с использованием SQLite & ContentProvider в Android  ( Setting the id field using sqlite contentprovider in android ) 
Я пытаюсь настроить ContentProvider в приложении Android, чтобы держать информацию о домах. Я хотел бы иметь возможность установить поле _id, чтобы быть таким...

0  Должен ли я использовать Mac для разработки Javafx для iOS  ( Do i have to use a mac to develop javafx for ios ) 
Документация http://docs.gluonhq.com/charm/4.0.1 / # _ iOS говорит, что мне нужно «Mac с MacOS X 10.9 или превосходящим» для разработки для iOS. Но я не пон...

5  Конвенции о ведении регистрации [Закрыто]  ( Logging conventions ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows?  ( How to invoke my restful api method integrated with redis on windows ) 
Я пытаюсь запустить образец весеннего загрузочного приложения с Redis. Я использую завод соединения JEDIS и установив его на заводе подключения шаблона Redis....

17  Перегрузка Java VS переопределения  ( Java overloading vs overriding ) 
Привет, я просто хочу убедиться, что у меня есть эти понятия правильно. Перегрузка в Java означает, что у вас может быть конструктор или метод с различным кол...

-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java  ( Need to simplify logical expression byte short integer java ) 
Мне нужно упростить выражение Первое выражение <код> (byte)( (short)((short)( (byte)((theInt >> 8) & 0xFF) & 0xFF) + 128) & 0xFF); второе выражение ...

3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5?  ( How do i change the response for a http options request in a spring mvc 2 5 appl ) 
Это звучит как тривиальный вопрос, но каким-то образом я не могу понять это. У меня есть приложение Spring MVC. Я не поддерживаю никаких HTTP-методов, кроме...

1  Apache Vamel: Как проверить, например, набор набора <customObject>  ( Apache camel how to test for instance of setcustomobject ) 
Кто-нибудь знает, как тестировать для различных типов коллекции в маршруте? <код> // This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> //...

21  Тип несоответствия для генеральных классов  ( Type mismatch for class generics ) 
У меня есть следующий код, который не скомпировался, и хотя есть способ сделать его компиляцией, я хочу понять, почему он не компилирует. Может ли кто-нибудь ...

0  Прямоугольник и круг Collision Java, используя .Наиград  ( Rectangle and circle collision java using intersection ) 
Я делаю игру на прорыв для школьного проекта. Единственная проблема, которую я бегу в, это мяч, подпрыгивая, когда мяч и кирпичи сталкиваются. Я использовал B...

Связанный проблема

0  карта JSON на провал строки в Java 
3  Eclipse Java Formatter - новая линия до закрытия скобок 
1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST 
40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки? 
0  Случайные 7-значные номера на andich android 
1  Установка поля _ID с использованием SQLite & ContentProvider в Android 
0  Должен ли я использовать Mac для разработки Javafx для iOS 
5  Конвенции о ведении регистрации [Закрыто] 
1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows? 
17  Перегрузка Java VS переопределения 
-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java 
3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5? 
1  Apache Vamel: Как проверить, например, набор набора <customObject> 
21  Тип несоответствия для генеральных классов 
0  Прямоугольник и круг Collision Java, используя .Наиград 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.