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. hisi出的H264码流结构

    hisi出的H264码流结构: IDR帧结构如下: 开始码 + nalu + I帧    +    开始码 + nalu + SPS    +     开始码 + nalu + PPS    +    ...

  2. onethink权限管理 RBAC

    查看了官网的视频,写的不错. 大致熟悉了流程.这里打算自己动手写一个权限的控制

  3. Linux之文件备份与恢复

    文件备份与恢复 1.dump命令 dump命令用于备份ext2或者ext3文件系统.可将目录或整个文件系统备份至指定的设备,或备份成一个大文件. 语法 dump(选项)(参数) 选项 -0123456 ...

  4. mysql5.7创建账户并授权

    CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost ...

  5. Spring基本使用方法_Bean对象

    Spring基本使用方法_Bean对象 Struts与Hibernate可以做什么事? Struts MVC中控制层解决方案.可以进行请求数据自动封装,类型转换,文件上传,效验..... Hibern ...

  6. 12.TCP的成块数据流

    1.滑动窗口协议             TCP滑动窗口的可视化表示       我们将字节从1到11进行标号,接收方通告的窗口称为提供的窗口,它覆盖了第4字节到第9字节的数据,且通告窗口大小为6.发 ...

  7. iOS 错误之 NSObject 、CGFloat

    需要添加 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h>

  8. shc加密shell脚本

    下载地址:http://www.datsi.fi.upm.es/~frosal/sources/ 安装 .tgz cd shc- mkdir -p /usr/local/man/man1 这步是必须的 ...

  9. 管理维护Replica Sets

    1.读写分离 有一些第三方的工具,提供了一些可以让数据库进行读写分离的工具.我们现在是否有一个疑问,从库要是能进行查询就更好了,这样可以分担主库的大量的查询请求. 1. 先向主库中插入一条测试数据 2 ...

  10. #DP# ----- OpenJudge山区建小学

    没有记性.到DP不得不写博了,三天后又忘的干干净净.DP是啥 :-) 一道久到不能再久的题了. OpenJudge  7624:山区建小学 总时间限制: 1000ms     内存限制: 65536k ...