一、Spring的概述

spring的解释

Spring是分层的JavaSE/EE full-stack 轻量级开源框架,以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)为内核,使用基本的JavaBean来完成工作。

优点

Spring具有简单、可测试和松耦合等特点。Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中。

  1. 非侵入式设计

  2. 方便解耦、简化开发

  3. 支持AOP

  4. 支持声明式事务处理

  5. 方便程序测试

  6. 方便集成各种优秀框架

  7. 降低Java EE API的使用难度

Spring的体系结构

1.Core Container(核心容器)

Beans:提供了BeanFactory,Spring将管理对象称为Bean。

Core:提供了Spring框架的基本组成部分,包括IoC和DI功能。

Context:建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。

SPEL:  Spring3.0后新增的模块,是运行时查询和操作对象图的强大的表达式语言。

2.Data Access/Integration(数据访问/集成)

JDBC:提供了一个JDBC的抽象层,大幅度的减少了在开发过程中对数据库操作的编码。

ORM:对流行的对象关系映射API,包括JPA、JDO和Hibernate提供了集成层支持。

OXM:提供了一个支持对象/ XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBX和XStream。

JMS:指Java消息传递服务,包含使用和产生信息的特性,自4.1版本后支持与Spring-message模块的集成。

Transactions:支持对实现特殊接口以及所有POJO类的编程和声明式的事务管理。

3.Web

WebSocket:Spring4.0以后新增的模块,它提供了WebSocket 和SockJS的实现,以及对STOMP的支持。

Servlet:也称Spring-webmvc模块,包含Spring模型—视图—控制器(MVC)和REST Web Services实现的Web程序

Web:提供了基本的Web开发集成特性,如:多文件上传、使用Servlet监听器来初始化IoC容器以及Web应用上下文。

Portlet:  提供了在portlet环境中使用MVC实现,类似Servlet模块的功能。

4.其他模块

AOP:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。

Aspects:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation:  提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

Messaging:Spring4.0以后新增的模块,它提供了对消息传递体系结构和协议的支持。

Test:提供了对单元测试和集成测试的支持。

Spring的下载及目录结构

Spring开发所需的jar包分为两个部分:Spring框架包和第三方依赖包。

Spring框架包

下载地址:http://repo.spring.io/simple/libs-release-local/org/springframework/spring/4.3.6.RELEASE/

解压目录如下:

docs文件夹中包含API文档和开发规范

libs文件夹中包含JAR包和源码

Schema文件夹中包含开发所需要的schema文件

打开libs目录可以看到60个JAR文件,截取一部分如下:

以.RELEASE.jar结尾的是class文件JAR包

以.RELEASE-javadoc.jar结尾的是API文档压缩包

以.RELEASE-sources.jar结尾的是源文件压缩包

在libs目录中有四个Spring的基础包,分别对应Spring核心容器的四个模块。

spring-core-4.3.6.RELEASE.jar
      包含Spring框架的核心工具类,Spring其它组件都要用到这个包里的类。

spring-beans-4.3.6.RELEASE.jar
      所有应用都要用到的JAR包,它包含访问配置文件、创建和管理Bean以及进行控制反转或者依赖注入操作相关的所有类。

spring-context-4.3.6.RELEASE.jar
      提供了在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持

spring-expression-4.3.6.RELEASE.jar
      定义了Spring的表达式语言。

第三方依赖包

Spring的核心容器还需要依赖commons.logging的JAR包。

下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi

二、Spring的核心容器

Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext。

BeanFactory(了解)

创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));

ApplicationContext

ApplicationContext是BeanFactory的子接口,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接口实例,通常采用两种方法,以如何找到配置文件作为区分点,具体如下:

1.通过ClassPathXmlApplicationContext创建

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

2.通过FileSystemXmlApplicationContext创建

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

在Java项目中,会通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器。而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器来完成。

Web服务器实例化ApplicationContext容器时,通常会使用ContextLoaderListener来实现,此种方式只需要在web.xml中添加如下代码:

<context-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                          classpath:spring/applicationContext.xml
               </param-value>
       </context-param>
       <listener>
               <listener-class>
                         org.springframework.web.context.ContextLoaderListener
               </listener-class>
       </listener>

创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:

Object getBean(String name);
根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。

<T> T getBean(Class<T> requiredType);
根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。

三、控制反转

在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。

实现步骤

1.在Eclipse中,创建一个名为my01的Web项目,将Spring的4个基础包以及commons-logging的JAR包复制到lib目录中,并发布到类路径下。

2.在src目录下,创建一个com.itheima.ioc包,并在包中创建接口UserDao,然后在接口中定义一个say()方法

package com.itheima.ioc;
        public interface UserDao {
       public void say();
        }

3.在com.itheima.ioc包下,创建UserDao接口的实现类UserDaoImpl,该类需要实现接口中的say()方法,并在方法中编写一条输出语句。

package com.itheima.ioc;
        public class UserDaoImpl implements UserDao {
    public void say() {
                         System.out.println("userDao say hello World !");
     }
   }

4.在src目录下,创建Spring的配置文件applicationContext.xml,并在配置文件中创建一个id为userDao的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-4.3.xsd">
             <bean id="userDao" class="com.itheima.ioc.UserDaoImpl" />
       </beans>

5.在com.itheima.ioc包下,创建测试类TestIoC,并在类中编写main()方法。在main()方法中,需要初始化Spring容器,并加载配置文件,然后通过Spring容器获取userDao实例(即Java对象),最后调用实例中的say()方法。

package com.itheima.ioc;
        import org.springframework.context.ApplicationContext;
        import  org.springframework.context.support.ClassPathXmlApplicationContext;
        public class TestIoC {
               public static void main(String[] args) {
            ApplicationContext applicationContext =
                  new ClassPathXmlApplicationContext("applicationContext.xml");
                      UserDao userDao = (UserDao) applicationContext.getBean("userDao");
           userDao.say();
              }
       }

四、依赖注入

DI的全称是Dependency Injection,中文称之为依赖注入。

从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

实现方式

使用setter方法实现依赖注入

在com.itheima.ioc包中,创建接口UserService,在接口中编写一个say()方法。

package com.itheima.ioc;
        public interface UserService {
                 public void say();
        }

在com.itheima.ioc包中,创建UserService接口的实现类UserServiceImpl,在类中声明userDao属性,并添加属性的setter方法。

package com.itheima.ioc;
        public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
             this.userDao = userDao;
    }
    public void say() {
             this.userDao.say();
             System.out.println("userService say hello World !");
    }
         }

在配置文件applicationContext.xml中,创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao的实例注入到userService中。

<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
                 <property name="userDao" ref="userDao" />
        </bean>

在com.itheima.ioc包中,创建测试类TestDI,来对程序进行测试。

package com.itheima.ioc;
        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;
        public class TestDI {
    public static void main(String[] args) {
            ApplicationContext applicationContext =
                        new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService =
                                         (UserService) applicationContext.getBean("userService");
            userService.say();
    }
        }

Spring的基本应用相关推荐

  1. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  2. html+spring boot简单的ajax数据传输实现

    本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...

  3. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  4. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  5. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  6. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  7. Strutsw2与Spring整合流程-简述

    1.      新建WEB工程: 2.      导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3.     ...

  8. spring Bean自动装配

    spring Bean自动装配 自动装配是使用spring满足bean依赖的一种方式. spring会在应用上下文中为某个bean寻找其依赖的bean. spring自动装配需要从两个角度来实现,或者 ...

  9. spring IOC创建对象方式

    spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...

  10. 第一个spring程序

    第一个spring程序: 第一步:导入jar包. 新建maven项目: <dependency><groupId>org.springframework</groupId ...

最新文章

  1. 一个简洁OKR是成功的关键因素
  2. Oracle 12c 简单的jdbc使用
  3. ubuntu开启客户端nfs服务_linux系统文件服务
  4. Linux 下 GitLab 安装教程
  5. codeforces 1040a (回文数的舞蹈)
  6. 移动app显示远程服务器错误,KIS移动应用常见问题汇总
  7. ng-repeat循环出来的部分调用同一个函数并且实现每个模块之间不能相互干扰
  8. 为啥JS/TS里都会有“use strict“
  9. 【JVM】第二章 JVM类加载、JVM对象
  10. HashMap转JavaBean
  11. MySQL表名后接t_mysql表名忽略大小写
  12. php 获取当前action,ThinkPHP3.2.2获取当前Action名称
  13. “网页上有错误”的解决方法
  14. euraka有哪些组件_SpringCloud及其五大常用组件之Eureka和Zuul
  15. 【软件工程】软件需求说明书、概要设计说明书、详细设计说明书参考模板
  16. selenium借助pywinauto工具上传附件
  17. 流星滑落-第13届蓝桥杯Scratch省赛1真题第2题
  18. Window: 换了固态硬盘装好系统后,为什么一直无法进入系统呢
  19. c语言数组124048,根据GPS经纬度判断当前所属的市区
  20. 趋势交易中区间跨度的定义

热门文章

  1. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
  2. 【Flink】改进的BLOB存储架构
  3. 【算法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  4. 【jvm】jvisualvm 离线下载安装插件
  5. 95-36-220-ChannelHandler-RejectedExecutionHandlers
  6. 【clickhouse】clickhouse kafka 引擎常见问题
  7. 【MySQL】MySQL数据库SQL优化工具 SQL Tuning Expert for MySQL(收费)
  8. 【flink】95-260-045-源码-检查点-CheckPoint
  9. 95-290-060-源码-内存管理-HeapMemorySegment
  10. 大数据面试-04-大数据工程师面试题