一、创建两个接口并实现
package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
/**
* @author :zhang
* @description:
* @date :Created in 2019/6/27 10:56
*/
public interface MessageProvider {
String getMessage();
}
package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
/**
* @author :zhang
* @description:
* @date :Created in 2019/6/27 10:59
*/
public class HelloWorldMessageProvider implements MessageProvider{
@Override
public String getMessage() {
return "Hello World";
}
}
package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
public interface MessageRenderer {
void Render();
void setMessageProvider(MessageProvider messageProvider);
MessageProvider getMessageProvider();
}
package com.zz.my_spring_five.practice.second_chapter.individualcomponents.message;
/**
* @author :zhang
* @description:
* @date :Created in 2019/6/27 11:00
*/
public class StandardOutMessageRenderer implements MessageRenderer{
private MessageProvider messageProvider;
@Override
public void Render() {
if (messageProvider == null) {
System.out.println(" You must set the property messageProvider class: StandardOutMessageRenderer . class. getName ()");
} else {
System.out.println("Hello World");
}
}
@Override
public void setMessageProvider(MessageProvider messageProvider) {
this.messageProvider = messageProvider;
}
@Override
public MessageProvider getMessageProvider() {
return this.messageProvider;
}
}
二、工厂类并读取配置文件
配置文件msf.properties(位于springBoot的resources文件夹下)
renderer.class=com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.StandardOutMessageRenderer
provider.class=com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.HelloWorldMessageProvider
import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageProvider;
import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageRenderer;
import java.io.IOException;
import java.util.Properties;
/**
* @author :zhang
* @description:
* @date :Created in 2019/6/27 11:16
*/
public class MessageSupportFactory {
private static MessageSupportFactory factory;
private Properties properties;
private MessageProvider messageProvider;
private MessageRenderer messageRenderer;
private MessageSupportFactory() {
properties = new Properties();
try {
properties.load(this.getClass().getResourceAsStream("/msf.properties"));
String rendererClass = properties.getProperty("renderer.class");
String providerClass = properties.getProperty("provider.class");
messageRenderer = (MessageRenderer) Class.forName(rendererClass).newInstance();
messageProvider = (MessageProvider) Class.forName(providerClass).newInstance();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
static {
factory = new MessageSupportFactory();
}
public static MessageSupportFactory getFactory(){
return factory;
}
public MessageProvider getMessageProvider() {
return messageProvider;
}
public MessageRenderer getMessageRenderer() {
return messageRenderer;
}
}
三、main方法
package com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory;
import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageProvider;
import com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.MessageRenderer;
/**
* @author :zhang
* @description:
* @date :Created in 2019/6/27 11:36
*/
public class MainClass {
public static void main(String... args) {
MessageProvider messageProvider = MessageSupportFactory.getFactory().getMessageProvider();
MessageRenderer messageRenderer = MessageSupportFactory.getFactory().getMessageRenderer();
messageRenderer.setMessageProvider(messageProvider);
messageRenderer.Render();
}
}
四、运行main方法输出Hello World
说明:
出现错误
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MainClass.main(MainClass.java:14)
Caused by: java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MessageSupportFactory.<init>(MessageSupportFactory.java:27)
at com.zz.my_spring_five.practice.second_chapter.individualcomponents.supportfactory.MessageSupportFactory.<clinit>(MessageSupportFactory.java:44)
... 1 more
Process finished with exit code 1
则是properties文件在加载读取的时候错误,修改以下代码中的"/msf.properties",此处已经配置好
properties.load(this.getClass().getResourceAsStream("/msf.properties"));
扩展:spring经典配置获取实例,配置xml注入,添加app-context.xml,放到resource文件夹下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="provider"
class="com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.HelloWorldMessageProvider" />
<bean id="renderer"
class="com.zz.my_spring_five.practice.second_chapter.individualcomponents.message.StandardOutMessageRenderer"
p:messageProvider-ref="provider" />
</beans>
main方法测试
public class HelloWorldSpringDI {
public static void main(String... args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app-context.xml");
MessageRenderer messageRenderer = context.getBean("renderer", MessageRenderer.class);
messageRenderer.Render();
}
}
使用注解的方式配置获取实例,添加配置文件HelloWorldConfiguration.java
@Configuration
public class HelloWorldConfiguration {
// 相当于<bean id="provider" class="..." />
@Bean
public MessageProvider provider() {
return new HelloWorldMessageProvider();
}
// 相当于<bean id="renderer" class="..." />
@Bean
public MessageRenderer renderer(){
MessageRenderer renderer = new StandardOutMessageRenderer();
renderer.setMessageProvider(provider());
return renderer;
}
}
main方法测试
public class HelloWorldSpringAnnotated {
public static void main(String... args) {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
MessageRenderer renderer = context.getBean("renderer", MessageRenderer.class);
renderer.Render();
}
}