重构HelloWorld
1.最简单的HelloWorld
没有任何的可扩展性!
package com.fkit.fk1;
public class SimpleHelloWorld {
public static void main(String[] args) {
//不具有扩展性
System.out.println("hello,world");
}
}
2.重构方案
2.1 使用接口重构
渲染器
使用接口重构
package com.fkit.fk1;
//重构消息检索逻辑
interface MessageProvider {
String getMessage();
}
class HelloWorldMessageProvider implements MessageProvider {
@Override
public String getMessage() {
return "hello,world!";
}
}
//重构渲染消息的组件
interface MessageRender {
MessageProvider getMessageProvider();
void setMessageProvider(MessageProvider provider);
void render();
}
class StandardOutMessageRender implements MessageRender {
private MessageProvider provider;
@Override
public MessageProvider getMessageProvider() {
return this.provider;
}
@Override
public void setMessageProvider(MessageProvider provider) {
this.provider = provider;
}
@Override
public void render() {
if (provider == null) {
throw new RuntimeException(
"You must set the property messageProvide of class:" +
StandardOutMessageRender.class.getName());
}
System.out.println(provider.getMessage());
}
}
public class RebuildHelloWorld {
public static void main(String[] args) {
MessageProvider provider = new HelloWorldMessageProvider();
MessageRender render = new StandardOutMessageRender();
render.setMessageProvider(provider);
render.render();
}
}
2.2 使用简单工厂
配置文件pros.properties
providerClass = com.fkit.fk1.HelloWorldMessageProvider
renderClass = com.fkit.fk1.StandardOutMessageRender
工厂类
package com.fkit.fk1;
import java.util.Properties;
//简单工厂,可以从属性文件读取实现类的名称并创建实例
public class MessageSupportFactory {
//单例
private static MessageSupportFactory factory;
//操作属性文件的Properties类
private Properties properties;
//声明MessageProvider、MessageRender接口变量
private MessageProvider provider;
private MessageRender render;
//静态代码块,在程序加载时执行1次,创建工厂实例
static {
factory = new MessageSupportFactory();
}
//工厂方法
private MessageSupportFactory() {
try {
properties = new Properties();
//加载properties配置文件
properties.load(this.getClass().getResourceAsStream("/props.properties"));
//读取配置文件中的key-value
String providerClass = properties.getProperty("providerClass");
String renderClass = properties.getProperty("renderClass");
//根据配置文件中的全限定类名利用反射机制创建实例
this.provider = (HelloWorldMessageProvider) Class.forName(providerClass).newInstance();
this.render = (StandardOutMessageRender) Class.forName(renderClass).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
//返回工厂实例
public static MessageSupportFactory getInstance() {
return factory;
}
//返回MessageProvider接口引用的实例
public MessageProvider getProvider() {
return provider;
}
//返回MessageRender接口引用的实例
public MessageRender getRender() {
return render;
}
}
接口、接口实现类、main方法
package com.fkit.fk1;
//重构消息检索逻辑
interface MessageProvider {
String getMessage();
}
class HelloWorldMessageProvider implements MessageProvider {
@Override
public String getMessage() {
return "hello,world!";
}
}
//重构渲染消息的组件
interface MessageRender {
MessageProvider getMessageProvider();
void setMessageProvider(MessageProvider provider);
void render();
}
class StandardOutMessageRender implements MessageRender {
private MessageProvider provider;
@Override
public MessageProvider getMessageProvider() {
return this.provider;
}
@Override
public void setMessageProvider(MessageProvider provider) {
this.provider = provider;
}
@Override
public void render() {
if (provider == null) {
throw new RuntimeException(
"You must set the property messageProvide of class:" +
StandardOutMessageRender.class.getName());
}
System.out.println(provider.getMessage());
}
}
public class RebuildHelloWorld {
public static void main(String[] args) {
// MessageProvider provider = new HelloWorldMessageProvider();
// MessageRender render = new StandardOutMessageRender();
// render.setMessageProvider(provider);
// render.render();
//获取工厂实例
MessageSupportFactory factory = MessageSupportFactory.getInstance();
//从工厂中获取实例,不需要自己new对象了,这样可以解耦
MessageProvider provider = factory.getProvider();
MessageRender render = factory.getRender();
render.setMessageProvider(provider);
render.render();
}
}
2.3 Spring重构 xml方式
1.导入spring所需的jar包
导入
- spring的beans、context、core、expression模块
- apache commons logging包
2.配置application-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"
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">
<!--HelloWorldMessageProvider Bean-->
<bean id="provider"
class="com.fkit.fk1.HelloWorldMessageProvider"/>
<!--配置StandardOutMessageRender的Bean,利用p命名空间将provider注入到render中(render依赖provider)-->
<bean id="renderer"
class="com.fkit.fk1.StandardOutMessageRender"
p:messageProvider-ref = "provider"/>
</beans>
3.main方法
package com.fkit.fk1;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//使用Spring重构
public class HelloWorldSpringDI {
public static void main(String[] args) {
try {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("application-context.xml");
MessageRender mr = ctx.getBean("renderer", MessageRender.class);
mr.render();
} catch (BeansException e) {
e.printStackTrace();
}
}
}
2.4 Spring重构-注解方式
spring3之后,可以使用注解和配置类。
配置类是【@Configuration注解】的Java类,使用【@Bean注解】或者【@ComponentScanning注解】对bean注解。
配置类HelloWorldConfiguration
package com.fkit.fk1;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HelloWorldConfiguration {
@Bean
public MessageProvider provider() {
return new HelloWorldMessageProvider();
}
@Bean
public MessageRender renderer() {
MessageRender render = new StandardOutMessageRender();
render.setMessageProvider(provider());
return render;
}
}
main方法
package com.fkit.fk1;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//使用Spring重构
public class HelloWorldSpringDI {
public static void main(String[] args) {
// try {
// ApplicationContext ctx =
// new ClassPathXmlApplicationContext("application-context.xml");
// MessageRender mr = ctx.getBean("renderer", MessageRender.class);
// mr.render();
// } catch (BeansException e) {
// e.printStackTrace();
// }
try {
ApplicationContext ctx =
new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
MessageRender render = ctx.getBean("renderer",MessageRender.class);
render.render();
} catch (BeansException e) {
e.printStackTrace();
}
}
}