Spring - ApplicationContext,inicializacja,referencje.

0

Witam.

  1. Czy istnieje jakaś metoda, klasa, sposób, który by pozwalał na kontrolę inicjalizacji beanów, a zwłaszcza to, który jako pierwszy zostanie utworzony? Np: mamy aplikację webową, utworzonych kilka beanów, które są zarejestrowane w applicationContext.xml.

  2. Drugie pytanie dotyczy błędu nullpointerexception. Np:
    <bean name="first" calss="First" />
    <bean name="second" class="Second">
    <property name="first" ref="first" />
    </bean>

Aby wywołać funkcję która znajduje się w klasie First muszę zastosować taką konstrukcję (inna nie przychodzi mi do głowy)

class Second
{
private First first;

public void setFirst(First f)
{
this.first = f;
first.jakaśFunkcja;
}
}

Gdybym z innego miejsca ją wywołał dostał bym wyjątek nullpointerexception czego nie chcę. Poza tym to rozwiązanie wydaje się być nieeleganckie. Czy ktoś zna inny rozwiązania tego problemu ?

Swoje błędy usprawiedliwiam krótkim czasem współpracy z tym frameworkiem :)

Z góry dziękuję za odpowiedź i pozdrawiam.

0
  1. Jeżeli chcesz kontrolować kolejność tworzenia beanów to wypróbuj atrybut depence-on : http://forum.springframework.org/showthread.php?p=183445

  2. Masz jakiś subtelny błąd w projekcie. Mówię serio. Jeżeli Second ma być pośrednikiem, który nie daje wartości dodanej (jak dekorator, adapter, itp.), w wywoływaniu First to znaczy, że coś jest nie tak. Tu masz dodatkowy problem w postaci wielu odpowiedzialności metody setFirst, która poza ustawieniem first wywołuje jakąś metodę.

class Second{
   private First first;
   public void setFirst(First first){
      this.first = first;
   }
   public void callFirstMethod(){
      first.method();
   }
}

Przy czym nie tworzysz obiektów second za pomocą new, ale musisz je pobrać za pomocą fabryki springowej. NPE pojawi się gdy spróbujesz inicjować Second za pomocą new. Względnie gdy masz coś namieszane z opóźnioną inicjalizacją beanów.

0

Dziękuję za odpowiedź. Trochę mi się rozjaśniło. Będę testował i podam wyniki.
Co do odpowiedzialności setera to tak - właśnie tego się chciałem pozbyć.

0

Witam ponownie.

Nawiązując do poprzednich rozważań, czy mogę zastosować taką konstrukcję i czy powinna działać ? (mi nie działa dostaję NPE).

<bean name="first" class="First" /> <bean name="second" class="Second" init-method="initialzie" depends-on="frist"> <property name="first" ref="first" /> </bean>

class First{

private String str = "Something";

public void write()
{
logger.info(str);
}
}

class Second{

private First first;

private void initialize()
{
first.write();
}

public void setFirst(First first)
{
this.first = first;
}

}

Zakładałem że Spring poczeka, aż bean Second dostanie referencje first i wtedy wywoła metodę initialize();

0
darkstar2 napisał(a)

Zakładałem że Spring poczeka, aż bean Second dostanie referencje first i wtedy wywoła metodę initialize();

Z dokumentacji Springa ( http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-lifecycle ):

Spring napisał(a)

Implementing the org.springframework.beans.factory.InitializingBean interface allows a bean to perform initialization work after all necessary properties on the bean are set by the container.

Zatem wywołana zostanie po ustawieniu First.

0

Dzięki za pomoc. Miałeś rację, miałem błąd w projekcie. Dokładnie mówiąc źle podszedłem do springa. Zamiast wszystkie powiązania tworzyć w applicationContext.xml to wykorzystywałem do tego ApplicationContext ctx.

Pozdrawiam i dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1