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. [转]Go语言(golang)开源项目大全

    内容目录 Astronomy 构建工具 缓存 云计算 命令行选项解析器 命令行工具 压缩 配置文件解析器 控制台用户界面 加密 数据处理 数据结构 数据库和存储 开发工具 分布式/网格计算 文档 编辑 ...

  2. 部分网站允许空白referer的防盗链图片的js破解代码

    Reference: http://www.114390.com/article/27125.htm Javascript源码: 复制代码代码如下: function showImg( url ) { ...

  3. IOS开发-OC学习-Info.plist文件解析

    Info.plist文件是新建ios项目完成后自动生成的一个配置文件,在Xcode中如下图: 通过解析可以获得配置的具体细节,解析过程如下: // 定义一个nsstring用来获取Info.plist ...

  4. CocoaPods 更新慢&swift版本适配

    一.更新慢的问题 使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的 ...

  5. java中String相等问题

    java中判断两个字符串是否相等的问题   判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在java中,用的是eq ...

  6. C++中vector 容器的基本操作

    vector是一种简单高效的容器,具有自动内存管理功能.对于大小为n的vector容器,它的元素下标是0~n-1. vector有二个重要方法:     begin(): 返回首元素位置的迭代器.   ...

  7. PHP 中 static 和 self 的区别

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为" ...

  8. 让win7安装时出现版本选项

    win7有几种版本,win7旗舰版包含各大版本,修改一下ISO,让安装时出现版本选项窗口: 1.准备好一个官方win7旗舰版安装包IOS光盘镜像. 2.用UltraISO打开光盘镜像并删除source ...

  9. Android中关闭应用的三种方式

    当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProc ...

  10. NodeMCU之旅(二):断线自动重连,闪烁连接状态

    事件监听器 NodeMCU采用了事件响应的方式.也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用. 注册事件监听器 wif.sta.eventMonReg() 开始监听 wifi ...