2015-06-02 4 views
2

Я использую Context Dependency Injection CDI 1.1 рамки из JavaEE 7, на сервере приложений WildFly 8,2Инициализировать подклассы после @PostConstruct

Я хочу, чтобы инициализировать подклассы после @PostConstruct из суперкласса

So я Somthing как этот

// case 1: it's working but it's not simple to understand 

public class A { 

    @PostConstruct 
    protected void init() { 
     System.out.println("A"); 
     afterInit(); 
    } 

    protected void afterInit() {} 

} 

public class B extends A { 

    @Override 
    protected void afterInit() { 
     System.out.println("B"); 
    } 

} 


public class C extends B { 

    @Override 
    protected void afterInit() { 
     super.afterInit(); 
     System.out.println("C"); 
    } 

} 

Так метод init() напечатает A, B, C в указанном порядке

Было бы хорошо иметь @AfterPostconstruct аннотацию, которая будет делать то же самое, но я не найти

// case 2: dream code 

public class A { 

    @PostConstruct 
    protected void init() { 
     System.out.println("A"); 
    } 

} 

public class B extends A { 

    @AfterPostConstruct // pseudocode 
    protected void afterInitB() { 
     System.out.println("B"); 
    } 

} 


public class C extends B { 

    @AfterPostConstruct // pseudocode 
    protected void afterInitC() { 
     System.out.println("C"); 
    } 

} 

Я стараюсь, переопределяя init() но он не работает (init() не называется контейнером)

// case 3 : code that is not working but it would be better than case 1 

public class A { 

    @PostConstruct 
    protected void init() { 
     System.out.println("A"); 
    } 

} 

public class B extends A { 

    @Override 
    protected void init() { 
     super.init(); 
     System.out.println("B"); 
    } 

} 


public class C extends B { 

    @Override 
    protected void init() { 
     super.init(); 
     System.out.println("C"); 
    } 

} 

Есть ли лучший (более простой) способ инициализации подклассов после @PostConstruct?

ответ

5

В соответствии с разделом Призывание Порядок перехватчики объявленных на целевом классе из JSR 318 - Interceptors 1.2 (что относится и к КДИ 1.1, а) спецификация:

перехватчик методы, объявленные на целевом классе или его суперклассы являются вызывается в следующем порядке:

  • Если у целевого класса есть суперклассы, все методы перехватчика, определенные на этих суперклассах, вызывают, в первую очередь, самый общий суперкласс.
  • Вызывается метод перехватчика, если он есть, в самом целевом классе.

Если метод перехватчика переопределяется другим метод (независимо от того, самого метода перехватчика этого метод), он не будет быть вызван.

Так что в вашем случае использования, вы можете написать:

public class A { 

    @PostConstruct 
    private void initA() { 
     System.out.println("A"); 
    } 
} 

public class B extends A { 

    @PostConstruct 
    private void initB() { 
     System.out.println("B"); 
    } 
} 

public class C extends B { 

    @PostConstruct 
    private void initC() { 
     System.out.println("C"); 
    } 
} 

И получить напечатал: A, B, C в указанном порядке.

Смежные вопросы