作者:~小明学编程

文章专栏:Spring框架

格言:热爱编程的,终将被编程所厚爱。

目录

什么是spring

什么是IOC

传统开发

IOC

DI

spring的创建使用

pom.xml

spring.xml

取出bean对象

ApplicationContext

BeanFactory

ApplicationContext 和 BeanFactory 的区别


今天开始给大家带来一些关于spring框架的知识,这里要迎接我的新篇章了。

什么是spring

Spring 是指 SpringFramework,就是 Spring 框架,可以让 Java企业级 的应用程序开发起来更简单。有一句话概括起来就是:Spring 是包含了众多工具方法的 IoC 容器。容器就是容纳某种物品的装置。像 List/Map 就是数据存储的容器。Tomcat 就是 web容器。

什么是IOC

前面我们了解了spring就是包含众多工具的Ioc容器那么什么是IOC呢?

IoC 就是 Inversion of Control ,就是 “控制反转” 。控制反转 是两个词:控制+反转。指的是:之前程序的控制权限是在我们自己手上,现在,我们把这个控制权交出去了。

传统开发

下面通过一个例子来给大家说说什么是控制反转:

就拿我们造车来说:我们想要一辆车就必须得有车身,然后车身的大小需要依赖我们车地盘的大小,最后车地盘的大小可能要取决于轮胎的大小。

如果我们用代码来表示的话就是下面这样子:

public class NewCar {public static void main(String[] args) {Car car = new Car();car.init();}/*** 汽车对象*/static class Car {public void init() {// 依赖车身Framework framework = new Framework();framework.init();}}/*** 车身类*/static class Framework {public void init() {// 依赖底盘Bottom bottom = new Bottom();bottom.init();}}/*** 底盘类*/static class Bottom {public void init() {// 依赖轮胎Tire tire = new Tire();tire.init();}}/*** 轮胎类*/static class Tire {// 尺寸private int size = 30;public void init() {System.out.println("轮胎尺寸:" + size);}}
}

其关系就是上层的对象需要new一个下层的对象,这个时候就会产生一个问题,如果我们的轮胎想要增加属性的话就需要更改我们的每一个类,这样的话代码的耦合性就太高了,我们需要的是一个低耦合的代码,所以这个时候我们就可以将控制权给反转过来。由原先的车需要车身,车身需要车地盘,车底盘需要车轮胎最后变成把车轮胎给车地盘,再将车地盘交给车身,最后将车身交给车。

IOC

这么一来的话我们想要改变轮胎的话那就直接改变然后交给车地盘就好了。

代码如下:

public class NewCar {public static void main(String[] args) {Tire tire = new Tire(50, "红色");Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.run();}static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void run() {framework.init();}}static class Framework {private Bottom bottom;public Framework(Bottom bottom) {this.bottom = bottom;}public void init() {bottom.init();}}static class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire = tire;}public void init() {tire.init();}}static class Tire {private int size;private String color;public Tire(int size, String color) {this.size = size;this.color = color;}public void init() {System.out.println("轮胎:" + size + " | 颜色:" + color);}}
}

这样我们就理解了我们为什么需要ioc的容器了,因为我们需要将我们的类给放在一个特定的容器中然后再给取出来。

DI

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。

spring的创建使用

创建spring项目的时候我们需要去引入相关的依赖,然后我们才能够去使用。

pom.xml

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency></dependencies>

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.beans.UserBean"></bean><bean id="user1" class="com.beans.User"></bean>
</beans>

因为我们的bean对象要放在spring中所以这里要创建一个beans来存放我们bean对象,其中的id和class类似于一种键值对的关系。

可以看到这里我们就相当于把我们的对象放在了spring容器中去了,在我们放完之后接下来就是要想办法将我们的对象从容器中给取出来了。

取出bean对象

ApplicationContext

public static void main(String[] args) {//1.得到spring上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");//2.根据上下文提供的方法获取到bean
//        UserBean userBean = (UserBean) context.getBean("user");
//        UserBean userBean = context.getBean(UserBean.class);UserBean userBean = context.getBean("user",UserBean.class);//3.使用userBean.print();}

首先我们会获取一个上下文的对象,这也是我们前面所创建的资源里面的文件名,接下来就是获取里面的bean对象了,我们有三种方式,第一种是给一个user也就是我们的key值,当时这种方式需要我们的强制类型转换。第二种是直接输入我们的类对象,这种方式虽然不用进行强制类型的转换但是当我们注入多个对象的时候会报错。第三种方式是我们最常用的方法也是最安全的。

BeanFactory

通过BeanFactory也可以获取我们的上下文的依对象

public static void main1(String[] args) {//1.得到spring上下文对象BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring.xml"));//根据上下文提供的方法获取到beanUserBean userBean = (UserBean) context.getBean("user");//3.使用userBean.print();}

ApplicationContext 和 BeanFactory 的区别

相同点:都实现了从容器中获取 Bean,都提供了 getBean 方法。
不同点:
a)ApplicationContext 属于 BeanFactory 的子类。
b)BeanFactory 只提供了基础访问 Bean 的方法。而 ApplicationContext 除了拥有 BeanFactory 的所有功能之外,还提供了更多的方法实现,比如对国际化的支持,资源访问的支持,以及事件和传播等方面的支持。
c)从性能方面来说二者是不同的,BeanFactory 是按需加载 Bean,而 ApplicationContext 就是全部加载,以备之后使用。对于用户来说肯定是想要第二种这样可以节约时间的开销嘛。

认识Spring(上)相关推荐

  1. java spring上传_SpringMVC上传文件的三种方式

    直接上代码吧,大伙一看便知 前台: pageEncoding="utf-8"%> Insert title here 采用流的方式上传文件 采用multipart提供的fil ...

  2. Spring上传时报Invalid CSRF Token错误解决方案

    概述 使用spring security之后,默认上传文件会报这个错,解决方案有下面两个: 解决方案一: 将 MultipartFilter 放在 springSecurityFilterChain ...

  3. spring上传文件

    @ResponseBody@RequestMapping(value = "/uploadPhoto", method = RequestMethod.POST)public Ap ...

  4. Spring 上传文件(apk格式)

    1.前台页面(样式基于layui) <div class="layui-row"><div class="layui-col-md4 layui-col ...

  5. Spring Boot(十七):使用Spring Boot上传文件

    Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...

  6. (转)Spring Boot(十七):使用 Spring Boot 上传文件

    http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html 上传文件是互联网中常常应用的场景之一,最典型的情 ...

  7. spring整合mybatis(入门级简单教程2)

    1.这几天在网上查找spring和mybatis的整合的博客以及相关的资料,弄来弄去,程序还是跑不起来.今天早上突然意识到,什么事都是从零开始的,所以,我就改变了我的整合思路:首先,先在spring上 ...

  8. 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)

    一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...

  9. Spring、SpringMVC、SpringBoot、SpringCloud的联系和区别

    一. 上一篇文章刚刚简单介绍了spring框架,下面我将介绍一下Spring,SpringMVC,SpringBoot,SpringCloud的联系和区别. 首先先简单介绍一下各个框架. Spring ...

  10. 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...

    近期搜刮了一些Spring全家桶系列的思维脑图.经典面试题和进阶学习的PDF笔记(非常nice),Spring+SpringCloud+SpringMVC+SpringBoot,一个都没落下全都有!一 ...

最新文章

  1. 深圳有哪些牛批的互联网公司?
  2. W ndoWs7更新怎么关闭,怎么样取消windows7自动更新
  3. ADO.NET编程小错误
  4. 简化PHP开发的10个工具
  5. r语言逻辑向量相加_R语言基础教程——第3章:数据结构——向量
  6. php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析
  7. 从崩溃的选课系统,论为什么更安全的 HTTPS 协议没有被全面采用
  8. linux如何打开url,用于打开URL的命令?
  9. 编程精华资源(ITeye优秀专栏)大汇总
  10. Android studio开发Android图灵智能聊天机器人,课程设计报告
  11. beatedit不能导入音乐/不能加节拍
  12. php项目部署到服务器
  13. ZCMU暑期训练四-G - Alex and a Rhombus
  14. nginx配置访问白名单
  15. Git提交报错git-upload-pack
  16. 形式化语言——时序逻辑
  17. android与ios系统优缺点,安卓系统与苹果iOS系统的差别,谁更好用?为什么系统会卡顿?...
  18. 利用API读取日文输入方法表(Romaji-Kana conversion table)
  19. 使用再生龙制作linux系统镜像及还原,再生龙软件备份和还原linux系统
  20. 如何看待996现象,996工作模式是种什么样的体验?

热门文章

  1. 送程序员男朋友的生日礼物——3天速成简易C++程序
  2. 2017年7月17日 星期一 --出埃及记 Exodus 28:8
  3. 有趣的物联网项目合集
  4. 计算10000以内的平方数
  5. 1.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  6. Template 基础篇-函数模板
  7. vs code-live server-保存文件后浏览器自动刷新页面
  8. NO.58 歌华宽带电脑直连没问题,过路由就不行的解决方案
  9. 阿里云+后厂理工学院双认证,架构师年薪达不到25.6万全额退款
  10. macOS安装wireguard