Java/Spring/Dependency Injection

Материал из Java эксперт
Перейти к: навигация, поиск

Contextualized Dependency Lookup Demo

   <source lang="java">
      

File: context.properties source.(class)=SimpleMessageData destination.(class)=StdoutMessageReporter service.(class)=DefaultMessageService service.source(ref)=source service.destination(ref)=destination

File: Main.java import java.util.HashSet; import java.util.Set; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; import org.springframework.util.Assert; public class Main {

 public static void main(String[] args) throws Exception {
   DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
   BeanDefinitionReader reader = new PropertiesBeanDefinitionReader(bf);
   reader.loadBeanDefinitions(new ClassPathResource("context.properties"));
   MessageServiceComponent msc = new MessageServiceComponent();
   registerComponent(msc);
   allowComponentsToLookup(bf);
   msc.run();
 }
 private static Set<ManagedComponent> components = new HashSet<ManagedComponent>();
 private static void allowComponentsToLookup(BeanFactory bf) {
   for (ManagedComponent component : components) {
     component.lookup(bf);
   }
 }
 private static void registerComponent(ManagedComponent managedComponent) {
   components.add(managedComponent);
 }

} class MessageServiceComponent implements ManagedComponent {

 private MessageService service;
 public void lookup(BeanFactory container) {
   this.service = (MessageService) container.getBean("service");
 }
 public void run() {
   this.service.execute();
 }

} class DependantComponent {

 private MessageService service;
 public DependantComponent(MessageService service) {
   Assert.notNull(service, "The "service" argument must not be null.");
   this.service = service;
 }
 public void run() {
   this.service.execute();
 }

} interface MessageService {

 void execute();

} class DefaultMessageService implements MessageService {

 private MessageData source;
 private MessageReporter destination;
 public void execute() {
   this.destination.write(this.source.getMessage());
 }
 public void setSource(MessageData source) {
   this.source = source;
 }
 public void setDestination(MessageReporter destination) {
   this.destination = destination;
 }

} interface ManagedComponent {

 void lookup(BeanFactory container);

} interface MessageReporter {

 void write(String message);

} interface MessageData {

 String getMessage();

} class StdoutMessageReporter implements MessageReporter {

 public void write(String message) {
   System.out.println(message);
 }

} class SimpleMessageData implements MessageData {

 private final String message;
 public SimpleMessageData() {
   this("Hello, world");
 }
 public SimpleMessageData(String message) {
   this.message = message;
 }
 public String getMessage() {
   return this.message;
 }

}


      </source>
   
  
 
  



Dependency Injection Demo

Setter Dependency Injection Demo

   <source lang="java">
      

File: context.properties source.(class)=SimpleMessageData destination.(class)=StdoutMessageReporter service.(class)=DefaultMessageService service.source(ref)=source service.destination(ref)=destination

File: Main.java import java.util.HashSet; import java.util.Set; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; public class Main {

 public static void main(String[] args) throws Exception {
   DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
   BeanDefinitionReader reader = new PropertiesBeanDefinitionReader(bf);
   reader.loadBeanDefinitions(new ClassPathResource("context.properties"));
   MessageService service = (MessageService) bf.getBean("service");
   DependantComponent dc = new DependantComponent();
   dc.setService(service);
   dc.run();
 }
 private static Set<ManagedComponent> components = new HashSet<ManagedComponent>();
 private static void allowComponentsToLookup(BeanFactory bf) {
   for (ManagedComponent component : components) {
     component.lookup(bf);
   }
 }
 private static void registerComponent(ManagedComponent managedComponent) {
   components.add(managedComponent);
 }

} class DependantComponent {

 private MessageService service;
 public DependantComponent() {
 }
 public void setService(MessageService service) {
     this.service = service;
 }
 public void run() {
     this.service.execute();
 }

} class MessageServiceComponent implements ManagedComponent {

 private MessageService service;
 public void lookup(BeanFactory container) {
   this.service = (MessageService) container.getBean("service");
 }
 public void run() {
   this.service.execute();
 }

}

interface MessageService {

 void execute();

} class DefaultMessageService implements MessageService {

 private MessageData source;
 private MessageReporter destination;
 public void execute() {
   this.destination.write(this.source.getMessage());
 }
 public void setSource(MessageData source) {
   this.source = source;
 }
 public void setDestination(MessageReporter destination) {
   this.destination = destination;
 }

} interface ManagedComponent {

 void lookup(BeanFactory container);

} interface MessageReporter {

 void write(String message);

} interface MessageData {

 String getMessage();

} class StdoutMessageReporter implements MessageReporter {

 public void write(String message) {
   System.out.println(message);
 }

} class SimpleMessageData implements MessageData {

 private final String message;
 public SimpleMessageData() {
   this("Hello, world");
 }
 public SimpleMessageData(String message) {
   this.message = message;
 }
 public String getMessage() {
   return this.message;
 }

}


      </source>
   
  
 
  



Spring bean dependency Demo

   <source lang="java">
      

File: context.xml <?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="b" class="B" depends-on="a"/>
   <bean id="a" class="A"/>

</beans>

File: Main.java import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Main {

 public static void main(String[] args) {
     XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("context.xml"));
     B b = (B) bf.getBean("b");
     A a = (A) bf.getBean("a");
     System.out.println(a);
     System.out.println(b);
 }

} final class Shared {

 private static Object value = null;
 private Shared() {
 }
 public synchronized static void setValue(Object o) {
     value = o;
 }
 public static Object getValue() {
     return value;
 }

}

class A {

 public A() {
     Shared.setValue("Undetermined");
 }
 @Override
 public String toString() {
     final StringBuilder sb = new StringBuilder();
     sb.append("A");
     sb.append("{}");
     sb.append("Shared.getValue()=").append(Shared.getValue()).append("}");
     return sb.toString();
 }

}

class B {

 public B() {
     Shared.setValue("Completed");
 }
 @Override
 public String toString() {
     final StringBuilder sb = new StringBuilder();
     sb.append("B");
     sb.append("{}");
     sb.append("Shared.getValue()=").append(Shared.getValue()).append("}");
     return sb.toString();
 }

}


      </source>