Spring hello world

什么是Spring

Spring是一个开源的,轻量级Java开发框架; 其核心特性是可以用于开发任何 Java 应用程序,Spring 框架的目标是使 JavaEE应用程序的开发变得更加容易,核心概念是IOC和AOP;这也是学习Spring的重点所在;

Spring不是针对某个具体功能,具体层级的框架; 也就是说以前该有的系统分层,结构,设计模式都不需要改变,而是让Spring加入进来,让开发变得更简单; 记住Spring并不想取代某个已存在的框架,反而可以让各个框架的配合使用难度降低,它就像502胶水,可快速的在系统中集成其他优秀的框架

Spring也因其特性而得名,寓意为JavaEE开发的春天来了

为什么需要Spring

我们经常会看到Spring替代EJB,或Spring与EJB对比等等相关文章,那么两者之间到底有什么关系呢?

之前的课程中我们知道,EJB是JavaEE规范中的一个,主要用于开发分布式应用程序

从概念上来看:

  • Spring是一个框了架,框架是帮你实现了一部分功能的半成品
  • 而EJB是一个规范,用来规范(指导)开发者,如何去实现JavaEE程序

所以这个问题其实是在问Spring(框架)和JavaEE(规范)的对比,而因为两者不是同一种概念,所以无法直接对比,那到底在对比啥? 不能在卖关子了;

问题应该是:使用Spring开发和完全按照JavaEE规范开发应用程序的区别

这个问题应该由Spring的作者Rod Johnson来回答:

#Rod Johnson在2002年编写的《Expert One-to-One J2EE Design and Development》一书,Rod 在本书中对J2EE正统框架臃肿、低效、脱离现实的种种学院派做法提出了质疑,并以此书为指导思想,编写了interface21框架,也就是后来的Spring。

的确推出Spring推出就是民间开发者对官方规范的中不足的地方提出的质疑以及做出的强力回应,在早期阶段,开发者们经历了拥抱到抛弃,从最早的JavaEE这一官方协议推出后,开发者们非常拥戴,毕竟是官方嘛,后来慢慢发现这堆复杂,晦涩,学习成本极高的规范是多么的臃肿不堪,就像你为了打一只小鸟而搬出了战斗机;就在这时候Spring框架应运而生,因其轻量级,使用简单很快受到了大家的喜爱;

好在官方也意识到了问题,于是在EJB3.0做出了大量的改进,并借鉴了Spring中一些非常优秀的特性,但如日中天的Spring好像并没有受到太大的影响,大家一如既往的喜爱Spring;

EJB容器IOC容器

另一方面因为Spring具备ICO容器,可以帮助我们管理Bean,而EJB的需要放在EJB容器中才能使用其提供的功能; EJB主要用于提供分布式能力,而IOC容器是帮助我们更好的解耦

Spring的优点

  • Spring 对JavaEE中的一些API(JDBC、JavaMail、远程调用等),提供了封装,使这些API使用难度降低;
  • 一站式框架,可简单快速的集成其他框架;
  • IOC,利用依赖注入,极大的降低各组件间的耦合,提高整体扩展性;
  • AOP(面向切面)编程的支持,可以方便的对程序进行权限拦截,运行监控等;
  • 声明式事务支持,通过配置就可以完成对事务的管理,无序进行手动编程;
  • 容器化,Spring包含并管理应用对象的配置和生命周期,你可以配置每个bean如何被创建以及bean是一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何相互关联的。

IOC,DI

概念

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

将原本由程序实现的一部分逻辑反过来交给系统来完成就称之为控制反转

其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)通过控制反转,可以说,依赖被注入到对象中。

依赖注入是实现控制反转的一种手段;

为何需要IOC

举个例子:自己搭配组装机,需要考虑各种部件的兼容性,和自己的性能的要求,如CPU,内存,显卡等等;但有了专门的组装机服务器商(IOC容器),你只要告诉他你的基本需求,比如,要一台吃鸡电脑,剩下的就交给服务商去做了;

大多数应用程序,都是有很多不同对象彼此合作来完成业务逻辑,这导致在获取一个合作对象时,必须显示的去new一个对象,这将就导致代码高度耦合并且难以维护和调试。像下面这样

public class Controller {
    @Test
    public void doGet() throws Exception {
        //这里需要依赖Service层
        UserService service = new UserService("参数1","参数2");
    }

当需要更换其他业务逻辑实现类时就不得不修改源代码,并且若Service的实例化需要参数时,Controller层就不得不为其提供必要的参数,这反映了Controller与Service的耦合度是较高的

Spring体系结构

core,提供了框架基础组成部分,包括IoC和DI;

beans,提供了BeanFactory,是工厂模式的实现,提供普通对象和单例对象的获取

context,建立在core和bean的基础上,可将其他库集成到Spring中

SpEL(spring-expression Language)提供了表达式语言支持,其对JSP中的EL进行了扩展

AOP,提供了面向切面编程实现

Aspects 模块提供了与 AspectJ 的集成,是一个功能强大且成熟的AOP框架

Instrumentation 用于代理监控JVM运行的JAVA程序,对字节码修改以实现AOP

Messaging 模块为 STOMP 提供了支持,主要处理来自 WebSocket 客户端的 STOMP 信息

强调:

Spring是模块化的,完全可以根据需要来导入所需模块

使用入门

传统写法

先来看一个不使用Spring时,控制和业务逻辑层交互的案例,控制器:

public class Controller {

    @Test
    public void doGet() throws Exception {
        //这里需要依赖Service层

        //v1 直接写
        //UserService service = new UserService();

        //v2 面向接口 某个实现类
        //UserService service = new UserServiceImpl();
        //要跟换其他实现类时  违反了OCP(开放封闭)原则
        //UserService service = new UserServiceImpl2();

        //v3 为避免修改源代码扩展 加入工厂
        ServiceFactory factory = new ServiceFactory();
        UserService service = factory.getService();

        //调用业务方法
        service.userLogin("jerry","admin");
    }
}

工厂:

public class ServiceFactory {
    public UserService getService() throws Exception {
        //此处id应配置在xml中
        String id = "UserServiceImpl";
        if (id.equals("UserServiceImpl")){
            return new UserServiceImpl();
        }else if(id.equals("UserServiceImpl2")){
            return new UserServiceImpl2();
        }
        throw new Exception("id:"+id + "not register");
    }
}

使用工厂模式可以进一步降低组件间的耦合度,但在完整的系统中有很多组件,需要很多个工厂,使程序变得复杂,臃肿;

Spring将自身设计为一个大型对象工厂,负责管理系统中设计到的所有对象,并利用DI处理对象的依赖关系,当对象A需要对象B时不再自己创建而是从Spring中获取

补充说明:OCP

叫做开放封闭原则,是应用程序开发中应该遵循的一个原则

open:对扩展开放

close:对修改源代码封闭

其目的是要在不修改源代码的情况下对已有功能进行扩展

使用Spring

1.创建Maven项目

2.添加依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.2.RELEASE</version>
</dependency>
<!-- Maven会自动下载所有Spring核心容器和aop的依赖-->

3.创建配置文件

通常名为:applicationContext.xml当然你也可以修改放在resources

<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--使用bean标签,创建Service对象,并交给容器来管理-->
    <bean id="UserService1" class="com.yyh.serviceimpl.UserServiceImpl"/>
    <bean id="UserService2" class="com.yyh.serviceimpl.UserServiceImpl2"/>
</beans>

名称空间声明可到官网查找,或是直接在jar中查找,如:

4.从Spring中获取需要的对象

    @Test
    public void doGetUseSpring() throws Exception {
        //创建应用上下文 指定配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
          //从Spring中获取所需对象
        UserService userService = (UserService)context.getBean("UserService2");
        //调用业务逻辑方法
        userService.userLogin("jerry","admin");
    }

不难看出此时的Spring就是一个对象工厂,但这仅仅Spring的基础功能

IOC容器

容器可以理解为存放对象的地方,当然不仅仅是存储,还有对象的管理,包括-创建-销毁-装配; 这样原本程序要做的事情交给了Spring,所以这属于IOC,称之为IOC容器;

Spring有两个接口ApplicationContext是BeanFactory的子接口。它们都可以作为Spring的容器;

两种容器的区别:

? BeanFactory作为顶级接口主要面向于Spring框架本身,仅提供了基础基本的容器功能如DI

? ApplicationContext,是BeanFactory的子接口,意味着功能比BeanFactory更多,诸如国际化,注解配置,XML配置等等

? BeanFactory采取的懒加载的方式,在获取对象时才会实例化

? ApplicationContext会在工厂初始化时立即实例化对象

? ApplicationContext的两个实现类区别:

  • ClassPath表示从类路径中获取配置文件
  • FileSystem表示从文件系统获取配置文件

原文地址:https://www.cnblogs.com/yangyuanhu/p/12150153.html

时间: 2024-10-13 12:08:09

Spring hello world的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

SSM整合(spring,spirngmvc,mybatis)

整合思路   准备环境:导入jar包(spring mybatis  dbcp连接池  mysql驱动包 log4j) 工程结构: --------------------------- 1.  整合dao mybatis和spring进行整合   applicationContext-dao.xml 配置: 1.数据源 2.SqlSessionFactory 3.mapper扫描器 创建po以及mapper(通过逆向工程,这里不再演示) 针对综合查询mapper,一般情况会有关联查询,建议自定

Spring Boot 热部署

需要在pom.xml文件中加如下代码: 1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 <optional>true</optional> 6 </dependency> 7 </depe

Spring多线程

Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 实例代码: (1)配置类 package com.lwh.highlight_spring4.ch3.taskexecutor; /**

Spring与JavaMail

JavaMail与Spring集成开发 spring框架集成JavaMail的主要包 2.mail.properties mail.smtp.host=smtp.163.com mail.smtp.auth=true mail.username=15511111111 mail.password=123 [email protected] 3.使用spring配置(applicationContext-mail.xml) <?xml version="1.0" encoding=

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Spring rabbitMq 中 correlationId或CorrelationIdString 消费者获取为null的问题

问题 在用Spring boot 的 spring-boot-starter-amqp   快速启动 rabbitMq 是遇到了个坑 消费者端获取不到:correlationId或CorrelationIdString 问题产生的原因 correlationId 的在 spring rabbitmq 2.0 以后 byte方式会被放弃,所以 目前 代码中有些地方没有改过来,应该算一个BUG @SuppressWarnings("deprecation") public class De

Spring框架之Spring AOP

一.基于注解管理的AOP 1.Spring配置文件 <!-- 配置自动扫描包,自动扫描Bean组件,切面类 --> <context:component-scan base-package="com.zhoujian.spring.anno,com.zhoujian.spring.test"> <!-- <context:include-filter type="annotation" expression="org.a

Swagger+ springfox +Spring mvc

简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger 让部署管理和使用功能强大的API从未如此简单.这一次我将从零开始搭建一个工程来演示如何在Spring mvc中整合Swagger生成Restful接口文档. 新建工程 我们新建一个Maven工程,并添加Web Facet,工程结构如下图所

Spring Aware

Spring的依赖注入最大亮点就是你所拥有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器换成别的容器,如GOOGLE Guice,这时Bean之间的耦合度降低. 但是在实际的项目中,你不可避免的要用到Spring容器本身的资源,这时你的Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware.其实Spring Aware本来就是Spring设计用来框架内部使用的,如果使用了Spring Aware,那么你的Bean其实