Spring的IOC容器为什么用反射而不用new来创建实例?
文章目录
- 1. 什么是反射?
- 2. 反射与new的区别
- 2. IOC为什么要使用 工厂 + 反射 创建对象?
1. 什么是反射?
反射是java的一种特性,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射的四种创建对象方式
以
对象.getClass()
的形式获取对象Person person=new Student(); Class person1 = person.getClass();
通过
Class.forName()
创建反射获取对象Class person2 = Class.forName("com.xuan.反射.Student");
通过
类名.class
创建反射获取对象Class <Student> person3 = Student.class;
通过类加载器获取对象
ClassLoader cl = this.getClass.getClassLoader(); // 使用当前类的ClassLoader Class clazz = cl.loadClass("com.rain.B") // 使用第一步得到的ClassLoader来载入B B b = (B)clazz .newInstance(); // 有B的类得到一个B的实例
2. 反射与new的区别
- 反射和new都是创建对象实例的,但是new对象无法调用该类里面私有
private
的属性,而反射可以调用类中private
的属性! - new属于静态编译。就是在编译的时候把所有的模块都确定,如果有添加或删除某些功能,需要重新编译。但系统不可能一次就把把它设计得很完美,当发现需要更新某些功能时,采用静态编译的话,需要把整个程序重新编译一次才可以实现功能的更新。也就是说,用户需要把以前的软件卸载了,再重新安装才会重新编译!这样的系统耦合严重,难以扩展!
- 反射属于动态编译。在运行时确定类型并创建对象,通过反射指定模板,动态的向模板中传入要实例化的对象。动态编译最大限度发挥了Java的灵活性,体现了多态的应用,有以降低类之间的藕合性。其中
spring
中ioc
的核心就是利用了反射解耦合。 - 反射效率较低,但经过jdk很多版本的优化,效率已经很高了!
2. IOC为什么要使用 工厂 + 反射 创建对象?
Spring中的IoC的实现原理就是工厂模式加反射机制。 如果工厂模式中不使用反射,而使用new创建对象:
//接口 fruitinterface fruit{public abstract void eat();} //实现类 Apple class Apple implements fruit{public void eat(){System.out.println("Apple");}} //实现类 Orange class Orange implements fruit{public void eat(){System.out.println("Orange");}}//构造工厂类//也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了class Factory{public static fruit getInstance(String fruitName){fruit f=null;if("Apple".equals(fruitName)){f=new Apple();}if("Orange".equals(fruitName)){f=new Orange();}return f;}}class hello{public static void main(String[] a){fruit f=Factory.getInstance("Orange");f.eat();}}
上面写法的缺点是当我们再添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改动就会很多。下面用反射机制实现工厂模式:
interface fruit{public abstract void eat();}class Apple implements fruit{public void eat(){System.out.println("Apple");}}class Orange implements fruit{public void eat(){System.out.println("Orange");}}class Factory{public static fruit getInstance(String ClassName){fruit f=null;try{//工厂中使用反射!f=(fruit)Class.forName(ClassName).newInstance();}catch (Exception e) {e.printStackTrace();}return f;}}class hello{public static void main(String[] a){fruit f=Factory.getInstance("Reflect.Apple");if(f!=null){f.eat();}}}
这样使用反射的方式,无论我们创建多少fruit
的实例,都不需要修改反射生成的工厂模板,有效的降低了系统耦合性!
IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
Spring的IOC容器为什么用反射而不用new来创建实例?相关推荐
- 框架:简单实现Spring的IOC容器
学习过Spring的同学都知道,Spring框架的核心就是IoC和AOP.Spring可以理解为一个工厂,负责对象的创建和对象间关系的维护.IoC即控制反转,简单点说就是原来的对象是在要使用之前通过在 ...
- spring的IOC容器
文章目录 1. IOC.IOC容器.Bean.DI 2. 核心概念小结 3,入门案例 3.1 IOC入门案例 3.1.1 入门案例思路分析 3.1.2 入门案例代码实现 步骤1:创建Maven项目 步 ...
- Spring ——Bean(IOC)容器
Spring框架 一.Spring 框架概述 二.IOC 容器:通过容器统一管理对象的生命周期 1.什么是IOC容器? 2.IOC 底层原理 3.IOC 接口(BeanFactory) 三.Bean管 ...
- [Spring 深度解析]第6章 Spring的IoC容器系列
6. Spring的IoC容器系列 IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...
- Spring 的IOC容器系列的设计与实现:BeanFactory 和 ApplicationContext
在Spring IOC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本的功能,另一个是ApplicationContex ...
- 【Spring】IoC容器系列的设计与实现:BeanFactory和ApplicationContext
在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能,另一个是ApplicationContext ...
- 在servlet(或者filter或者listener)中使用spring的IOC容器
web.xml中的加载顺序为:listener >> filter >> servlet >> spring.其中filter的执行顺序是filter- mappi ...
- spring源码分析第三天------spring核心IOC容器和依赖注入原理
基于XML的依赖注入 1.依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC ...
- Spring基于IOC容器基本原理
[b]一.简介[/b] org.springframework.beans及org.springframework.context包 是Spring IoC容器 的基础.BeanFacotry提供的高 ...
最新文章
- qt5 linux 控制台 乱码,qt5.12 解决显示中文乱码问题
- C语言哆啦a梦用printf输出,【2013.1.20】故事的最后,哆啦A梦终于又回到了大雄身边。从此两个人过上了…——ProtoType...
- 如何具备无坚不摧的意志力
- QT读写Sqlite数据库三种方式
- c#中BackGroundWorker控件
- tableview插入刷新_iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码...
- 7-2 数组元素循环右移问题 (40 分)
- CE6870 添加ipv6 策略路由失败问题解决
- 计算机管理禁用usb,电脑如何禁用U盘、怎样禁用USB存储工具,防止USB端口泄密?...
- 网页游戏外挂的设计与编写:QQ摩天大楼【三】(登陆准备-信息发送方式)
- lego-loam在Ubuntu16.04下安装、跑包及实时建图
- CSS-Cascading Style Sheet_层叠样式表_用法详解
- Linux下C++使用Protobuf的安装步骤(vscode)
- 回顾并总结关于复利计算器的三次实验
- Navicat Premium 连接oracle 提示ORA-01017:用户名/口令无效;登陆被拒绝
- CDQ分治(二维CDQ 、三维CDQ+树状数组、四维CDQ+CDQ+树状数组)
- Codeforces Round #777 (Div. 2) ABCD题解
- php安装扩展错误:Cannot find config.m4. Make sure that you run /usr/local/bin/phpize in the top level sourc
- 付宇泽20190912-2 命令行
- 2015年7月30日工作总结
热门文章
- Spring基础——AOP
- oracle查询报错clb,Oracle RAC 负载均衡与故障转移(三)
- 1909升级卡64_升级win10 1909后开机数分钟后出现卡死如何解决
- opencv颜色识别_opencv-python污水颜色识别
- 由降低系统之间的接口维护和升级的成本想到的。。。
- 联合国再请马云出任要职
- 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)...
- JAVA获取服务器路径的方法
- 浅悉软考网络工程师考试出题风格变化
- 使用PSD设计网页页面