一、概念
在向读者描述Spring时,笔者不打算从某处粘贴一段常见的概念性文字糊弄完本专栏的第一篇文章,而是用易于理解的话向读者指出几个重点。
(1)是框架。何谓框架?就像搭房子一样,框架就如同是墙体结构,房地产开发商将墙体结构给客户搭建好了,至于细节的装修,比如刷什么颜色的漆,选用什么样的家具、什么颜色的灯光等等这些都将交由客户自己完成。Spring类似于此,它简化了Java程序员“搭建一套房子”的工作。Java程序员只需要引入这样一个框架,然后做一些“装修”的工作,就能快速地对外提供服务了。至此,我们再次阅读Spring官网的第一段话,是不是更能明白Spring框架出现的意义呢?一句话总结:简化了应用开发。
(2)Spring的优势是?我们在此仅仅先用一句话分别介绍几个优势,要深刻地理解,还需要后续持续的学习。
1、解耦:IoC通过依赖注入等方式,将对象的依赖关系从硬编码中解耦出来,降低了代码的耦合度,使得代码更加灵活和可维护。IoC,Inversion of Control,控制反转。所谓控制,即创建对象的控制权,所谓反转,指过去创建对象的控制是由开发者自己掌握的,现在则交给了Spring框架。
2、AOP:Aspect-Oriented Programming,面向切面编程。弥补了OOP的缺陷。
3、声明式事务:是否还记得我们使用JDBC时如何进行事务控制呢?我们需要通过Connection对象来setAutocommit为false,表示事务打开,再根据执行结果来进行commit或rollback。显然这个操作太繁琐了,那么期待Spring是如何优雅地解决这一问题吧。
4、集成了其它优秀的框架:如SpringMVC,MyBatis等,集成了其它框架的能力会让我们的工作更加省心。
5、降低JavaEE API的使用难度:例如JDBC的使用,我们的通用操作是注册驱动,获取连接,获取执行SQL对象等,执行SQL,处理查询结果等。而在Spring框架中,则集成了许多模板工具,如JDBCTemplate,针对Redis提供了RedisTemplate类。
二、快速使用
既然上面提到Spring框架是如此的便捷,那么我们现在来快速上手一下Spring吧。
(1)引入Spring上下文依赖spring-context,junit用于测试
<!--基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
(2)定义一个类,并提供一个方法
public class HelloWorld {
public void sayHello() {
System.out.println("hello, spring");
}
}
(3)定义配置文件,将第(2)步的类加入到Spring容器中
<?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:将对象交给IOC容器来管理
id:bean的唯一标识,不能重复
class:设置bean对象所对应的类型
-->
<bean id="hello-world" class="com.bylearning.spring.pojo.HelloWorld" />
</beans>
(4)我们在测试类中看看效果
import com.bylearning.spring.pojo.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldTest {
@Test
public void test() {
// 获取IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取IOC容器中的bean
HelloWorld helloworld = (HelloWorld)ioc.getBean("hello-world");
HelloWorld helloworld1 = (HelloWorld)ioc.getBean("hello-world");
System.out.println(helloworld);
System.out.println(helloworld1); // 两个地址相同,验证Spring容器创建对象默认是单例模式
helloworld.sayHello();
}
}
至此,我们就完成了Spring的初探:将对象交给Spring容器来管理,并通过getBean方法向容器索要一个对象。
注意到获取IoC容器时,我们使用了new ClassPathXmlApplication(String xmlFileName)方法,这个方法顾名思义,会读取在类路径下一个xml文件,我们在后面的章节中会更详细地阐述。以及getBean(String beanId)方法,还有通过类获取Bean的方法,我们也在后面介绍。在这里大家仅需快速了解Spring的基本使用即可。
我们多说几句Spring创建对象的逻辑是:Spring框架通过读取xml文件,根据id标识获得了Bean的全限定名,通过反射创建出Bean对象并返回对象。
了解完这些,我们似乎对Spring有了些模糊的认识,接下来让我们走近Spring,首先来了解一下Spring的配置文件。