一. 什么是Spring
Spring 框架是一个开源的 Java平台,它最初是由 Rod Johnson编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。
轻量级的 Java开发框架,Spring 的核心是控制反转(IoC)和面向切面(AOP)。
简单来说:Spring是一个轻量级的DI/IoC和AOP容器的开源框架,致力于构建轻量级的JavaEE应用,简化应用开发。
Spring 官网:https://spring.io/projects/spring-framework
1、 为什么说Spring是一个一站式的轻量级开源框架呢?
Spring框架的非侵入性,即对象可以不必依赖Spring的API类
其次,JavaEE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。
- WEB层:SpringMVC
- 业务层:Spring的IoC
- 持久层:Spring的JDBCTemplate (Spring的JDBC模板,ORM模板用于整合其他的持久层框架)
Spring提供了JavaEE每一层的解决方案,所以也说Spring是JavaEE的全栈式(full stack)框架。
2.、Spring的优点:
- 方便解耦,简化开发。
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
- AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
- 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
- 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序。
- 方便集成各种优秀的框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2/Hibernate/MyBatis/Quartz等)的直接支持。
- 降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,使这些API应用难度大大降低。
- Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
3、Spring框架的组成结构图:
核心容器
核心容器由 spring-core,spring-beans,spring-context 和 spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:
- spring-core:提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
- spring-beans:提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
- spring-context:模块建立在由core和 beans 模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能
- spring-expression:提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。
二. Spring 入门案例:
1、创建 maven项目,引入依赖
引入Spring的核心jar包外,还要引入 Spring支持的日志Jar包: log4j
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2、创建一个 model 类
public class User {
private int id;
private String username;
private String password;
... getter/setter
}
3、创建 Spring的核心配置文件 applicationContext.xml
核心配置文件的名称和位置没有固定要求,官方建议写成 applicationContext.xml ,放到classpath下。
每个 bean 可定义的属性:
属性 | 描述 |
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。 |
name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。 |
constructor-arg | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
properties | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
autowiring mode | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
<?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">
<!--
id - 自定义给类取一个名字(默认规定) 确保唯一性
class - 对应类名 不能是抽象类或者接口
定义bean时 要保证有一个无参数的构造方法
-->
<bean id="user" class="cn.jq.springdemo.model.User">
<property name="username" value="admin" ></property>
<property name="password" value="admin123" ></property>
</bean>
</beans>
4、测试类
从IoC容器中获取创建好的对象
public static void main(String[] args) {
// 1.初始化ioc容器(装对象的容器)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从容器中获得创建好的对象
User user = context.getBean("user", User.class);
System.out.println(user);
}
------
User [id=0, username=admin, password=null]
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
面向接口编程:返回 ApplicationContext (实际上ApplicationContext是一个接口), 即 Spring 的 IOC容器:
ConfigurableApplicationContext 子接口, 提供了一些方法 close(), refresh(), 可以让 ApplicationContext 刷新和关闭。
从IoC容器中获得创建好的对象,getBean方法的三种方式:
1) 根据bean元素的 id属性获得对象 需要强转类型 , bean的id写错时 会抛出 NoSuchBeanDefinitionException
User user1 = (User) context.getBean("user");
2.)根据bean元素的 class属性获得对象 要确保同一种类型的bean只能配置一个
User user2 = context.getBean(User.class);
3.)根据bean元素的 id+class属性 获得对象 要求id和类型一定要匹配正确(推荐使用)
User user3 = context.getBean("user", User.class);
常见错误:
1)NoSuchBeanDefinitionException:按照 bean名称去获取 bean时,不存在该名称的bean
2)BeanDefinitionParsingException:在 ApplicationContext.xml配置文件中,有多个bean元素的id名称相同
3)NoUniqueBeanDefinitionException:按照 class属性去获取bean时,找到了两个,期望只能是一个
ends ~