2016-07-12 18 views
0

Ich habe einen Fall in meiner app, dass ich das Objekt AccountsDao accountsDaoFrühling Verwendung @Autowired Feld nicht in @Component

public class Account { 

    @Autowired 
    private AccountsDao accountsDao; 

ohne zu setzen ein Attribut @Component-Account Klasse (und ohne jede andere Methode verwenden, müssen markiere es als Frühlingsbohne).

Die App ist riesig, und es gibt einen objektiven Grund, warum Account kein Spring Bean sein darf und manuell initialisiert werden muss.

Ich weiß auch, dass dies ein Einzelfall ist, und die gemeinsame Struktur ist in Ordnung.

Gibt es eine Möglichkeit, das zu tun?

Antwort

0

hinzufügen SpringUtils.java

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.config.BeanFactoryPostProcessor; 
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 

@Component 
public class SpringUtils implements BeanFactoryPostProcessor { 

    private static ConfigurableListableBeanFactory beanFactory; 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException { 
     // TODO Auto-generated method stub 
     SpringUtils.beanFactory = arg0; 
    } 

    public static <T> T getBean(Class<T> clz) throws BeansException { 
     T result = (T) beanFactory.getBean(clz); 
     return result; 
    } 

} 

Verwendung

AccountsDao accountsDao = SpringUtils.getBean(AccountsDao.class); 
+0

danke dies ist die beste Option von dem, was ich gesehen habe – user1935987

+1

Dies zerstört die Inversion der Control-Muster, die Sie für die Verwendung von Spring obwohl. Der "Account" wird nun seine Abhängigkeiten selbst sammeln, anstatt sie von außen zu bekommen. Code wie dieser ist schwieriger zu testen, da Sie jetzt daran denken müssen, die 'SpringUtils' korrekt zu konfigurieren, wenn der' Account' in Tests verwendet wird. – FrontierPsychiatrist

0

Sie können Spring-Kontext programmatisch bekommen und AccountsDoa daraus erhalten. Sie können dies in Account-Konstruktor tun. Spring get current ApplicationContext Die zweite Antwort.

0

Sie können nur selbst Konstruktor Injektion machen, wenn Sie die AccountsDao zum Zeitpunkt der Erstellung der Account zur Verfügung haben.

public class Account { 

    private final AccountsDao accountsDao; 

    public Account(AccountsDao accountsDao) { 
     this.accountsDa = accountsDao; 
    } 
} 

von Apart dass @Configurable ist da, aber das erfordert AspectJ soweit ich weiß.

http://olivergierke.de/2009/05/using-springs-configurable-in-three-easy-steps/

Spring autowiring using @Configurable

+0

, die nicht bei Option ist nicht verfügbar. – user1935987

1

Sie sollten dies nicht tun, vor allem keine BeanUtils (absolut anti-Muster), und es gibt Gründe, warum dies von defa nicht unterstützt wird Ult. Wenn Sie wirklich das DAO benötigen, so etwas wie

public class Account { 
    public void doSomethingWithDao(AccountDao accountDao) { 
    // TODO do somthing with dao, but do not store it in a field 
    } 
} 

Edit: Hier ist, wie Sie es nennen würde:

@Component 
public class MyBusinessLogicClass { 
    @Autowired 
    private AccountDao accountDao; 

    public void doMyBusinessLogic(Account account) { 
    account.doSomethingWithDao(accountDao); 
    } 
} 
+0

Ich habe dich nicht verstanden. Woher bekommt man dann 'AccountDao accountDao'? – user1935987

+0

Sie haben nur das accountDao in der Methode, wo Sie es brauchen. Es hängt davon ab, wofür Sie den accountDao benötigen, aber der äußere Aufrufer von Account wird den accountDao injizieren und als Parameter nur für den Kontext der Methode an Account übergeben. –

Verwandte Themen