2012-09-21 11 views
22

Mam klasę Util z metodami statycznymi. Wewnątrz mojej klasy Util, chcę użyć fasoli szparagowej, więc zawarłem je w mojej klasie użytkowej. O ile mi wiadomo, nie jest dobrą praktyką używanie fasoli szparagowej jako pól statycznych. Ale czy istnieje sposób dostępu do fasoli szparagowej w metodzie statycznej?Uzyskiwanie dostępu do fasoli szparagowej w metodzie statycznej

Mój przykład:

public class TestUtils { 

    private static TestBean testBean; 

    public void setTestBean(TestBean testBean) { 
    TestUtils.testBean = testBean; 
    } 

    public static String getBeanDetails() { 
    return beanName = testBean.getDetails(); 
    } 
} 

Widziałem w wielu forach, że nie jest najlepszym rozwiązaniem. Czy ktoś może mi pokazać, jak poradzę sobie z tego typu scenariuszem?

Mój plik konfiguracyjny:

<bean id="testUtils" class="com.test.TestUtils"> 
<property name="testBean" ref="testBean" /> 
</bean> 

Odpowiedz

0

Podejście zostały przedstawione to, co widziałem używany wstrzyknąć fasoli Wiosny w klasie użytkowej.

<bean id="testUtils" class="com.test.TestUtils"> 
<property name="testBean" ref="testBean" /> 
</bean> 

Inną opcją jest:

<bean name="methodInvokingFactoryBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="staticMethod" value="TestUtils.setInstance"/> 
     <property name="arguments"> 
      <list> 
       <ref bean="testBean"/> 
      </list> 
     </property> 
</bean> 

z:

public class TestUtils { 

    private static testBean; 

    public static void setInstance(TestBean anInstance) { 
    testBean = anInstance; 
    } 

    public static String getBeanDetails() { 
    return testBean.getDetails(); 
    } 
} 

Więcej szczegółów here i here

+0

Nie dla mnie jasne .. Czy można plz dodać testBean konfigurację? – TechSpellBound

1

To jak ja wstrzykiwany od wiosny do pola statycznego.

<bean id="..." class="..."> 
<property name="fieldToBeInjected"> 
      <util:constant static-field="CONSTANT_FIELD" /> 
     </property> 
</bean> 

Może to również ci pomoże.

10

Wynik metod statycznych powinien zależeć TYLKO od parametrów przekazanych do metody, dlatego nie ma potrzeby wywoływania żadnego komponentu bean.

Jeśli chcesz wywołać inną fasolę, twoja metoda powinna być metodą członka niezależnego komponentu bean.

Inne odpowiedzi dają praktyczne rozwiązania, ale fakt, że można to zrobić, nie oznacza, że ​​należy to zrobić.

+0

Tak, myślę, że powinniśmy używać go jako parametru zamiast ustawiania bezpośrednio w klasie statycznej. Opierając się na standardach mówi, że nie powinniśmy używać fasoli jako statycznego, chociaż możemy to zrobić na różne sposoby, jak pokazano w powyższych odpowiedziach. Dziękuję za odpowiedź. – Rosh

+1

"Wynik metod statycznych powinien zależeć TYLKO od parametrów przekazanych do metody", ładny strzał! – Nickolas

9

można również realizować ApplicationContextAware interfejs tak:

@Component 
public class TestUtils implements ApplicationContextAware { 

    private static ApplicationContext ac; 

    public static String getBeanDetails() { 
    return beanName = ((TestBean) ac.getBean("testBean")).getDetails(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext ac) { 
    this.ac = ac; 
    } 

} 
29

Moje podejście jest dla fasoli ktoś chce uzyskać dostęp do wdrożenia InitializingBean lub użyj @PostConstruct oraz zawierające statyczną odniesienie do siebie.

Na przykład:

@Service 
public class MyBean implements InitializingBean { 
    private static MyBean instance; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     instance = this; 
    } 

    public static MyBean get() { 
     return instance; 
    } 
} 

Wykorzystanie w swojej klasie statycznej zatem być tylko:

MyBean myBean = MyBean.get(); 

ten sposób, nie jest wymagana żadna konfiguracja XML, nie trzeba przechodzić w fasoli jako argument konstruktora, a osoba wywołująca nie musi wiedzieć ani dbać o to, że komponent bean jest połączony za pomocą Spring (tj. nie ma potrzeby wprowadzania niechlujnych zmiennych ApplicationContext).

+0

slick - Czy jest dobre miejsce, aby znaleźć poprawne obejście takich powracających problemów na wiosnę ..? –

1

Podobny do odpowiedzi @ nullPainter, ale zrobiliśmy co następuje. Nie jest wymagana żadna logika po skonstruowaniu.Po prostu ustawia element statyczny bezpośrednio podczas wstrzykiwania (metodą @Autowired).

@Service 
public class MyUtil { 

    private static MyManager myManager; 

    @Autowired(required = true) 
    public void setMyManager(MyManager manager) { 
     myManager = manager; 
    } 

    public static MyManager getMyManager() { 
     return myManager; 
    } 
} 
+0

Nie trzeba przekazywać parametru 'required = true' param, ponieważ jest to domyślna wartość' @ Autowired'. Tak więc tylko '@Autowired publiczny void setMyManager (menedżer MyManager) { myManager = manager; } ' wystarczy. – rumman0786

+0

wymaga adnotacji @Service, która ma niewielki sens – rohanagarwal

0

Działa to dla mnie. W pewnej klasy:

import org.springframework.web.context.ContextLoader; 
import org.springframework.web.context.WebApplicationContext; 

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); 
DataSource datasource = (DataSource)context.getBean("dataSourceDB_01");  

iw mojej konfiguracji XML:

<bean id="dataSourceDB_01" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"><value>${db.driver}</value></property>  
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${db.username_seg}</value></property> 
    <property name="password"><value>${db.password_seg}</value></property> 
</bean> 

HTH

Powiązane problemy