Java/Spring/Dependency Injection
Содержание
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>