IoC,控制反转,是spring的核心,通俗点讲就是我们不必再自己去用new创建对象了,通过l配置将类注入到IoC容器中,在启动时,IoC容器去帮我们创建对象,并管理其依赖关系,这种实现方式叫做DI,依赖注入。为什么我们要用IoC去帮我们管理对象呢,因为通常一个业务逻辑都是由多个对象合作完成工作的,如果自己管理的话比较,就要在一个方法中调用多个对象,不好管理,重用性低。

     //使用工厂模式加配置文件的方式模范了一个简易IoC的工作原理 //1.BeanFactory.java  bean工厂,创建对象 //2.PropertiesReader.java 读取配置文件 //3.普通bean类 //4.测试类 
 
 package myIoC;
/**
* 1.读取配置文件接口,有两个实现类,一个用类加载路径读取配置文件,第二个用文件路径读取配置文件
* 2.提供Bean工厂方法
* @author LH-PC
*
*/
public interface ApplicationContext { /**
* bean工厂方法
* @param name
* @return
*/
Object getBean(String name);
Object getBean(String name, String className); }
 package myIoC;

 import java.util.Date;
import java.util.Map; /**
* ApplicationContext实现类之一,类加载读取配置文件
* @author LH-PC
*
*/
public class ClassPathXmlApplicationContext implements ApplicationContext{ private String propertiesName; /**
* 构造方法用于加载配置文件
* @param xml
*/
public ClassPathXmlApplicationContext(String propertiesName){
//初始化属性
this.propertiesName = propertiesName;
} /**
* 通过类加载方式的工厂方法
*/
public Object getBean(String name) {
//读取配置文件
PropertiesReader propertiesReader = new PropertiesReader(propertiesName);
Object object = null;
//创建对象
Map<String, String> map = propertiesReader.getProperties();
try {
System.err.println(new Date() +": " + "BeanFactory开始生产对象...");
object = Class.forName(map.get(name)).newInstance();
System.err.println(new Date() +": " + "生产对象完毕");
} catch (InstantiationException e) {
System.err.println(new Date() +": " + "创建对象异常");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.err.println(new Date() +": " + "IllegalAccessException异常");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println(new Date() +": " + "类加载异常");
e.printStackTrace();
} return object;
} public Object getBean(String name, String className) {
// TODO Auto-generated method stub
return null;
} }
 package myIoC;

 import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; //读取properties文件类
public class PropertiesReader { private Properties pro = null;
private InputStream in = null;
private String propertiesName = null; public PropertiesReader(String propertiesName){
this.propertiesName = propertiesName;
} @SuppressWarnings("rawtypes")
public Map<String,String> getProperties(){
Map<String, String> map = new HashMap<String, String>();
pro = new Properties(); //创建properties对象
try {
System.err.println(new Date() +": " + "开始读取" + propertiesName + "...");
in = PropertiesReader.class.getClassLoader().getResourceAsStream(propertiesName); //通过反射机制读取配置文件
if(in == null){
System.err.println(new Date() +": " + "读取流为空");
}else{
//开始加载文件内容
pro.load(in);
System.err.println(new Date() +": " + propertiesName + "读取成功");
}
Enumeration en = pro.propertyNames(); //迭代器遍历pro
while(en.hasMoreElements()){
String key = (String) en.nextElement(); //遍历key
String value = pro.getProperty(key); //根据key取出value,放进map
map.put(key,value);
}
} catch (IOException e) {
System.err.println(new Date() +": " + "io异常");
e.printStackTrace();
}
finally{
if(in != null){
try {
in.close();//关闭读取流
System.err.println(new Date() +": " + "读取流关闭成功");
} catch (IOException e) {
System.err.println(new Date() +": " + "读取流关闭失败");
e.printStackTrace();
}
}
}
return map;
} public static void main(String[] args) {
PropertiesReader propertiesReader = new PropertiesReader("myIoc/applicationContext.properties");
Map<String, String> map = propertiesReader.getProperties();
System.out.println("ok");
} }
student=myIoC.Student
bean2=test.BeansImpl2
bean3=test.BeansImpl3
 package myIoC;

 /**
* MyIoC测试类
* @author LH-PC
*/
public class IoCTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("myIoc/applicationContext.properties");
Student student = (Student) applicationContext.getBean("student");
student.setSid("15301");
student.setSname("海");
System.out.println(student.getSid());
System.out.println(student.getSname()); } } /**
* 测试实体类
* @author LH-PC
*
*/
class Student {
private String sname;
private String sid; public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public String getSid() {
return sid;
} public void setSid(String sid) {
this.sid = sid;
} }
 

java IoC的更多相关文章

  1. Java Ioc详解和实现

    作者:竹竿 这章我们讲Java Spring的Ioc控制反转, DI依赖注入. 阅读此文之前,必须深入理解Java反射原理. 1. Ioc控制反转 原来类对象实例的创建都是有程序员自己通过new进行的 ...

  2. 深入谈谈 Java IOC 和 DI

    1.前言 不得不说, IOC和DI 在写代码时经常用到.还有个就是在面试时 ,面试官老喜欢问 IOC 和DI是什么的问题,都快被问吐了, 可是,仍然会让许多人说的支支吾吾. 为什么? 第一,因为这个知 ...

  3. java轻量级IOC框架Guice

    Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...

  4. java轻量级IOC框架Guice(转)

    出处:http://www.cnblogs.com/whitewolf/p/4185908.html Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于 ...

  5. [spring入门学习笔记][spring的IoC原理]

    什么叫IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...

  6. 轻量级IOC框架Guice

    java轻量级IOC框架Guice Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用 ...

  7. Spring(2)——Spring IoC 详解

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...

  8. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Unit01: Spring简介 、 Spring容器 、 Spring IOC

    Unit01: Spring简介 . Spring容器 . Spring IOC Spring (1)Spring是什么? Spring是一个开源的用来简化应用开发的框架. (2)Spring的特点? ...

随机推荐

  1. IOS手势识别,捏合,旋转,轻扫等

    ref:http://blog.csdn.net/rechard_chen/article/details/51769972   //点按手势的创建,这里需要实现响应事件的方法 UITapGestur ...

  2. ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏

    我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好.因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用.异步请求的用户体验要比同步请求好,因此一般情 ...

  3. UVa 496 - Simply Subsets

    题目大意:给你两个集合,判断两个集合的关系(不相交.相等.真子集和其他).简单判断就可以了,不过STL的set没有交集.并集等操作有点让人觉得不方便... #include <cstdio> ...

  4. mongodb学习(三) 安装和基本CRUD

    菜鸟啊...先吐槽一下自己 发现mongodb已经升级到2.6标准版了.  服务端最新安装方法: http://www.cnblogs.com/lzrabbit/p/3682510.html 一 准备 ...

  5. python 爬取的数据要如何展现(可视化)?

    我是把数据放在 mongodb ,然后单独一个脚本作分析,导出 json ,用 c3.js 画图,然后随便写个很简单的页面就好了. 展示在这里: http://107.170.207.236/job_ ...

  6. //@sourceURL=filename.js

    在 console 中输入代码的最后一行加上 //@ sourceURL=filename.js, 会在 Scripts 面板中有个叫 filename.js 的文件, 然后他就和外部 js 文件一样 ...

  7. iOS 之 WebView 简单使用

    1. 代理 UIWebViewDelegate 2. 创建 UIWebView myWebView=[[UIWebView alloc] initWithFrame:CGRectMake(, ,sel ...

  8. phpcms推荐位数据库字段详解

  9. --@angularJS--一个简单的UI-Router路由demo

    1.index.html: <!DOCTYPE HTML><html ng-app="routerApp"><head>    <titl ...

  10. 一个简单的Java集合范围过滤的多个方式对比

    在一个项目里面有这么一个技术需求: 1.集合中元素个数,10M 2.根据上限和下限从一个Set中过滤出满足要求的元素集合. 实际这个是个很典型的技术要求, 之前的项目也遇见过,但是因为当时的类库不多, ...