Problemi relativi all'iniezione statica in primavera?

4

Uso il spring-boot con spring xml nel mio progetto. I wrapper dei DAO in una classe DataAccessService per fungere da livello di servizio DB, sia il servizio che i DAO sono iniettati in primavera xml e usati da Autowired .

Ora voglio avere una classe XXXutils per fornire alcune funzioni utili statiche. Alcune delle funzioni devono accedere al database. Ma non posso accedere al servizio DB o al DAO nel metodo statico.

Come devo fare questo? Posso Autowire un servizio DB statico o DAO in XXXUtils class? Potrebbe non essere una buona pratica?

Non so nemmeno se Spring supporti l'iniezione statica.

C'è qualche buona pratica in merito?

    
posta shangyin 25.10.2014 - 06:04
fonte

2 risposte

5

Puoi fare così:

public class XXXUtils
{

    @Autowired
    private DataAccessService dsService;

    private static XXXUtils utils;

    @PostConstruct
    public void init()
    {
        utils = this;
        utils.dsService = this.dsService;
    }

    public DataAccessService getDsService()
    {
        return dsService;
    }

    public void setDsService(DataAccessService dsService)
    {
        dsService = dsService;
    }

    public static XXX fun1()
    {

    }

    public static String getDBData()
    {

        return utils.dsService.DsServiceFunc();
    }

Quindi puoi utilizzare XXXXUtils.getDBData() per accedere al DB.

e in primavera xml puoi configurare in questo modo:

<bean id="xxxUtils" class="package of the XXXXUtils" init-method="init">
    <property name="dsService" ref="dsService"/>
</bean>

Spera che questo ti possa aiutare: -)

    
risposta data 25.10.2014 - 07:08
fonte
2

La classe statica XXXutils che ha accesso al database è un odore di progettazione. Non dovresti avere classi statiche con dipendenze.

Invece di renderlo statico, basta dichiararlo come servizio (dato che accede ad un DB, è probabilmente un servizio) e poi lo inietta come dipendenza nelle classi che ne hanno bisogno.

Inoltre, per favore non usare i campi autowired. Basta iniettare (cioè autowire) tutto nel costruttore. Tutti gli oggetti devono avere tutte le dipendenze pronte per l'uso nel momento della costruzione. Qualsiasi altra cosa è un odore di design.

    
risposta data 06.04.2017 - 16:56
fonte

Leggi altre domande sui tag