Java/Spring/Dependency Injection

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

Contextualized Dependency Lookup Demo

       
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;
  }
}





Dependency Injection Demo

Setter Dependency Injection Demo

       
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;
  }
}





Spring bean dependency Demo

       
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();
  }
}