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