java IoC
IoC,控制反转,是spring的核心,通俗点讲就是我们不必再自己去用new创建对象了,通过l配置将类注入到IoC容器中,在启动时,IoC容器去帮我们创建对象,并管理其依赖关系,这种实现方式叫做DI,依赖注入。为什么我们要用IoC去帮我们管理对象呢,因为通常一个业务逻辑都是由多个对象合作完成工作的,如果自己管理的话比较,就要在一个方法中调用多个对象,不好管理,重用性低。
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的更多相关文章
- Java Ioc详解和实现
作者:竹竿 这章我们讲Java Spring的Ioc控制反转, DI依赖注入. 阅读此文之前,必须深入理解Java反射原理. 1. Ioc控制反转 原来类对象实例的创建都是有程序员自己通过new进行的 ...
- 深入谈谈 Java IOC 和 DI
1.前言 不得不说, IOC和DI 在写代码时经常用到.还有个就是在面试时 ,面试官老喜欢问 IOC 和DI是什么的问题,都快被问吐了, 可是,仍然会让许多人说的支支吾吾. 为什么? 第一,因为这个知 ...
- java轻量级IOC框架Guice
Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...
- java轻量级IOC框架Guice(转)
出处:http://www.cnblogs.com/whitewolf/p/4185908.html Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于 ...
- [spring入门学习笔记][spring的IoC原理]
什么叫IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...
- 轻量级IOC框架Guice
java轻量级IOC框架Guice Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用 ...
- Spring(2)——Spring IoC 详解
Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...
- Java 面试知识点解析(七)——Web篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Unit01: Spring简介 、 Spring容器 、 Spring IOC
Unit01: Spring简介 . Spring容器 . Spring IOC Spring (1)Spring是什么? Spring是一个开源的用来简化应用开发的框架. (2)Spring的特点? ...
随机推荐
- HIDKomponente使用读写Hid设备(转)
源:HIDKomponente使用读写Hid设备一瞥 HIDKomponente 是delphi中使用的第三方Hid控件库,可以检测.控制连接到电脑的Hid设备.一般情况下多为usb设备. HIDKo ...
- Treap初步
模板题 bzoj3224: Tyvj 1728 普通平衡树 #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...
- 怎样编制excel序列目录
怎样编制序列目录 原帖内容:http://www.excelpx.com/forum.php?mod=viewthread&tid=164190&extra=%26page%3D1&a ...
- leetcode day7
这道题弄的心好累.. [Reverse Linked List]206 描述: Reverse a singly linked list. click to show more hints. Hin ...
- argparse 命令含参数模块
argparse是python的一个命令行参数模块,可以解析命令行参数,生成帮助等. 你可以这样使用它: #!/usr/bin/python from argparse import Argument ...
- SVN:cannot map the project with svn provider解决办法
转自:http://www.blogjava.net/jzone/articles/337697.html 首先,叙述一下令人蛋疼的情况,纠结了我几个小时,更新Workspace原有的项目,显示更新成 ...
- 如何解决Ajax跨域问题-1
如何解决Ajax跨域问题 最近在做AJAX调用C的问题,出现跨域问题,学习总结如下: 在做ajax读取数据的时候,经常会遇到ajax需要跨域的问题,但由于浏览器安全方面的限制,XMLHttpReque ...
- iOS 错误 之 Unexpected interface name 'HomeListCell': expected expression
说明:不应该是类HomeListCell:应该是表达式. 出现场景:赋值时,等号右面是个类名,而不是变量名.
- Spring mvc系列一之 Spring mvc简单配置
Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...
- 读【10问PHP程序员】 有感
http://bbs.phpchina.com/thread-174331-1-1.html 看到前人的文章,总结自己的学习心得,颇有感悟,下面是自己的总结,平时就拿出来多问问自己.1.上了十几年的学 ...