spring简介
spring优点:
方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
-
Data Access/Integration(数据访问/集成)
数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。
JDBC 模块:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。
OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Transactions 事务模块:支持编程和声明式事务管理。 -
Web 模块
Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Portlet 组件,具体介绍如下。
Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。 -
Core Container(Spring 的核心容器)
Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。具体介绍如下。
Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。
Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。
Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。
SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。 -
AOP、Aspects、Instrumentation 和 Messaging
在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:
AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。 -
Test 模块
Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
spring的工作方式
Ioc控制反转
IOC,inversion of control :控制反转,指导开发人员如何适用对象,管理对象,把对象的创建,属性赋值,对象的声明周期都交给代码之外的容器管理,
(1)IOC分为控制和反转,
控制:对象创建,属性赋值,对象声明周期管理
反转:把开发人员对象的权限移交给了代码之外的容器实现,由容器完成对象的管理。
正转:使用new的构造方法,由开发人员掌握对象的创建,属性赋值,对象从开始到销毁的全部过程,
通过容器,可以使用容器中的对象,(容器已经创建了对象,对象属性赋值了,对象也组装好了)
spring就是一个容器,可以管理对象,创建对象,给属性赋值,
(2)IoC的技术实现
DI(依赖注入):dependency injection ,程序只需要提供要使用的对象名称就可以了,对象如何创建,如何从容器中查找,获取都是由容器内部自己实现。
依赖名词:比如说class A类使用了class B类的属性或者方法,叫做class A依赖B;
(3)spring框架使用的是DI实现IoC
通过spring框架,只需要提供要使用的对象名词就可以了,从容器中获取名称对应的对象。
spring底层使用的反射机制,通过反射创建对象,和属性。
(4)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">
</beans>
spring标准配置文件:
(1).根标签是beans
(2)后面是约束文件
(3)beans里面是bean声明
(4)什么是bean:bean就是Java对象,spring容器管理的Java对象就叫bean
(5)spring创建对象的特点
(1)容器对象ApplicationContext对象,获取要使用的Java对象,执行getbean(“的id”);
(2)spring默认的是调用类的无参构造方法,创建对象,
(3)spring读取配置文件时,会一次创建后所有声明的Java对象,都放到map中
(6)DI:给属性赋值
spring调用类的无参构造方法,创建对象,对象创建后,给属性赋值,
给属性赋值有
(1)xml配置文件中的标签和属性;
(2)使用注解
DI分类:set注入,也叫设值注入,构造注入
基于xml的DI
在xml配置文件中使用标签属性,完成对象创建,属性赋值
(1)set注入
概念:spring调用类中的set方法,在set方法中完成属性赋值,推荐使用。
<bean id="School" class="com.packe02.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京"/>
</bean>
<!--简单类型的set注入,设置注入-->
<bean id="Student" class="com.packe02.Student">
<property name="name" value="张三"/>
<property name="age" value="15"/>
<!--引用类型的注入方式-->
<property name="school" ref="School"/>
(2)构造注入
构造注入:spring调用有参构造方法,在创建对象的同时给属性赋值
<bean id="Student" class="com.packe03.Student">
<constructor-arg name="name" value="李四" />
<constructor-arg name="age" value="15"/>
<constructor-arg name="school" ref="School"/>
</bean>
<!-- 构造注入,使用index,参数位置,构造方法从左到右-->
<bean id="mystudent" class="com.packe03.Student">
<constructor-arg index="0" value="小黑"/>
<constructor-arg index="1" value="25"/>
<constructor-arg index="2" ref="School"/>
</bean>
(3)引用类型的自动注入
概念:spring可以根据某些规则给引用类型完成赋值,只对引用类型有效,规则byname,bytype,
1.byname:Java类中引用类型属性名称和spring容器中的bean的id名称是一样的,且数据类型也是一样的,这些bean能够赋值给引用类型
2.bytype:Java类中应用类型的数据类型和spring容器中的bean的class值是同源关系,这样的bean赋值给引用类型
<bean id="Student" class="com.packe04.Student" autowire="byName">
<property name="name" value="张三"/>
<property name="age" value="15"/>
</bean>
<!--
引用类型赋值
<property name="school" ref="School"/>
-->
<!--声明school-->
<bean id="school" class="com.packe04.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京"/>
</bean>
<!--bytype注入-->
<bean id="Student" class="com.packe05.Student" autowire="byType">
<property name="name" value="张三"/>
<property name="age" value="15"/>
</bean>
<!--
引用类型赋值
<property name="school" ref="School"/>
-->
<!--声明school,如果父类和子类的bean只能保留一个-->
<!-- <bean id="myschool" class="com.packe05.School">-->
<!-- <property name="name" value="北京大学"/>-->
<!-- <property name="address" value="北京"/>-->
<!-- </bean>
-->
(7)项目中使用多个spring配置文件
分多个配置文件的方式:
1.按功能模块分
2.按类的功能分,数据库相关操作类,service类一个配置文件,配置redis,事物等等一个配置文件,
3.spring管理多个配置文件,常用包含关系的配置文件,使用import标签包含其他的多个配置文件
总的文件下xml
<import resource="classpath:其他文件路径">
关键字"classpath": 类路径表示类文件class文件所在的目录,spring到类路径中加载文件,
(8)基于注解的DI
基于注解的DI
注解使用的核心步骤:
1.在源代码中加入注解,例如@component
2.在spring配置文件中,加入组件扫描器的标签
<!--声明组件扫描器,使用注解必须加入这个语句
component-scan:翻译过来就是组件扫描器,组件是Java对象
属性:basse-package 注解在你的项目中的位置,
框架会扫描这个包和子包中的所有类,找到类中的所有注解,
遇到注解后,按照注解表示的功能,去创建对象,给属性赋值
-->
<context:component-scan base-package="com.packeone"/>
1.创建对象的注解
@component
@respository
@service
@controller
2.简单类型赋值
@value
3.引用类型赋值
@autowired :spring提供的注解,支持byname,bytype,
@autowired:默认bytype
@autowired @Qualifier :使用byname
@resource :来自jdk中的注解,默认是byname,
@resource:先使用byname,再使用bytype
@resource(name=“bean的名称”):只使用byname,
spring创建一个项目(idea maven项目)
学习源码在
链接:https://pan.baidu.com/s/1_dxberXPBQ9TdkO904ZEhw?pwd=yyc2
提取码:yyc2,
免费下载,代码不是特别规范,哈哈哈