Na początku zaznaczę, że sam w Springa dopiero zaczynam i jestem zielony jak listek w logo :P. Dlatego moje rady traktuj jako coś mało pewnego i będę wdzięczny jeśli wypowie się ktoś bardziej ogarnięty.
1. Wyodrębnij osobną klasę do konfiguracji beanów. Wydaje mi się, że nie jest dobre łączenie jej z mainem.
package info.stanislawczyk.spring.api;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages="info.stanislawczyk")
public class AppConfiguration {
}
Pozostałe klasy, w których coś zmieniłem
package info.stanislawczyk.spring.api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("messagePrinter")
public class MessagePrinter {
@Autowired
private MessageProducer producer;
MessagePrinter() {}
public MessagePrinter(MessageProducer producer) {
this.producer = producer;
}
public MessageProducer getProducer() {
return producer;
}
public void setProducer(MessageProducer producer) {
this.producer = producer;
}
public void print() {
System.out.println(producer.getMessage());
}
}
package info.stanislawczyk.spring.api;
import org.springframework.stereotype.Component;
@Component("simpleMessageProducer")
public class SimpleMessageProducer implements MessageProducer{
public String getMessage() {
return "Example message " + System.currentTimeMillis();
}
}
package info.stanislawczyk.spring.api;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringDiApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfiguration.class);
MessageProducer messageProducer = ctx.getBean("simpleMessageProducer", MessageProducer.class);
System.out.println(messageProducer.getMessage());
}
}
2. W mainie context wywołujesz podobnie jak było to przy xml czyli
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfiguration.class);
MessageProducer messageProducer = ctx.getBean("simpleMessageProducer", MessageProducer.class);
Nazwa simpleMessageProducer została ustawiona przy adnotacji Component w odpowiedniej klasie
3. W AppConfigu basePackages jest opcjonalne, ale u mnie raz działa bez tego, a raz nie także na wszelki wypadek to dałem
4. Componenty nazywasz w taki sposób @Component("nazwaBeana")
Tak jak mówiłem w Springu jestem jeszcze słaby i najlepiej będzie jak przejrzysz sobie jakieś kursy (np. Artura Owczarka na YT).