对最原始的HelloWorld.java写法分析:
一个HelloWorld有两个职责,一个是获得外部参数,另一个决定如何显示
第一次改进:分离职能
//消息显示者接口
MessageDisplayer.java
package prodream.com
public interface MessageSupplice{
public void setMessageSupplice(Message supplier);
public void display();
}
//实现MessageDisplayer接口
ConcreteMessageDisplayer.java
package prodream.com
public class ConreteMessageDisplayer{
private MessageSupplier suppier;
public void setMessageSupplier(MessageSupplier supplier){
this.supplier=supplier;
}
public void display(){
if(supplier==nul)
throw new RuntimeException();
System.out.println(supplier.getMessage());
}
}
//消息提供者接口
MessageSupplier.java
package prodream.com;
public interface MessageSupplier{
String getMessage();
}
//实现MessageSupplier接口
HelloWorldMessageSupplier.java
public class HelloWorldMessageSupplier{
public String getMessage(){
return "Hello World";
}
}
//主程序
HelloWorld.java:
public class HelloWorld{
public static void main(String[] args){
//创建消息提供者
MessageSupplier msgSupplier=new HelloWorldMessageSupplier();
//创建消息显示者
MessageDisplayer msgDisplayer=new ConcreteMessageDisplayer();
//注入消息提供者
msgDisplayer.setMessageSupplier(msgSupplier);
//显示相应信息
msgDisplayer.display();
}
分析:如果希望替换MessageDisplayer或者MessageSupplier的实现类,那么需要修改主程序中手动更改,那么运用程序代码又将经历编译测试的风险。
解决方法是通过外部的属性文件来读取相应实例类的名字
//我觉得这样不能体现什么大的价值,正如有写对spring的注入式的分析中写的一样,这种依赖转向对配置文件的依赖
再次改进:引入单例工厂
MessageSupportFactoruy.java:
package prodream.com;
import java.io.FileInputStream;
import java.util.Properties;
public class MessageSupportFactory{
private static MessageSupportFactory instance=null;
privateProperties props=null;
public synchronized static MessageSupportFactory getInstance(){
if(instance==null)
instance=new MessageSupportFactory();
return instance;
public MessageSupportFactory(){
props=new Properties();
try{
props.load(new FileInputStream("conf/msgbean.properties");
}
catch(Exception ex){
ex.printStackTrace();
}
}
public MessageDisplayer makeDisplayer(){
String displayClass=props.getProperty("displayer.class");
try{
return (MessageDisplayer) Class.forName(disaplayerClass).newInstance();
}
catch(ClassNotFoundException e){
System.out.println("Could't found class:" +displayClass);
}
catch(InstaniationException e){
System.out.println("Couldn't instaniate an object of type:" +displayerClass);
}
catch(IllegalAccessException e){
System.out.println("couldn't access class:"+displayerClass);
}
return null;
}
public MessageSupplier makeSupplier(){
String supplierClass=props.getProperty("supplier.class");
try{
return (MessageSupplierr) Class.forName(supplierClass).newInstance();
}
catch(ClassNotFoundException e){
System.out.println("Could't found class:" +supplierClass);
}
catch(InstaniationException e){
System.out.println("Couldn't instaniate an object of type:" +supplierClass);
}
catch(IllegalAccessException e){
System.out.println("couldn't access class:"+supplierClass);
}
return null;
}
}
vmsbean.properties的内容:
displayer.class=prodream.com.ConcreteMessageDiaplayer
supplier.class=prodream.com.HelloWorldSupplier
//主程序
HelloWorldWithFactory.java:
public class HelloWorldWithFactory{
public static void main(String[] args){
//创建消息提供者
MessageSupplier msgSupplier=MessageSupportFactory.getInstance().makeSupplier();
//创建消息显示者
MessageDisplayer msgDisplayer=MessageSupportFactory.getInstance().makeDisplayer();
//注入消息提供者
msgDisplayer.setMessageSupplier(msgSupplier);
//显示相应信息
msgDisplayer.display();
}
引入了工厂抽离了部分类实例化的硬编码(hard code,简单说就是一种代码不灵活的体现看他们往往可以通过外部设置,设计模式,重构等手段来解决)
。。
。
。
。
。
发表评论
-
spring-MessageSource
2010-05-05 15:41 1659将Spring自带的org.springframework.c ... -
spring的扩展点--PropertyPlaceholderConfigurer
2010-05-05 14:01 1039它的作用是一个资源属性的配置器,能够将BeanFactory的 ... -
ApplicationContextAware
2010-03-30 14:36 1119JDK-doc 2.5.6 Interface Applic ... -
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
2010-01-24 18:45 3731org.springframework.beans.facto ... -
SPRING框架的7大模块
2008-08-23 16:48 946核心容器:核心容器 ... -
Spring中BeanFactory配置文件的元素解析
2008-08-24 11:39 710<?xml version="1.0" ... -
使用Lookup方法注射方法
2008-08-24 17:46 655spring方法解决下面的问题:一个singleton bea ... -
替换任意的方法
2008-08-24 18:06 802在spring中不但提供了Lookup方法来注射方法,还提供了 ... -
一个普通表单控制器(SimpleFornController)处理视图流转的例子
2008-08-26 09:40 740Spring附有一些简单的窗体处理handler,这些hand ... -
SimpleFormController简单表单控制器的处理流程
2008-08-26 10:19 8251.当表单控制器接 ... -
SPRING分发器(DispatcherServlet)
2008-09-09 00:15 1309分发器(DispatcherServlet) Sprin ... -
Spring的View和ViewResolver的使用
2008-09-11 23:15 1485打开Spring的源代码,我们可以在org.springfra ... -
ModelAndView解析
2008-09-16 09:39 1234查看spring的帮助文档得到以下信息: org.sprin ... -
spring验证器Validator接口
2008-09-16 21:30 2566spring2.0 Validator接口 ... -
spring web mvc配置
2008-09-17 11:04 1088spring内建一个请求驱动 ... -
spring视图解析器
2008-09-17 15:21 1306spring最常用的JSP/JSTL视图解析器是: Int ... -
Spring dataSource配置
2010-01-23 13:40 1777不管通过何种持久化 ... -
AOP(Aspect Oriented Programming ) 面向切面编程
2010-01-23 13:38 810AOP是什么? AOP是OO ...
相关推荐
spring.jar spring-aop.jar spring-aop.jar spring-beans.jar spring-hibernate3.jar spring-jdbc.jar spring-struts.jar spring-web.jar
spring源码缺失jar。spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar
Spring4 In Action-5.2.3-Spring Web应用程序-向页面输出一条数据、输出列表、接收表单,Spring4 In Action-5.2.3-Spring Web应用程序-向页面输出一条数据、输出列表、接收表单
spring-boot-starter-kafka示例程序\n 支持springcloud1.5.4,kafka0.8.2.x\n 项目地址:https://github.com/zhyea/spring-boot-starter-kafka
下载下来就可以运行,注释清晰,Spring4 In Action-5.2.2-Spring Web应用程序-简单的控制器实现跳转
spring-boot spring-security-oauth2 完整demo,可以使用微信的方式来获取token和查看资源,注意看代码中的备注
spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断 重试 spring-cloud-sleuth-zipkin: 利用Sleuth、Zipkin对Spring Cloud应用...
spring-boot-examples-master示例程序,与各种框架集成,包括: dockercompose-springboot-mysql-nginx spring-boot-actuator spring-boot-banner spring-boot-docker spring-boot-elasticsearch spring-boot-...
spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-...
Spring Framework 是一种轻量级的解决方案,是构建你的企业级应用程序的潜在一站式解决 方案。 尽管如此, Spring 是模块化的,允许你只使用你需要的那些部分,而不必引入其他 的。 你可以使用IoC容器,任何 Web ...
Spring MVC属于Spring...使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。
java运行依赖jar包
spring和redis集成有很多方式,看到网上很多都是使用redistemplate自己去做redis 的一些操作,但是对于我们开发来说,肯定是使用越方便越好,于是乎就有了spring的对redis或者memcahe这些换成框架的封装,只需要引入...
博文链接:https://java-xiaodi.iteye.com/blog/138111
org.springframework.aop-3.0.4.RELEASE.jar org.springframework.asm-3.0.4.RELEASE.jar org.springframework.aspects-3.0.4.RELEASE.jar org.springframework.beans-3.0.4.RELEASE.jar org.springframework....
spring-cloud-contract-samples, spring 云合同项目示例 spring-云合同示例这个存储库包含用于 spring 云契约项目的消费者和生产者应用程序。它包含 2个重要分支。 master,我们测试最新版本的spring 云协定,以及 ...
spring-web.jar spring-web.jar
spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...