`
congpeixue
  • 浏览: 274599 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

初识Spring

阅读更多

我们将从如下程序演进中初识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程序

 

    代码在附件中

  • spring.rar (11.4 KB)
  • 描述: 转换成的Web应用
  • 下载次数: 8
  • 大小: 14.6 KB
0
0
分享到:
评论

相关推荐

    初识Spring框架-资料.rar

    初学者通过“初识Spring框架-资料.rar”这个压缩包,可以系统地了解和学习Spring的基本概念、核心特性以及在实际开发中的应用。 1. **Spring概述**: Spring最初由Rod Johnson创建,旨在解决企业应用开发的复杂性...

    初识 Spring Security - v1.1.pdf

    ### 初识 Spring Security #### 一、Spring Security 概述 **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架...

    SSM框架的学习与应用-Java EE企业级应用开发学习记录-(第六天)初识Spring框架

    本资源是一篇关于学习和应用SSM框架(Spring、SpringMVC、MyBatis)的学习记录系列文章中的第六天内容,主题为初识Spring框架。 在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring ...

    读书笔记:Spring Boot 实战1初识Spring Boot.zip

    读书笔记:Spring Boot 实战1初识Spring Boot

    总结_初识Spring Boot(填空版).xmind

    总结_初识Spring Boot(填空版).xmind

    SpringCloud核心技术-初识SpringCloud微服务解决方案.docx

    SpringCloud 核心技术初识微服务解决方案 SpringCloud 是一个基于 Java 语言的微服务架构解决方案,由 Netflix 公司开发,旨在帮助开发者快速构建可靠的微服务系统。 SpringCloud 的核心技术包括服务注册、服务...

    一、初识 Spring MVC

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)架构的 Web 应用程序。本篇文章将深入探讨 Spring MVC 的核心概念、工作原理以及...

    第1章 初识Spring的基本应用.ppt

    【Spring的基本应用】是Java EE企业级应用开发中不可或缺的一部分,尤其在Spring+Spring MVC+MyBatis的组合中,Spring作为基础框架扮演着至关重要的角色。本章内容主要涵盖Spring的核心容器、依赖注入以及Spring的...

    Java开发学习(一)----初识Spring及其核心概念.doc

    在Java开发领域,Spring框架是不可或缺的一部分,尤其对于企业级应用开发来说,Spring扮演着至关重要的角色。本文将深入探讨Spring框架的核心概念,包括它的系统架构以及如何通过IOC(Inversion of Control)和DI...

    Beginning Spring 5 From Novice to Professional

    《初识Spring 5:从新手到专家》是一本针对Java开发者深入了解和学习Spring框架的指南。Spring作为Java企业级应用开发的主流框架,它的第五个主要版本带来了许多改进和新特性,旨在提升开发效率和应用程序的灵活性。...

    从入门到高级实战-深度探索SpringSecurity安全框架视频.zip

    01.初识 Spring Security 02.Spring Security 初体验 03.基于内存定义 Spring Security 用户 04.Spring Security 自定义表单登录 05.Spring Security 登录表单配置细节 06.Spring Security 表单登录源码 07.Spring ...

    跟我学spring3pdf,高清

    综上所述,《跟我学Spring3》PDF文档是一个宝贵的学习资源,无论你是初识Spring,还是希望深入理解其精髓,都能从中受益。通过阅读这两部分PDF(跟我学spring3(8-13).pdf和跟我学spring3(1-7).pdf),你将能够逐步...

    7天学会spring cloud教程.pdf.zip

    第一天:初识Spring Cloud 1. Spring Cloud概述:了解Spring Cloud的发展背景,理解其在微服务架构中的地位和作用。 2. Eureka服务注册与发现:学习如何使用Eureka实现服务的注册与发现,理解服务注册与发现的重要性...

    初识Spring——Spring核心容器

    IOC-InversionofControl,译为控制反转,是一种遵循依赖倒置原则的代码设计思想。所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的...

Global site tag (gtag.js) - Google Analytics