spring IOC 模拟实现
IOC即inverse of control 控制反转
以前对象之间的引用是通过new来调用实现,有了Spring IOC,我们可以把对象之间的引用交给他来管理,这样就把控制权交给了Spring,所以就叫做控制反转。
Spring IOC的实现用到了设计模式:简单工厂,他也是从简单工厂进化而来的,下面我们看看Spring的IOC是如何进化来的。
简单工厂模式实现:
package org;
//抽象接口
interface Fruit{
public void eat();
}
//实现类A
class Apple implements Fruit{
public void eat(){
System.out.println("吃苹果。");
}
}
//实现类B
class Orange implements Fruit{
public void eat(){
System.out.println("吃橘子");
}
}
//工厂类
class Factory{
public static Fruit getInstance(String className){
Fruit f=null;
if(className.equals("apple")){
f=new Apple();
}
if(className.endsWith("orange")){
f=new Orange();
}
return f;
}
}
public class FactoryDemo02 {
public static void main(String args[]){
Fruit f=Factory.getInstance("apple");
f.eat();
}
}
package org;//抽象接口interface Fruit{public void eat();}//实现类Aclass Apple implements Fruit{public void eat(){System.out.println("吃苹果。");}}//实现类Bclass Orange implements Fruit{public void eat(){System.out.println("吃橘子");}}//工厂类class Factory{public static Fruit getInstance(String className){Fruit f=null;if(className.equals("apple")){f=new Apple();}if(className.endsWith("orange")){f=new Orange();}return f;}}public class FactoryDemo02 {public static void main(String args[]){Fruit f=Factory.getInstance("apple");f.eat();}}
反射+简单工厂
但是工厂类如果这样写的话,就有一个问题,如果增加了水果,比如香蕉,那么在工厂类里面也要进行相关的修改了,这样不合理,而java的反射机制可以解决这个问题
package org1;interface Fruit {public void eat();}class Apple implements Fruit {public void eat() {System.out.println("吃苹果。");}}class Orange implements Fruit {public void eat() {System.out.println("吃橘子");}}class Factory {public static Fruit getInstance(String className) {Fruit f = null;try {f = (Fruit) Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}public class CopyOfFactoryDemo03 {public static void main(String args[]) {Fruit f = Factory.getInstance("org1.Apple");f.eat();}}
package org3;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Properties;interface Fruit {public void eat();}class Apple implements Fruit {public void eat() {System.out.println("吃苹果。");}}class Orange implements Fruit {public void eat() {System.out.println("吃橘子");}}class Factory {public static Fruit getInstance(String className) {Fruit f = null;try {f = (Fruit) Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}class PropertiesOperate{private Properties pro=null;private File file=new File("d:"+File.separator+"fruit.properties");public PropertiesOperate(){this.pro=new Properties();if(file.exists()){try {pro.loadFromXML(new FileInputStream(file));} catch (Exception e) {e.printStackTrace();}}else{this.save();}}private void save(){this.pro.setProperty("apple","org3.Apple");this.pro.setProperty("orange", "org3.Orange");try {this.pro.storeToXML(new FileOutputStream(this.file),"Fruit");} catch (Exception e) {e.printStackTrace();}}public Properties getProperties(){return this.pro;}}public class CopyOfFactoryDemo04 {public static void main(String args[]) {Properties pro=new PropertiesOperate().getProperties();Fruit f= Factory.getInstance(pro.getProperty("apple"));f.eat();}}
package test2;public class Person {private String name;private int age;private Grade grade;public String getName() {return name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public int getTotleGrade() {return grade.getEnglish()+grade.getMath();}}
package test2;public class Grade {private int math;private int english;public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}}
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"><beans>//很多豆豆<bean id="Person" class="test2.Person">//第一个豆豆,是一个Person类,id名字随便取,还要写上类的全名<property name="name">//下面开始把这个类里面的所有属性列出来,并赋值,至于你说难道一定要赋值吗?我想可以,我刚学,不知道<value>小龙</value>//这里的名字是通过程序里面的set来赋值的,不信你去掉程序里面相关的set,就出错了</property><property name="age"><value>23</value></property><property name="grade">//这里有点特别,这个grade变量是一个对象,和一般的变量要区别对待<ref local="Grade"/>//这里指向了本配置文件里面一个名字叫Grade(即id=Grade)的bean</property></bean><bean id="Grade" class="test2.Grade">//同上<property name="math"><value>99</value></property><property name="english"><value>59</value></property></bean></beans>
package test2;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import test.ExampleBean;public class Test {public static void main(String args[]){Resource input = new ClassPathResource("test2/Bean.xml");//Bean.xml的路径System.out.println("resource is:" + input);BeanFactory factory = new XmlBeanFactory(input);//把input扔到工厂里面去,这个工厂就能为你提供实例了(我也不知道能不能这样说)Person person =(Person) factory.getBean("Person");//你要一个叫Person的东西,那好,工厂就去找“Person"给你Grade grade=(Grade)factory.getBean("Grade");System.out.println("姓名:"+person.getName());//person可以调用里面相关的方法,就相当于new了一个Person一样System.out.println("年龄:"+person.getAge());System.out.println("数学成绩:"+grade.getMath());System.out.println("英语成绩:"+grade.getEnglish());System.out.println("数学,英语总成绩:"+person.getTotleGrade());}}
FileSystemResource --- 从文件系统加载,比如说自己指定配置文件的全路径
InputStreamResource --- 从输入流中加载
ServletContextResource --- 从Servlet 上下文环境中加载
UrlResource --- 从指定的Url加载
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
spring IOC 模拟实现的更多相关文章
- 手动模拟实现Spring IOC功能(基于javaConfig风格)
以下文中spring特指spring frameWork项目,不含其它:如spring cloud等. 作为刚开始研究spring源码的小白,对于spring两大核心功能之一的IOC,虽说大致了解了B ...
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...
- spring ioc aop 原理
spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- Spring IOC(三)依赖注入
本系列目录: Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结 目录 1.AbstractBeanFactory ...
- Spring IOC容器基本原理
2.2.1 IOC容器的概念IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器 ...
- Spring IOC(一)概览
Spring ioc源码解析这一系列文章会比较枯燥,但是只要坚持下去,总会有收获,一回生二回熟,没有第一次,哪有下一次... 本系列目录: Spring IOC(一)概览 Spring IOC(二)容 ...
- springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理
SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...
- spring IOC的实现原理
姓名:陈中娇 班级:软件151 1. IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应 ...
随机推荐
- Spring使用内存数据库
有时候为了做些测试需要创建数据库及相关表,安装MySQL等轻量数据库虽然简单但还是有点麻烦?而且用于自己临时测试的数据库对象一般不会被多次使用,还是浪费?内存数据库结合ORM可以很好解决这个问题. H ...
- cobbler启动问题
[root@localhost ~]# cobblerTraceback (most recent call last): File "/usr/bin/cobbler", lin ...
- Redis学习之路(006)- Redis学习手册(Hashes数据类型)
一.概述: 我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Ag ...
- Ubuntu菜鸟入门(十三)—— 切换软件源
默认中国服务器,我们把它切换成aliyun的. 在设置--软件和更新里--下载自--其他站点--中国--http://mirrors.aliyun.com/ubuntu 先把所有软件源和软件更新到最新 ...
- C#项目中引入app.manifest管理员权限运行
原文地址:https://blog.csdn.net/qq395537505/article/details/51010962 参考UAC:User Account Control 参考IE保护模式: ...
- Git 远程仓库(分布式版本控制系统)
前言 远程仓库是指托管在因特网或其他网络中的你的项目的版本库.你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写. 1.查看远程仓库 如果想查看你已经配置的远程仓库服务器,可以运行 git ...
- GIF Brewery for Mac(录制 Gif 动图工具)安装
1.软件简介 GIF Brewery 一款用于录制 Gif 动图等的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 GIF Brewery for Mac v3.9.5 ltmf ma ...
- Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题
我们自定义popupWindow的时候,一般会设置这些参数 setContentView(contentView); //设置高度为屏幕高度 setWidth(UIUtils.getScreenHei ...
- 一个酷绚的linux 桌面程序 GLX-DOCK (cario-dock)
记录一个酷绚的linux 桌面程序 GLX-DOCK (cario-dock),支持多种风格的桌面主题. http://glx-dock.org/ 优势: 多个workspaces 方便自由切换 ...
- mfc怎么显示jpg png图像
如果是VS2005以上版本可以直接使用MFC自带的CImage类,如果不是可以用网上比较流行的CxImage,或者使用GDI+