【使用SSM框架开发企业级应用】Spring核心概念

Spring核心概念

单词

Inversion倒置

Control控制

Dependency从属

Injection注入

Adpect-oriented面向切面

Programming程序编程

Advice忠告

Aspect方向

Alliance联合

Pointcut切入点

Weaving编制

Signature署名

Expreession表现

Execution执行

 

Spring IoC

Spring IOC简介

beans和context包是IOC容器的基础,BeanFactory 提供的高级配置机制,使得管理各种对象成为可能。 ApplicationContext 是BeanFactory的扩展,功能得到了进一步增强,比如更易 与Spring AOP集成、资源处理(国际化处理)、事件传递及各种不同应用层的context实现 (如针对web应用的WebApplicationContext)。总之,在实际应用更多会选择ApplicationContext,原因是ApplicationContext即继承了BeanFactory的功能,同时又增加的更多支持企业核心内容的支持。

Spring IOC关键概念理解

IOC(Inversion of Control):控制反转,即指获取对象的方式被反转了,我们只需要在applicationContext.xml(Spring的配置文件)文件配置元数据(即指xml)中的bean指定相应class(类)的全路径,Spring中的容器(BeanFactory)会负责类对象的创建、配置和管理这些对象及它们之间的依赖关系,而且这些对象和我们通过new Object()的对象没有区别,这样最终会达到解耦的目的(即减少代码之间的依赖);

Bean:在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。

容器:即指Spring IOC容器,BeanFactory是容器的实际代表者,他负责bean对象的创建,配置和容纳创建的bean描述并且管理bean;Spring为我们提供了许多易用的BeanFactory实现, XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

 所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

 

 

Spring IOC 容器

元数据:我们通常配置的Spring配置xml文件内容,就是元数据;

<?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-2.5.xsd">

  <bean id="..." class="...">

    <!-- collaborators and configuration for this bean go here -->

  </bean>

  <bean id="..." class="...">

    <!-- collaborators and configuration for this bean go here -->

  </bean>

  <!-- more bean definitions go here -->

</beans>

注入依赖:

依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。  Spring的IOC关键配置 1.如何定义(创建)一个bean

Spring IoC容器将管理一个或多个bean,这些bean 将通过配置文件中的bean定义被创建(在XML格式中为<bean/> 元素)。

在容器内部,这些bean定义由BeanDefinition 对象来表示,该定义将包含以下信息:

全限定类名:这通常就是已定义bean的实际实现类。

bean行为的定义,这些定义将决定bean在容器中的行为(作用域、生命周期回调等等)

对其他bean的引用,这些引用bean也可以称之为协作bean(collaborators) 或依赖bean(dependencies).

创建bean实例时的其他配置设置。比如使用bean来定义连接池,可以通过属性或者构 造参数指定连接数,以及连接池大小限制等。

2.bean如何实例化

从本质上来说,bean定义描述了如何创建一个或多个对象实例。当需要的时候, 容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据 使用反射机制来创建(或取得)一个实际的对象。

当采用XML描述配置元数据时,将通过<bean/>元素的 class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的 Class属性)通常是必须的(不过也有两种例外的情形,见 Section 3.2.3.2.3, “使用实例工厂方法实例化”和 Section 3.6, “bean定义的继承”)。class属性主要有两种用途 :在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点类似于 在Java代码中使用new操作符);在极少数情况下,容器将调用 类的静态工厂方法来创建bean实例,class 属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂 方法创建的对象类型是当前class还是其他的class则无关紧要)。 实例化主要有三种方式:用构造器来实例化,使用静态方法实例化,使用实例工厂来实例化;

  1. DI-注入依赖(指的就是对象与对象之间的依赖关系通过配置的方式建立) 通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。DI主要有两种注入方式,即 Setter注入和 构造器注入; 

String AOP

理解面向切面编程

面向切面编程是软件编程思想发展到一定阶段的产物是对面向对象编程的有益补充.AOP一般适用于具有横切逻辑的场合,如访问控制.事务管理.性能检测等。在业务系统中,总有一些散落.渗透到系统各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的横切逻辑也称为切面。面向切面编程,简单的说就是在不改变原程序的基础上为代码段增加新的功能,对代码段进行增强处理。

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性

AOP核心概念

●横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

●切面(aspect)

一个模块化的横切逻辑(或称横切关注点)可能会横切多个对象。类是对物体特征的抽象,切面就是对横切关注点的抽象

●连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

●切入点(pointcut)

对连接点的特征进行描述,可以使用正则表达式,增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。

●通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

●目标对象

被一个或多个切面增强的对象,由AOP框架所创建的对象,实现执行增强处理方法等功能

●织入(weave)

将增强处理连接到应用程序中的类型或对象上的过程

●引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

【说明】切面可以理解为由增强处理和切入点组成,即包含了横切逻辑的定义,面向切面编程主要关心两个问题,即在什么位置,执行什么功能。Spring AOP是负责实施切面的框架,即由SpringAop完成织入工作,advice直译为通知,但是这种叫法并不明确,在此处翻译为:增强处理,更便于理解

使用Spring AOP实现日志输出

准备两个jar包:

1、aopalliance.jar

2、aspectjweaver.jar

 

配置文件中

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/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-4.2.xsd

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

        

        <bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />

        <bean id="helloWorldImpl2" class="com.xrq.aop.HelloWorldImpl2" />

        <bean id="timeHandler" class="com.xrq.aop.TimeHandler" />

        

        <aop:config>

            <aop:aspect id="time" ref="timeHandler">

                <aop:pointcut id="addAllMethod" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />

                <aop:before method="printTime" pointcut-ref="addAllMethod" />

                <aop:after method="printTime" pointcut-ref="addAllMethod" />

            </aop:aspect>

        </aop:config></beans>

Execution 是切入点指示符,他的括号是一个切入点表达式,可以配置需要切入增强处理的方法特征,切入点表达式支持模糊匹配,下面讲解几种常用的模糊匹配

  • Public * addNewUser(entity.User);”*”表示匹配所以类型的返回值。
  • Public void addNewUser(..);”..”表示匹配所有参数个数和类型
  • * com.service.*.*(..);这个表达式匹配com.service包下所有类的所有方法
  • *com.service..*.*(..);这个表达式匹配com.service包及其子包下所有类的所有方法

本章总结

  • Spring是一个轻量级的企业级框架,提供了Ioc容器,AOP实现.DAO/ROM支持.web集成等功能,目标是使现有的java EE 技术更易用,并促进良好的编码习惯
  • 依赖注入让组件之间以配置文件的形式组织在一起,而不是以硬编码的方式耦合在一起.
  • Spring配置文件按是完成组装的主要场所,常用节点包括<bean>及其子节点<property>
  • AOP的目的是从系统中分离出切面,独立于业务逻辑实现,在程序执行时织入程序中运行
  • 面向切面编程主要关心两个问题:在什么位置,执行什么功能
  • 配置AOP主要使用aop命名空间下的元素完成,可以实现定义切入点和织入增强等操作

内容就到这,

我是陈恰恰.77

 

猜你喜欢

转载自blog.csdn.net/qq_41770735/article/details/82854231