Η αντιστροφή των εξαρτήσεων (IoC) είναι γνωστή και ως dependency injection (DI). Είναι μια διαδικασία, στην οποία τα αντικείμενα ορίζουν τις εξαρτήσεις τους (τα άλλα αντικείμενα με τα οποία δουλεύουν), μόνο μέσω παραμέτρων κατασκευαστή, παραμέτρων σε μια μέθοδο- εργοστάσιου ή μέσω properties, τα οποία ορίζονται στο στιγμιότυπο αντικειμένου, αφού αυτό κατασκευαστεί ή επιστραφεί από μέθοδο-εργοστάσιο. Το container ύστερα κάνει inject τις εξαρτήσεις, όταν δημιουργεί το bean. Η διαδικασία είναι ουσιαστικά η αντίστροφη, από το να ελέγχει το αντικείμενο-bean την αρχικοποίηση ή την τοποθεσία των εξαρτήσεων του , χρησιμοποιώντας απευθείας κατασκευή των κλάσεων.
Τα πακέτα org.springframework.beans και org.springframework.context είναι η βάση του Spring IoC container. Η διεπαφή BeanFactory παρέχει έναν προχωρημένο μηχανισμό ρύθμισεων, ο οποίος είναι ικανός, να διαχειρίζεται οποιοδήποτε τύπο αντικειμένου. Το πακέτο ApplicationContext είναι sub-interface του BeanFactory. To πακέτο BeanFactory παρέχει το configuration framework και τη βασική λειτουργικότητα, ενώ το ApplicationContext περισσότερο enterprise λειτουργικότητα.
Το interface org.springframework.context.ApplicationContext αντιπροσωπεύει το Spring IoC container και είναι υπεύθυνο, για την αρχικοποίηση, ρύθμιση και συναρμολόγηση των αντικειμένων. Το container παίρνει τις οδηγίες, ως προς ποια αντικείμενα να αρχικοποιήσει, να ρυθμίσει και να συναρμολογήσει, διαβάζοντας τα configuration metadata. Τα configuration metadata αναπαρίστανται με XML, Java annotations ή με κώδικα Java.
Η κλάση POJO είναι η Demo και έχει μια μέθοδο sayHello, η οποία εκτυπώνει στην κονσόλα ένα string από το πληκτρολόγιο.
public class Demo {
public void sayHello(String name){
System.out.println("Hello " + name);
}
}
Μπορούμε να δηλώσουμε ένα bean με ένα XML configuration file. Χρησιμοποιούμε το element <bean></bean>. Παρακάτω, δηλώνουμε ότι θέλουμε το Spring IoC container, να δημιουργήσει ένα bean με id demoBean από την κλάση Demo.
<?xml version="1.0" encoding=UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="demoBean" class="com.test.Demo"></bean>
</beans>
public class Main {
public static void main(String args[]) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(demo-config.xml>);
Demo bean = (Demo) context.getBean("demoBean");
bean.sayHello("Kostas")
context.close();
}
}
Χρησιμοποιούμε το annotation @Configuration και δημιουργούμε μια Java configuration κλάση DemoConfig, η οποία θα περιέχει beans. Η μέθοδος demo επιστρέφει ένα αντικείμενο-bean της κλάσης Demo με id demoBean.
@Configuration
public class DemoConfig {
@Bean(name = "demoBean")
public Demo demo() {
return new Demo();
}
}
public class Main {
public static void main(String args[]) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
Demo bean = (Demo) context.getBean("demoBean");
bean.sayHello("Kostas")
context.close();
}
}
Δημιουργούμε μια Java configuration κλάση DemoConfig, με το annotation @Configuration. Μετά, ενεργοποιούμε το μηχανισμό αναζήτησης components του Spring με το annotation @ComponentScan, δηλώνοντας και το πακέτο, που είναι τα components.
@Configuration
@ComponentScan("com.test")
public class DemoConfig {
}
Δηλώνουμε ότι η κλάση θα είναι ένα Spring component με το annotation @Component. Το Spring θα δημιουργήσει ένα αντικείμενο-bean της κλάσης με id demoBean και θα το εισάγει στο Spring IoC container.
@Component("demoBean")
public class Demo {
public void sayHello(String name){
System.out.println("Hello " + name);
}
}
public class Main {
public static void main(String args[]) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
Demo bean = (Demo) context.getBean("demoBean");
bean.sayHello("Kostas")
context.close();
}
}