您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Spring框架是怎么样通过properties来获得对象的?

时间:2019-08-29 17:50:07  来源:  作者:
让我来告诉你Spring框架是怎么样通过properties来获得对象的?

 

欢迎关注头条号:JAVA小野猫

首先我们要知道java获得对象的方式有四种:

1.通过new语句实例化一个对象。

2.通过反射机制创建对象。

3.通过clone()方法创建对象

3.通过反序列化的方式创建对象

在spring框架中,为了减低耦合,可以使用xml,properties加载配置文件,然后通过反射来获得对象,下面来讲一讲通过加载properties的配置文件来获得代理对象

第一步

创建配置文件

accountService=com.itheima.service.impl.AccountServiceImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl

配置文件讲解:

accountService是key,

com.itheima.service.impl.AccountServiceImpl是value,也就是全限定类名(为什么要全限定类名,因为要通过反射来获得对象)

第二步

接下来就是实例化properties对象使用对象的方法load来读取配置文件了

读取完配置文件就会获得全限定类名,有了全限定了类名创建对象就好办了

package com.itheima.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class BeanFactory {
 private static Properties props;
 static {
 InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
 //实例化对象
 props = new Properties();
 try {
 //读取配置文件
 props.load(in);
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 public static Object getBean(String beanName){
 Object bean = null;
 
 //getProperty方法 官方文档解释
 /*
 使用此属性列表中指定的键搜索属性。
 */
 String beanPath = props.getProperty(beanName);
 try {
 //获得对象
 bean = Class.forName(beanPath).newInstance();
 } catch (Exception e) {
 e.printStackTrace();
 }
 //返回对象,谁调用我我返回给谁
 return bean;
 }
}

第三步

改造问题

上述的代码依然存在问题,问题如下所示

 public static void main(String[] args) {
 //IAccountService as = new AccountServiceImpl();
 for(int i=0;i<5;i++){
 IAccountService as = (IAccountService)BeanFactory.getBean("accountService");
 as.saveAccount();
 System.out.println(as);
 }
 }

上述代码中,我让他循环了5次,他输出的结果每一次都不一样,如图所示

让我来告诉你Spring框架是怎么样通过properties来获得对象的?

 

没调用一次,就会产生一个新的对象,这样会造成效率低下的问题

所以我们就来到第四步,看看怎么样来解决这个问题(第四步相当于引出spring容器的概念)

第四步

首先要知道为什么每次调用getBean方法都会创建一个新的对象,原因就是在于这里newInstance()

让我来告诉你Spring框架是怎么样通过properties来获得对象的?

 

解决方案就是,创建完对象就把他用Map存起来,所以static代码块,不仅要获得对象,还要实例化容器Map,还要添加对象到容器里面去。

package com.itheima.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
 private static Properties props;
 private static Map<String,Object> beans;
 static {
 InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
 //实例化对象
 props = new Properties();
 try {
 //读取配置文件
 props.load(in);
 //实例化容器
 beans = new HashMap();
 //查看API文档发现
 //keys()继承自Hashtable<Object,Object>
 //使用keys()可以获取配置文件的所有键
 Enumeration keys = props.keys();
 //遍历枚举
 while(keys.hasMoreElements()){
 String key = keys.nextElement().toString();
 //根据Key获取value
 String beanPath = props.getProperty(key);
 //反射创建对象
 Object value = Class.forName(beanPath).newInstance();
 //把key和value存入map集合
 beans.put(key,value);
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 //对象已经在初始化时就创建了,所以获取对象就没有那么麻烦了
 public static Object getBean(String beanName) {
 return beans.get(beanName);
 }
}

最后一步

现在无论调用多少次getBean,对象都只有一个了,为什么只有一个,因为对象在static代码块初始化时就创建了,而且还添加到了容器中,你通过getBean方法获取就从容器中获取,而不是再次newInstance()获得

让我来告诉你Spring框架是怎么样通过properties来获得对象的?

 

欢迎做Java的朋友们私信我【资料】免费获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。



Tags:Spring框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
最近呀,有小伙伴提出 自己在学习 Spring 的时候,这个源码环境有些搞不定。 那这怎么能行,不能因为这点小困难就让小伙伴放弃呀。这里咱就不在赘述读Spring源码的好处了吧,想干这...【详细内容】
2021-09-14  Tags: Spring框架  点击:(56)  评论:(0)  加入收藏
第一章:认识SpringSpring认识框架spring全家桶: spring ,springmvc,spring boot,spring cloudspring:出现在2002左右,解决企业开发的难度,减轻对项目模块之间的管理。类和类之间的...【详细内容】
2021-06-24  Tags: Spring框架  点击:(123)  评论:(0)  加入收藏
诞生的背景什么背景下诞生了该技术?不论是哪个框架,不会平白无故诞生,不会平白无故地被人所追捧,了解其背景,追根溯源。让我们把时间拨回到2002年,当时JavaEE和EJB正大行其道。Sp...【详细内容】
2021-05-31  Tags: Spring框架  点击:(180)  评论:(0)  加入收藏
译者:littlebrain4solving来源: https://blog.csdn.net/littlebrain4solving/概要说明在此篇文章中,我们根据使用@Async注解进行探索Spring对异步执行的支持。简单的把@Async注...【详细内容】
2021-03-05  Tags: Spring框架  点击:(379)  评论:(0)  加入收藏
在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行调用中,会出现这种循环依赖的现象,假设是两个Bean,当程...【详细内容】
2020-12-14  Tags: Spring框架  点击:(87)  评论:(0)  加入收藏
前言学习过Spring框架的人一定都会听过Spring的IOC(控制反转) 这个概念,对于初学Spring的人来说,总觉得IOC是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spr...【详细内容】
2020-12-03  Tags: Spring框架  点击:(117)  评论:(0)  加入收藏
1、IOC和DIIOC: 控制反转 即控制权的转移,将我们创建对象的方式反转了,以前对象的创建时由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以...【详细内容】
2020-11-03  Tags: Spring框架  点击:(58)  评论:(0)  加入收藏
今天学习内容安排如下: 切面配置的核心三步骤。 传统sprin配置和AspectJ配置都学下,xml和注解都使用下。 同时为了测试,补充说明一下spring的junit集成,几天前没来得及学的知识...【详细内容】
2020-08-19  Tags: Spring框架  点击:(64)  评论:(0)  加入收藏
今天是刘小爱自学Java的第123天。感谢你的观看,谢谢你。 学过很多面向XX编程,比如:面向过程编程,面向对象编程,面向接口编程,现在又是面向切面编程。但是不管如何,说来说去最终都是...【详细内容】
2020-08-15  Tags: Spring框架  点击:(97)  评论:(0)  加入收藏
Spring介绍Spring 是一个开源框架,是一个分层的 JavaEE 一站式框架。所谓一站式框架是指 Spring 有 JavaEE 开发的每一层解决方案。 WEB层:SpringMVC Service层:Spring的Bean管...【详细内容】
2020-03-03  Tags: Spring框架  点击:(68)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条