反射技术菜鸟从入门到精通(二)

前言

大家好,我是老王,今天继续和大家分享反射技术。

上次我们使用反射封装了对数据库的查询,现在我们继续研究反射的用途——探究Spring的IoC容器。

首先,我们得了解什么是IoC?

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

如果我这么和你讲概念。你可能会很郁闷,因为这很难理解,或者我根本看不懂!

简单来讲,IoC可以帮我们创建对象,而无需你来new它(但不仅仅是这么简单)。

Case2:

首先来看一个创建“车”的工厂:

public interface Car {

    public void run();

}

public class Benz implements Car {

    @Override
    public void run() {
        System.out.println("奔驰在路上疾驰...");
    }

}

public class BMW implements Car {

    @Override
    public void run() {
        System.out.println("宝马在路上疾驰...");
    }

}

public class CarFactory {

    public static Car getInstance(String cartype) {
        Car car = null;
        if ("benz".equals(cartype)) {
            car = new Benz();
        }
        if ("bmw".equals(cartype)) {
            car = new BMW();
        }
        return car;
    }

}

这段代码,缺点很明显。如果我想创建“Audi”车,就需要修改工厂的getInstance方法,接下来我们使用反射对其改进:

public class CarFactory {

    public static Car getInstance(String className) {
        Car car = null;
        try {
            car = (Car) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return car;
    }
}

使用反射机制实现的工厂可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。在src下新建一个名为car.properties的文件,内容如下:

benz=cn.gzsxt.model.Benz
bmw=cn.gzsxt.model.BMW
audi=cn.gzsxt.model.Audi

其实,在Spring中经常使用的是xml文件的配置形式,这里仅做功能展示。

接下来,使用java.util.Properties读取该配置

public class CarFactory {

    private static Properties pro = new Properties();

    static {
        //加载配置文件信息,将配置信息读取到Properties的对象中
        try {
            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties");
            pro.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Car getInstance(String className) {
        Car car = null;
        try {
            car = (Car) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return car;
    }

}

接下来,我们使用Properties对象获取“类名”

public static void main(String[] args) {
    String className = CarFactory.pro.getProperty("benz");
    Car car = CarFactory.getInstance(className);
    System.out.println(car);
}

显示结果为:[email protected]

很明显,我们希望生产“Benz”车,而打印结果也是Benz类的对象!

之后我们无需对代码进行改动,只需要修改配置文件即可!

好了,今天的分享就告一段落了,下期再见~!Bye!

原文地址:https://www.cnblogs.com/laownag/p/10840996.html

时间: 2024-07-31 23:00:55

反射技术菜鸟从入门到精通(二)的相关文章

反射技术菜鸟从入门到精通(一)

前言 俗话说得好:“反射反射,程序员的快乐” .用好反射,可以使你的开发效率事半功倍.反射技术作为Java特性,已经成为框架构建的基础.如果灵活掌握反射,可谓“一步登天”! 什么是反射? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载.操作.使用在编译期并不知道

跨平台开发技术-PhoneGap从入门到精通视频教程

跨平台开发技术-PhoneGap从入门到精通视频教程下载   密码: nir2      联系QQ:1026270010 一.课程背景 在近几年的IT行业发展中,最热.最快的无疑是移动互联网,它是继互联网之后的又一次信息技术革命.移动互联网巨大的市场潜力创造了无限商机,人们纷纷加入其中,各种与之相应的新技术.新应用层出不穷. 移动应用离不开移动终端设备,如PC.手机.平板电脑等.目前,移动应用的开发平台大体分为三个方向,一个是收益稳定的iOS系统,另一个是如日中天的Android系统,还有一个是

iOS开发-UI 从入门到精通(二)

iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI开发我们需要手动管理内存,所以我们要把ARC关掉(Xcode关掉ARC的步骤): (1)打开Xcode选中当前工程: (2)选中Build Settings: (3)在输入框内输入count: (4)选择Objective-C Automatic Reference Counting  将其设置为 

Python基本语法,python入门到精通[二]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现在练习的开发环境是基于windows的,如果有朋友喜欢linux或者mac的话,只要有需求,我后续的可以给出对应的博文介绍,其实也是换汤不换药,没需求我就懒得说了. v写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 v郑重承诺 我承认,现在园子里烂尾的系列博文比比皆是,

2018最新区块链技术,从入门到精通视频教程(比特币基础技术)

2017最新区块链技术,从入门到精通视频教程(视频+源码+工具) 最新整理区块链技术视频包含开发工具,源码,视频教程,从小白到大神,分享给大家学习. 区块链最早是比特币的基础技术,目前世界各地均在研究,可广泛应用于金融等各领域 区块链的基本原理 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录: 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识: 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录. 如果

mybatis从入门到精通(二) 增删查改

mybatis从入门到精通(二) 增删查改 一丶前言 "增删查改"是后台开发的常用操作, 因此, 学习mybatis或者其他orm框架有必要统一学习一下"增删查改". 二丶准备开发环境 使用"mybatis从入门到精通(一) 入门"准备的开发环境 三丶查 -- <select/> UserMapper.java User selectUser(@Param("userId") int userId); UserMa

小梅科普:跨平台开发技术-PhoneGap从入门到精通

一.课程背景 在近几年的IT行业发展中,最热.最快的无疑是移动互联网,它是继互联网之后的又一次信息技术革命.移动互联网巨大的市场潜力创造了无限商机,人们纷纷加入其中,各种与之相应的新技术.新应用层出不穷. 移动应用离不开移动终端设备,如PC.手机.平板电脑等.目前,移动应用的开发平台大体分为三个方向,一个是收益稳定的iOS系统,另一个是如日中天的Android系统,还有一个是蓄势待发的Windows Phone系统.丰富的开发平台增加了开发人员选择的灵活性,但同时也带了一个问题,就是应用平台的兼

跨平台技术:JQueryMobile从入门到精通配项目实战

移动开发现在很热门的,尤其是JQueryMobile方向,很多人想要一个系统性的学习,但是网络里对于这方面的资料并不全面. 我推荐一套系统性学习jquerymobile的课程,并且配套有几个企业实战的项目. 咨询QQ:1609173918 课程大纲 一.理论讲解部分: 第1章:掀起你的盖头来--初识jQuery Mobile 第2章:第一次亲密接触--jQuery Mobile页面结构 第3章:从头到尾的打扮--工具栏与格式化内容 第4章:戒指项链一个不能少--页面常用组件 第5章:满衣柜的漂亮

C语言指针教程----入门到精通&lt;二&gt;

数组与指针: 一: 指针既然可以指向变量,那么必然可以指向一个数组.本节探讨数组与指针的关系.首先读者必须明白,数组名代表数组中首元素的地址. 那么如何表示数组中其他元素的地址以及其他元素本身呢? p+i或a+i就是a[i]的地址:相应的, *(p+i)或*(a+i)就表示的a[i]元素. 已经提到了数组名代表数组首元素地址了,那么所有用数组名做参数的函数都可以改写 成用指针做参数的函数. 二:多维数组的情况. 这里,读者首先有个意识,多维数组每一维也都是一维数组.假设有个二维数组a[3][4]