Spring整理一

1、Spring由来

起因是Rod Johnson(作者)无法忍受传统JavaEE的臃肿,他在2002年编著的《Expert one on one J2EE design and development》一书中,对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新。

之后,以他提出的指导思想开发出了一个轻便灵巧,能让人更易于开发的轻量级框架:interface21框架。

2003年和于尔根•霍勒和扬•卡罗弗合伙,框架被重命名为 Spring(春天),意指传统J2EE的“冬天”之后的一个新的开始。

以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了Spring 1.0正式版。

基于Spring框架的优点和开源,Spring逐渐发展壮大,越来越多的人在使用Spring。

2、Spring是什么样

Spring可以看成是一个大工厂,其核心为IoC容器和AOP切面,并且可以支持各种扩展插件。

IoC可以看成整个流水线,它负责生产资源对象(被叫做bean)。AOP可以看成质检员,质检员要每天查看各个流水线或者抽查其中几个流水线,并记录抽查日志等。

而作为一个工厂,肯定想做大做强,他在建设时就考虑到以后可能的扩张,所以他支持吸收各种优秀的设备加入工厂,最终这个工厂可能会发展成一个大型工业园。

3、Spring发展至今具体有什么优点
  • 低侵入式设计,代码污染极低: 它可以使应用程序代码对框架的依赖最小化。Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
  • 方便解耦、简化开发: 将对象的创建和依赖关系的维护工作都交给Spring容器管理,大大的降低了组件之间的耦合性。对Java EE开发中非常难用的一些API(如JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。
  • 支持AOP: 它允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
  • 支持声明式事务处理: 只需要通过配置就可以完成对事物的管理,而无须手动编程。
  • 方便集成各种优秀框架: Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如Struts、Hibernate、MyBatis、Quartz等)的直接支持。
4、Spring的体系结构

现在来看下Spring的整体结构,Spring可以成为企业应用程序的一站式服务点,然而Spring是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入。
1

  • Core Container(核心容器): Spring框架的基石,由以下几模块组成,其中core和beans模块是框架的基础部分:

    • Core 核心模块: 包含框架基本工具类,组建其他模块都要用到这个包里的类,是框架的基本组成部分。提供 IoC 和 DI 功能。
    • Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。Spring 将管理对象称为 Bean。
    • Context 上下文模块: 建立在核心和 Beans 模块的基础之上,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(资源束)、事件传播、资源加载和透明地创建上下文(通过Servelet容器)等功能。Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。ApplicationContext 接口是上下文模块的焦点。
    • SpEL模块(Spring Expression Language): 提供了强大的表达式语言,用于在运行时查询和操作对象图。
  • Data Access/Integration(数据访问/集成): JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service

    • JDBC 模块: 提供了一个 JDBC 的抽象层,他可以消除冗长的JDBC 编码和解析数据厂商特有的错误代码。这个模块包含了Spring对JDBC 数据访问进行封装的所有类。
    • ORM 模块: 对流行的对象关系映射 API的集成,包括 JPA、JDO、Hibernate 和 iBatis 等。通过此模块可以让这些ORM框架和Spring的其它功能整合,比如前面提及的事务管理。
    • OXM 模块: 提供了一个支持 对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
    • JMS 模块: 指 Java 消息服务,包含的功能为生产和消费的信息。从Spring 4.1开始,集成了spring-messaging模块。。
    • Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类和所有的 POJO。 (注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)
  • Web: 简化了处理大部分请求以及将请求参数绑定到域对象的工作。

    • Web 模块: 提供了基本的 Web 开发集成特性和面向Web 的应用上下文,比如多文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与 Web 相关的部分。
    • Servlet模块(Web-MVC) 为web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成。
    • Web-Socket 模块为 WebSocket-based 提供了支持,使得类在spring应用中能够与一个典型的struts web层集成在一起。而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。在spring3.0中已被弃用。
    • Web-Portlet 模块提供了用于Portlet环境的MVC实现,并反映了基于servlet的spring-webmvc模块的功能。
  • 其他:

    • AOP模块:提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。以便处理一些横切性问题,比如日志,权限,数据验证,监控性能等。
    • Aspects模块: 提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
    • Instrumentation模块: 在特定的应用服务器中提供了类工具(class Instrumentation) 的支持和类加载器(classloader)的实现。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和Java类操作了。
    • Messaging 模块: Spring消息模块,其中包含来自Spring集成项目的关键抽象,如Message、MessageChannel、MessageHandler等,可以作为基于消息的应用程序的基础。
    • Test模块: 支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。

上边枯燥的各个模块终于大概了解了下,有一些我们不一定会用到,接下来我们就重点看下一定会用到的模块。

5、重要的IoC

说到Spring,就避免不了IoC(Inversion of Control 控制反转)。

  • IoC是什么?

    • IoC不是技术,而是一种设计思想。在Java中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
    • 我们常说的Spring容器、IoC容器或Bean容器其实就是代指Spring里实现IoC思想的具体实现,我们在这个具体实现里让Spring自己创建管理对象,他就像个大容器,所以才有了这种叫法。
    • IoC:是控制反转思想;IoC容器:负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖;DI:依赖注入是IoC容器的手段:我们把对象交给了IoC容器,这时我们需要这个对象时不用自己new,而是直接找IoC容器,由容器直接给我们。
  • bean是什么?

    • 我们经常说IoC管理bean,其实了解IoC也就差不多知道bean的意思了:在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。
    • bean规范: 必须是一个公共类;所有属性应为private;必须提供默认构造方法;提供getter和setter(注意属性首字母不要大写);实现serializable接口。
  • Spring IoC
    Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext。先看下结构图:
    在这里插入图片描述

    • BeanFactory : 是基础类型的 IoC 容器,仍旧保留在 Spring 中,主要目的是向后兼容已经存在的和那些 Spring 整合在一起的第三方框架。

      • BeanFactory 接口有多个实现类,最常见的是XmlBeanFactory 类。它是根据 XML 配置文件中的定义装配 Bean 的。
      • 现在已经很少使用BeanFactory,但是在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择。
      • XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource(“Beans.xml”));
    • ApplicationContext: 是 BeanFactory 的子接口,也被称为应用上下文。它不仅提供了 BeanFactory 的所有功能,还添加了对国际化、资源访问、事件传播等方面的良好支持。一般情况下,相对于 BeanFactory,会更加乐意使用ApplicationContext 。最常被使用的 ApplicationContext 接口实现:

      • ClassPathXmlApplicationContext: 该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作。
        • ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“applicationContext.xml”);
        • String[] locations = {“bean1.xml”, “bean2.xml”, “bean3.xml”};
          ApplicationContext applicationContext = new ClassPathXmlApplicationContext(locations);
      • FileSystemXmlApplicationContext: 该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作。
        • ApplicationContext applicationContext = new FileSystemXmlApplicationContext(C:/Users/workspace/HelloSpring/src/applicationContext.xml);
      • XmlWebApplicationContext: 从Web系统中的XML文件来载入Bean定义的信息。
        • ServletContext servletContext = request.getSession().getServletContext();
          ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        • 在 Web 项目中,ApplicationContext 容器的实例化工作会交由 Web 服务器完成。需要导入包spring-web,可以让spring随项目创建,随项目关闭,防止创建多个ApplicationContext 。Web 服务器实例化 ApplicationContext 容器通常使用基于 ContextLoaderListener或ContextLoaderServlet 实现的方式,它需要在 web.xml 中添加如下代码:
<!--利用Listener接口来实现-->
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>
<context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:applicationContext</param-value>
</context-param>

<!--利用Servlet接口来实现-->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext</param-value>
</context-param>
<Servlet>
	<servlet-name>context</servlet-name>
	<servlet-class>
		org.springframework.web.context.ContextLoaderServlet
	</servlet-class>
</servlet>
- 如果 Bean 的某一个属性没有注入,
- 使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,
- 而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。
6、简单的Spring项目

在上边我们已经大概了解了Spring IoC,再具体的先看个小例子在说。

创建Java项目,下载Spring的开发包,导入jar包,创建几个类:

地址:https://repo.spring.io/libs-release-local/org/springframework/spring/4.2.4.RELEASE/

在这里插入图片描述1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:beans里的是约束配置(也叫配置头、命名空间),它的作用一是在开发时有关键字提示,另一个重要的是避免同名的冲突。比如: 比如在A.xsd和B.xsd这2个Schema文件中都定义了Employee这个类型的元素。 那么如何区别这2个不用类型相同名字的Employee元素? 答案就是使用命名空间进行区分。起到类似标签库的作用。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    //上面两个是基础IOC的约束,必备
    xmlns:context="http://www.springframework.org/schema/context"
    //上面一个是开启注解管理Bean对象的约束
    xmlns:aop="http://www.springframework.org/schema/aop"
    //上面一个是aop的注解约束
    xmlns:tx="http://www.springframework.org/schema/tx"
    //上面一个是事务的约束
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    //上面两个是基础IOC的约束,必备
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    //上面一个是开启注解管理Bean对象的约束
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    //aop的注解约束
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    //事务的约束
</beans>

更多可以去官网找。
在这里插入图片描述

这时候我们不是通过new创建对象再set进去,而是由 Spring 容器管理实现的。

7、重要的DI(依赖注入)和bean(基于xml装配bean)

说到IoC不能不说依赖注入,在spring这个容器中,管理着一系列的类,但是不能光管理,还要把我需要的对象给我,这时就要用到DI了,它是容器的一个手段。

  • 说之前看下bean和容器加载流程(引用的图):
    在这里插入图片描述
  • 看下bean常用属性:
    在这里插入图片描述

现在我再建个User类配合说明,下边都是set,get:
在这里插入图片描述

依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入:

  • setter 注入: 值类型用value注入 引用类型用ref注入
    在这里插入图片描述
    当你要注入引用类型时,比如User里用到Student,用ref指向引用对象:
    在这里插入图片描述

你也可以用p-namespace方式,首先引入命名空间:
在这里插入图片描述
在这里插入图片描述
SpEL方式: spring Expression Language spring表达式语言:
在这里插入图片描述
有时间在写https://www.cnblogs.com/chinda/p/6490896.html


  • 构造方法注入:跟setter注入不同的是,构造使用的是〈bean〉标签中的〈constructor-arg〉元素。

在这里插入图片描述
在这里插入图片描述
此时就要注意一个问题,假如构造里有多个参怎么办?
一般有两种方法:
一是按照参数顺序在bean中对应;
二是使用 index 属性来显式的指定构造函数参数的索引,最好 使用这个。
另外:如果参是简单类型的可以用type属型指定,也可以组合使用。
例如:
在这里插入图片描述
按顺序写:
在这里插入图片描述
用index指定:
在这里插入图片描述
组合使用:
在这里插入图片描述
注意:多个构造的问题
1、构造参必须类型或者数量不一致;
2、在(Student,Student)和(Student)时会根据注入的数量自动匹配;
3、在(Student)和(StudentA)时会根据引用类型类自动匹配;
4、在(Student,Student)和(Student,StudentA)时会根据引用类型类自动匹配,对于(Student,StudentA)则在xml不用在乎参数顺序,会自动匹配。
5、至于构造里有基本类型参数,请直接使用type指定类型。
6、当使用setter和构造同时对一个属性注入时,值是set注入的, 因为Spring调用一个对象的set方法注入前,这个对象必须先被实例化。所以在"使用set方法注入"的情况下Spring会首先调用对象的构造函数。

  • 其他bean相关:
    • 内部bean:与内部类很类似,本质还是调用set
      在这里插入图片描述
      下边是set方法,然后xml
      在这里插入图片描述

    • bean继承:没错,bean也可以被继承,概念和类类似
      在这里插入图片描述
      此时有两个不相干的类user和student,user里有message1和2,student有message1、2和3,当用parent属性指定父bean时,student里message2会继承user的message2属性值。

    • bean抽象模板:。。。。。。
      在这里插入图片描述
      注意蓝色的部分,此时的bean被定义为抽象,它没有指定类的属性,而应该指定带 true 值的抽象属性,它不能被实例化,因为它是不完整的。
      当一个bean定义是抽象的,那么它仅仅作为一个纯粹的模板 bean 定义来使用,充当子定义的父定义使用。

    • bean实例化或着说创建类

      • 空参数构造器(重要): 其实上边就是,比如下图就是使用Student的默认无参构造函数实例化的。
        1

      • 静态工厂创建(调用静态方法创建): 先创建一个静态工厂类MyBeanFactory,然后bean调用MyBeanFactory类的静态createBean方法创建名为student的对象,放入容器。
        在这里插入图片描述
        2

      • 实例工厂方式实例化:要配置两个bean,首先配置了一个实例工厂 Bean,然后配置了需要实例化的 Bean。
        在这里插入图片描述
        在这里插入图片描述

    • bean作用域:通常情况下对于无会话状态的 Bean(如 DAO 层、Service 层)来说使用singleton作用域比较好,对需要保持会话状态的 Bean(如 Struts2 的 Action 类)应该使用 prototype 作用域。
      在这里插入图片描述
      在这里插入图片描述

    • Bean的生命周期:是一个很复杂的执行过程,在这里只关注创建与销毁。

      • 实现接口: org.springframework.beans.factory提供了两个只有单一方法的接口,用于bean初始和销毁时做些动作。
        在这里插入图片描述
        此时getBean不一样:你需要注册一个在 AbstractApplicationContext 类中声明的关闭 hook 的 registerShutdownHook() 方法。它将确保正常关闭,并且调用相关的 destroy 方法。
        在这里插入图片描述在这里插入图片描述
        运行结果:
        在这里插入图片描述

      • XML 配置:比较灵活省事,在bean里指定,测试方法同上
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        假设你有很多bean要在创建或销毁时做什么,xml提供更方便的配置方法,此时所有的bean都适用:
        在这里插入图片描述

      • @PostConstruct和@PreDestroy注解:使用之前要开启注解扫描,@PostConstruct注释的方法,会在构造方法之后,init方法之前进行调用;@PreDestroy修饰的方法会在destroy()方法之后,在Servlet被彻底卸载之前运行。

      • Bean后置处理器:实现BeanPostProcessor 接口,可以在初始化 bean 的之前和之后实现更复杂的逻辑
        在这里插入图片描述
        在这里插入图片描述
        其余和上边一样配置,运行后:
        在这里插入图片描述

    • bean注入集合等

      • array,list,set相似
        在这里插入图片描述
      • map
        在这里插入图片描述
      • prop
        在这里插入图片描述
      • 注入 null 和空字符串的值
        在这里插入图片描述
    • Beans 自动装配:Spring 容器可以在不使用和 元素的情况下自动装配相互协作的 bean 之间的关系,将一个 Bean 注入其他 Bean 的 Property 中。要使用自动装配,就需要配置 元素的 autowire 属性,autowire 属性有五个值:
      在这里插入图片描述
      在这里插入图片描述
      自动装配的局限
      在这里插入图片描述

下接Spring整理二

空格
  空格

参考:
https://www.w3cschool.cn/wkspring/47o21icw.html
http://c.biancheng.net/view/4242.html
https://blog.csdn.net/itcats_cn/article/details/81479185?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://blog.csdn.net/Song_JiangTao/article/details/82252852

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值