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. FastJson的用法

    一.简单数据的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; publi ...

  2. ios-贝塞尔曲线

    git下载地址:git@github.com:lu459700780/UIBezierPath.git 演示: #import "ViewController.h" @interf ...

  3. 非root用户Memcached repcached安装

    安装memcached前先要确定系统是否安装了gcc: 1.解压安装包: tar -zxf memcached-1.2.8-repcached-2.2.tar.gz 2.编译: 系统应安装了libev ...

  4. BZOJ1478 Sgu282 Isomorphism

    Problem A: Sgu282 Isomorphism Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 88[Submit] ...

  5. PHP与MySql建立连接

    通过PHP脚本建立与一个MySQL数据库的连接时,数据库服务器的主机位置(在本地就是localhost).用户名(root).密码.和数据库名是必须的.一旦建立连接,脚本就能执行SQL命令.二者联系的 ...

  6. bzoj1121

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1121 题解: 神题啊,妈的不会写的都去吃屎吧.

  7. Round Numbers(poj 3252)

    题意:算出区间内二进制中0的个数大于等于1的个数的数字有多少个 /* 本来以为用数位DP搞,但是组合数更简单. 我们设n的二进制长度为len. ①:先考虑长度小于len的数字. 这里以数字22为例,二 ...

  8. SVG的text使用

    SVG的text使用: 参考:http://www.docin.com/p-7393979.html <%@ page language="java" contentType ...

  9. 看完让你彻底搞懂Websocket原理

    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗 ...

  10. 在MyEclipse 2014中给Spket增加ExtJS提示

    参考:http://wenku.baidu.com/link?url=BT2U6Z-HktQJQYpz3Jp88pJSp4lU-lXkvCqpdeaa9a-BVdOgMGK1vj486-32YC4Gq ...