我们将从如下程序演进中初识Spring。
1、简单的消息取得、消息显示程序原型
消息取得接口:
MessageSupplier.java
package tutorial.spring;
public interface MessageSupplier {
String getMessage();
}
实现类:
package tutorial.spring.impl;
import tutorial.spring.MessageSupplier;
public class HelloWorldMessageSupplier implements MessageSupplier {
public String getMessage() {
return "Hello World";
}
}
消息显示接口:
package tutorial.spring;
public interface MessageDisplayer {
void setMessageSupplier(MessageSupplier supplier);
MessageSupplier getMessageSupplier();
void display();
}
实现类:
package tutorial.spring.impl;
import tutorial.spring.MessageDisplayer;
import tutorial.spring.MessageSupplier;
public class ConcreteMessageDisplayer implements MessageDisplayer {
private MessageSupplier messageSupplier = null;
public void display() {
if(messageSupplier == null) {
throw new RuntimeException(
"必须设定messageSupplier属性: "+
ConcreteMessageDisplayer.class.getName());
}
System.out.println(messageSupplier.getMessage());
}
public MessageSupplier getMessageSupplier() {
return messageSupplier;
}
public void setMessageSupplier(MessageSupplier supplier) {
this.messageSupplier = supplier;
}
}
主程序:
package tutorial.spring;
import tutorial.spring.impl.ConcreteMessageDisplayer;
import tutorial.spring.impl.HelloWorldMessageSupplier;
public class HelloWorldBetterUsage {
public static void main(String[] args) {
MessageDisplayer msgDisplayer = new ConcreteMessageDisplayer();
MessageSupplier msgSupplier = new HelloWorldMessageSupplier();
msgDisplayer.setMessageSupplier(msgSupplier);
msgDisplayer.display();
}
}
首先分别创建ConcreteMessageDisplayer实例和HelloWorldSupplier实例,随后将MessageSupplier传递给MessageDisplayer,最后调用MessageDisplayer的display()方法,执行后的预期结果为:
Hello World
2、引入单例工厂
创建工厂类,通过引用外部文件来读取相应实例类的名字,并由工厂类来负责实例化。
package tutorial.spring;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class MessageSupportFactory {
private static MessageSupportFactory instance = null;
private Properties props = null;
/**
*
* 使用synchronized来保障线程安全性
*/
public synchronized static MessageSupportFactory getInstance() {
if(instance == null)
instance = new MessageSupportFactory();
return instance;
}
private MessageSupportFactory() {
props = new Properties();
try {
props.load(new FileInputStream("src/msgbean.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public MessageDisplayer makeDisplayer() {
String displayerClass = props.getProperty("displayer.class");
try{
return(MessageDisplayer)Class.forName(displayerClass).newInstance();
} catch(ClassNotFoundException e) {
System.out.println("Couldn't find class " + displayerClass);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public MessageSupplier makeSupplier() {
String supplierClass = props.getProperty("supplier.class");
try {
return (MessageSupplier)Class.forName(supplierClass).newInstance();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
}
msgbean.properties
displayer.class=tutorial.spring.impl.ConcreteMessageDisplayer
##################
###################
supplier.class=tutorial.spring.impl.HelloWorldMessageSupplier
通过类反射Class.forName()机制,由外部属性文件来读入实现类的全限定名,并产生各自的实例。
主程序类:
package tutorial.spring;
public class HelloWorldBetterWithFactoryUsage {
public static void main(String[] args) {
MessageDisplayer msgDisplayer =
MessageSupportFactory.getInstance().makeDisplayer();
MessageSupplier msgSupplier =
MessageSupportFactory.getInstance().makeSupplier();
msgDisplayer.setMessageSupplier(msgSupplier);
msgDisplayer.display();
}
}
使用Spring对程序进行重构
package tutorial.spring;
import java.io.FileInputStream;
import java.util.Properties;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
public class HelloWorldWithSpringUsage {
public static void main(String[] args) throws Exception {
BeanFactory factory = getBeanFactory();
MessageDisplayer displayer =
(MessageDisplayer) factory.getBean("displayer");
MessageSupplier supplier =
(MessageSupplier) factory.getBean("supplier");
displayer.setMessageSupplier(supplier);
displayer.display();
}
private static BeanFactory getBeanFactory() throws Exception {
DefaultListableBeanFactory factory =
new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader rdr =
new PropertiesBeanDefinitionReader(factory);
Properties props = new Properties();
props.load(new FileInputStream("src/msgbean.properties"));
rdr.registerBeanDefinitions(props);
return factory;
}
}
msgbean.properties文件同上。
使用Spring之后,可以从程序中抛弃MessageSupportFactory,转而直接使用Spring框架自带的工厂类,省去的异常处理由Spring代为处理。遗憾的是仍要手动将MessageSupplier的实现注入MessageDisplayer中。
实现依赖注入
package tutorial.spring;
import java.io.FileInputStream;
import java.util.Properties;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
public class HelloWorldWithSpringUsage {
public static void main(String[] args) throws Exception {
BeanFactory factory = getBeanFactory();
MessageDisplayer displayer =
(MessageDisplayer) factory.getBean("displayer");
// MessageSupplier supplier =
// (MessageSupplier) factory.getBean("supplier");
//
// displayer.setMessageSupplier(supplier);
//
displayer.display();
}
private static BeanFactory getBeanFactory() throws Exception {
DefaultListableBeanFactory factory =
new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader rdr =
new PropertiesBeanDefinitionReader(factory);
Properties props = new Properties();
props.load(new FileInputStream("src/msgbean.properties"));
rdr.registerBeanDefinitions(props);
return factory;
}
}
msgbean.properties如下:
displayer.class=tutorial.spring.impl.ConcreteMessageDisplayer
##################
displayer.messageSupplier(ref)=supplier
###################
supplier.class=tutorial.spring.impl.HelloWorldMessageSupplier
(ref)关键字意思是该属性的值将引用另外一个Bean的标示key的值。相比以前代码,在主程序中去除了任何组件依赖相关的代码了。不过这种直接使用Spring框架Api读取属性文件的方式通常在真实情况下不常使用。
Web程序
代码在附件中
- 大小: 14.6 KB
分享到:
相关推荐
初学者通过“初识Spring框架-资料.rar”这个压缩包,可以系统地了解和学习Spring的基本概念、核心特性以及在实际开发中的应用。 1. **Spring概述**: Spring最初由Rod Johnson创建,旨在解决企业应用开发的复杂性...
### 初识 Spring Security #### 一、Spring Security 概述 **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架...
本资源是一篇关于学习和应用SSM框架(Spring、SpringMVC、MyBatis)的学习记录系列文章中的第六天内容,主题为初识Spring框架。 在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring ...
读书笔记:Spring Boot 实战1初识Spring Boot
总结_初识Spring Boot(填空版).xmind
SpringCloud 核心技术初识微服务解决方案 SpringCloud 是一个基于 Java 语言的微服务架构解决方案,由 Netflix 公司开发,旨在帮助开发者快速构建可靠的微服务系统。 SpringCloud 的核心技术包括服务注册、服务...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)架构的 Web 应用程序。本篇文章将深入探讨 Spring MVC 的核心概念、工作原理以及...
【Spring的基本应用】是Java EE企业级应用开发中不可或缺的一部分,尤其在Spring+Spring MVC+MyBatis的组合中,Spring作为基础框架扮演着至关重要的角色。本章内容主要涵盖Spring的核心容器、依赖注入以及Spring的...
在Java开发领域,Spring框架是不可或缺的一部分,尤其对于企业级应用开发来说,Spring扮演着至关重要的角色。本文将深入探讨Spring框架的核心概念,包括它的系统架构以及如何通过IOC(Inversion of Control)和DI...
《初识Spring 5:从新手到专家》是一本针对Java开发者深入了解和学习Spring框架的指南。Spring作为Java企业级应用开发的主流框架,它的第五个主要版本带来了许多改进和新特性,旨在提升开发效率和应用程序的灵活性。...
01.初识 Spring Security 02.Spring Security 初体验 03.基于内存定义 Spring Security 用户 04.Spring Security 自定义表单登录 05.Spring Security 登录表单配置细节 06.Spring Security 表单登录源码 07.Spring ...
综上所述,《跟我学Spring3》PDF文档是一个宝贵的学习资源,无论你是初识Spring,还是希望深入理解其精髓,都能从中受益。通过阅读这两部分PDF(跟我学spring3(8-13).pdf和跟我学spring3(1-7).pdf),你将能够逐步...
第一天:初识Spring Cloud 1. Spring Cloud概述:了解Spring Cloud的发展背景,理解其在微服务架构中的地位和作用。 2. Eureka服务注册与发现:学习如何使用Eureka实现服务的注册与发现,理解服务注册与发现的重要性...
IOC-InversionofControl,译为控制反转,是一种遵循依赖倒置原则的代码设计思想。所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的...