2017-08-13 2 views
0

Ich habe verschiedene Swing-Aktionen in einer Swing/Feder-Anwendung. Sie sind mit @ Komponent annotiert, so dass sie nach dem Autoscanning sichtbar sein sollten. Ich habe eine Konfigurationsklasse, in der ich eine Bean für ein Menü für den Hauptrahmen/das Hauptfenster definiere. Die Methode zum Erstellen/Zurückgeben des Menüobjekts muss bei Bedarf auf die Aktionen verweisen. In einer beans.xml Einstellung würde ich nur so etwas wie:Wie kann ich im Frühjahr auf andere Beans innerhalb einer Konfigurationsklasse verweisen?

<bean id="mainMenu" class="javax.swing.JMenu"> 
    <constructor-arg id="0" value="Schedule" /> 
    <constructor-arg id="1"> 
      <value type="int">0</value> 
    </constructor> 
</bean> 

Dann in dem Setter für den Bean in der Hauptform, würde ich die Setter autowire vor und die Elemente hinzuzufügen. In der Schwebe gibt es keine Möglichkeit, als eine Eigenschaft die Menüpunkte zu setzen - Sie müssen sie hinzufügen. In einer beans.xml-Einstellung kann ich jedoch eine Bean anhand der ID referenzieren oder die Erstellung einer anderen Bean eingeben. Wie mache ich das in meiner Konfigurationsklasse? Wie dies meine Konfigurationsklasse ist:

@Configuration 
@ComponentScan("net.draconia.ngucc.usher") 
public class BeanConfiguration 
{ 
    private Action mActCreateSchedule, mActEditSchedule, mActExit, mActRemoveSchedule; 
    private JMenu mMnuSchedule; 

    @Bean("scheduleMenu") 
    public JMenu getScheduleMenu() 
    { 
     if(mMnuSchedule == null) 
      { 
      mMnuSchedule = new JMenu("Schedule"); 
      mMnuSchedule.setMnemonic(KeyEvent.VK_S); 

      mMnuSchedule.add(getCreateScheduleAction()); 
      mMnuSchedule.add(getEditScheduleAction()); 
      mMnuSchedule.add(getRemoveScheduleAction()); 
      mMnuSchedule.addSeparator(); 
      mMnuSchedule.add(getExitAction()); 
      } 
    } 
} 

Ich möchte anstelle der get-Funktionen nutzen zu können, oder haben vielleicht Funktionen zu erhalten, um die Elemente zuzugreifen - in den get-Funktionen dann gäbe es so etwas wie Rückkehr sein ((CreateSchedule) (getBean (CreateSchedule.class))) (Ich denke, ich habe genug/richtige Anzahl von Klammern dort haha). Ich brauche nur Zugriff auf einen Anwendungskontext. Kann ich irgendwie einen (einen Anwendungskontext) in der Konfigurationsklasse autowire oder wie bekomme ich möglicherweise Zugang zu einem getBean, um auf diese Komponenten-gescannten Beans zuzugreifen?

Vielen Dank im Voraus!

Antwort

0

@Autowired Application in die Konfigurationsklasse

@Configuration 
@ComponentScan("net.draconia.ngucc.usher") 
public class BeanConfiguration 
{ 
    private Action mActCreateSchedule, mActEditSchedule, mActExit, mActRemoveSchedule; 
    private JMenu mMnuSchedule; 

    @Autowired 
    ApplicationContext context; 

    @Bean("scheduleMenu") 
    public JMenu getScheduleMenu() 
    { 
     if(mMnuSchedule == null) 
      { 
      mMnuSchedule = new JMenu("Schedule"); 
      mMnuSchedule.setMnemonic(KeyEvent.VK_S); 

      mMnuSchedule.add(getCreateScheduleAction()); 
      mMnuSchedule.add(getEditScheduleAction()); 
      mMnuSchedule.add(getRemoveScheduleAction()); 
      mMnuSchedule.addSeparator(); 
      mMnuSchedule.add(getExitAction()); 
      } 
    } 
} 

Eine andere Lösung ist die Verwendung von ApplicationContextAware Schnittstelle wie zu machen:

@Component 
public class ContextUtil implements ApplicationContextAware { 

    private static ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext context) throws BeansException { 
     ContextUtil.context=context; 

    } 

    public static ApplicationContext getContext() { 
     return context; 
    } 

    public static void setContext(ApplicationContext context) { 
     ContextUtil.context = context; 
    } 

    public static Object getBean(String beanName){ 

     return getContext().getBean(beanName); 
    } 

} 
+0

Ich werde diese Vorschläge ein Schuss - Vielen Dank! –

Verwandte Themen