未来的几周时间,大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族,好多同学还不是很清楚,我先来简单介绍一下吧:
所谓Spring家族,它其实就是一个框架,是基于Servlet再次进行封装的内容。为啥说是再次进行封装呢,就是因为Servlet也是封装的一门用于Web端的技术,他们的基础都是Java。所以说,想要学习Spring,建议大家先去了解一下Java基础语法以及Servlet技术。
通常意义下,我们所说的Spring就是Spring Framework,这是一个开源框架,有着活跃而庞大的社区。为啥说Java的生态很完善,我认为Spring家族就提供了许多保证生态完善的轮子。而Spring框架由于支持广泛的应用场景,使得Java企业级的应用开发变得更简单。
框架为会啥流行呢?或者换句话说,为啥Spring会有这么庞大的用户量?刚开始使用Java解决某一问题时,代码冗杂而功能不全,而使用一些工具方法就可以使得本来繁杂的代码变得简单,而积聚了众多工具方法的组合,就可以称之为框架,既然有了可以使代码变简单的办法,那么就一定会被更多人所用,自然而然也会流行起来。
用一句话来概括Spring框架:Spring是包含了众多工具方法的IoC容器。
IoC的全称是Inverson of Control,译为中文就是控制反转。其内容就是对对象的生命周期进行控制反转,结果就是降低耦合。
举个简单的例子来说吧:在传统开发中,A类引用B类,B类引用C类,C类引用D类,因此在A类中需要new一个B类,B类中需要new一个C类,而C类中需要new一个D类,假如D类的构造方法发生了改变,那么随之而来的就是需要去改变ABC三个类的构造方法;但是在Spring开发中,不需要进行new类,而是直接把需要使用类的对象给传进来,这样当D类发生改变时,并不需要去动其他的类,从而减少了许多不必要的麻烦,降低了类与类之间的耦合度。
DI的全称是Dependency Injection,译为中文就是依赖注入。其内容就是IoC容器在运行期间,动态的将某种依赖关系注入到对象当中。
从客观角度来看,IoC和DI描述的都是同一件事,即通过IoC容器,动态的将某种依赖关系注入到对象当中。不同的则是,IoC是一种思想,是从整体层面解释的概念,而DI则表示的是一种技术,用这种依赖注入的技术来控制对象生命周期的反转。
顾名思义,容器就是用来存放物品的一种装置。在Spring中,容器就是用来存放对象的装置。既然是容器,那么就表明其可以放物品,也可以拿物品。因此学习Spring时最核心的就是学会如何将对象存储到Spring中,如何将对象从Spring中取出来。
明白了Spring核心功能,那么它的好处是啥呢?首先将对象存储到IoC容器中就表示将未来所有可能用到的工具都放入仓库中,啥时候用啥时候取就可以了,而用完再放入容器中即可,非常的简单便捷。而传统的开发中new就相当于每次使用工具的时候,都现场制作一把,然后用完以后,直接废弃,下次再用的时候再制作,非常麻烦,这就是Spring开发和传统开发的区别。
创建一个maven项目
引入Spring-beans(管理对象的模块)和Spring-context(Spring上下文)依赖
org.springframework
spring-context
5.2.3.RELEASE
org.springframework
spring-beans
5.2.3.RELEASE
所谓的Bean对象其实就是Java语言中的一个普通对象。
package org.example;
public class User {
public String sayHi() {
return "hello world";
}
}
在resourse目录添加配置文件spring-config.xml(后缀是xml不可变,但是前缀是可以改变的);xml文件的作用就是告诉Spring框架要存取的对象是啥。
将Bean对象配置到xml文件中。
读对象的话先要得到Spring对象,再从Spring对象中取Bean对象;获取Spring对象可以使用ApplicationContext。
package org.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//1. 先得到Spring对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring对象中得到Bean对象
User user = context.getBean("user", User.class);
//3. 使用Bean对象
System.out.println(user.sayHi());
}
}
对于得到Spring对象来说,有两种方法可以得到。
一种就是使用ApplicationContext,另一种方法就是BeanFactory。
package org.example;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class App {
public static void main(String[] args) {
//1. 先得到Spring对象
BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2. 从Spring对象中取到Bean对象
User user = context.getBean("user", User.class);
//3. 使用Bean对象
System.out.println(user.sayHi());
}
}
ApplicationContext和BeanFactory的异同
相同点:
两者都可以得到Spring对象;
两者都是来自Spring的顶级接口(即可以有很多类来继承他们)。
继承关系,从上图可以看出,ApplicationContext是继承了BeanFactory,也就是说ApplicationContext不仅拥有BeanFactory的基础功能,还在其功能之上加了些许其他功能,例如国际化支持、资源访问以及事件传播等,而BeanFactory则只有最基础访问Bean的能力。
性能,ApplicationContext是一次性加载,即程序运行的时候将Bean对象都给加载出来,因此后续访问Bean的时候就会很快,而BeanFactory则是在使用某个对象的时候才进行加载,所有在执行Bean获取的时候会比较慢。
Spring中取对象的三种方法
//第一种方法,使用Bean名称进行获取
//当xml中没有出现这个Bean名称时,依然进行强转,那么可能会出现错误
User user1 = (User) context.getBean("user");
//第二种方法,使用Bean类型来获取
//当xml中出现两次及以上,即一个Bean对象但是有好几个名字时,也会报错
User user2 = context.getBean(User.class);
//第三种方法,使用Bean名称和类型来获取
User user3 = context.getBean("user", User.class);
了解了Spring是包含了众多工具方法的IoC容器;
了解了IoC、DI以及容器的思想;
了解了Spring的创建和存取。
上述已经实现了Spring的存取,但是实现方法还是比较复杂,接下来会写一篇关于Spring存取更简单的方式,其中涉及到的内容也比较多,例如有配置文件、五大注解、Bean注解以及三大注入等内容。