写点什么

String 基础整合

作者:秋名山码民
  • 2022 年 5 月 16 日
  • 本文字数:3453 字

    阅读完需:约 11 分钟

string 基础

string 基本概念

string 是一个轻量级的开源框架,提供了以前 EJB 才能提供的企业级服务,为 java 应用程序的开发提供了综合,广泛的基础性支持,帮助开发者解决了开发中基础性的问题,专注于应用程序的开发,降低了开发的复杂性,核心:AOP(面向切面编程)和 IOC(控制反转),框架的核心功能可用于开发任何的 Java 应用程序


优点:


  1. Spring 通过控制反转,实现了面向接口编程,降低系统的耦合性

  2. Spring 容器可以管理所有托管对象的生命周期和维护他们的依赖关系,开发人员可以无须关心对象的创建和维护,专注于程序的开发

  3. Spring 提供面向切片编程,便于将主要逻辑和次要逻辑分开,将通用业务从业务系统中分离开来

  4. 可以只用简单的注解配置完成对数据库事务的处理

  5. Spring 不重复发明轮子,而是提供对各种优秀框架的整合,无缝集成框架,降低开发者使用这些框架的复杂度

  6. 对于 Java EE 开发中难用的 API,都提供了封装,使用这些 API 的难度大大降低

  7. Spring 采用模块化设计,模块之间相互解耦,出核心模块外,开发者可以根据需要选择其他任意模块

  8. Spring 框架的轻量级和非入侵性也具有高度开放性,所以并不强求应用完全依赖于 Spring,开发者可以部分或全部依赖 Spring 框架

  9. Spring 的 DAO 模块提供了一致的异常处理结构层,简化了对数据库的操作

IOC

控制反转(IOC),是面向对象编程中的一种设计原则,用来减少系统之间的耦合度。控制反转指的是将控制权从应用程序转移到框架,在 String 中将控制权转移到 IOC 容器,


public class Car{    private Wheel mWheel = new Wheel();  }
复制代码


引入 IOC 之后,控制权由 Car 对象转移到了 IOC 容器,Wheel 对象由 IOC 容器来创建,


public class Car{    private Wheel mWheel;    @Autowired    public void setWheel(Wheel wheel){        this.mWheel = wheel;    } }
复制代码


Wheel 可以设计成为一个接口,然后在运行的时候指定实现类,当 Wheel 的业务有修改的时候,可以修改关于 Wheel 的配置,而不会影响 Car 的代码


此刻,我也可以看出 IOC 的好处,程序员无需关心对象的的创建和维护它们之间的关系,只要做好相关的配置,IOC 容器就会负责管理,我们只需要关心业务逻辑的实现


面向接口编程:在调用类(类必须要 IOC 容器维护),只需要声明一个接口和变量,IOC 容器将会注入类所需要的实例,业务层和业务系统之间只需要通过接口来向外暴露功能,降低了系统内部的耦合性


采用 IOC 机制,能提高系统的可拓展性,如果程序之间提供可显的调用进行交互作用,将会使得程序之间的连接十分紧密,当其中一方要进行更改的时候,会使得程序进行较大的改动,这往往是我们不愿意看到的例如:


要为一家农户卖水果,假设农户刚开始只卖苹果,那么随着后面的扩展,肯定会有更多的水果涌入,未来随时可能改变水果的类型,例如:香蕉,樱桃等等……,传统的实现方式,会针对水果进行抽象化为一个基类,拓展器子类,苹果和其他水果只需要继承就好


我们来看一下传统书写有哪些缺点首先,这种方法是可以满足当前的设计要求的,但是方法的可拓展性不好,存在不恰当的地方,例如:当农户发现苹果的销量不好的时候,决定卖香蕉,只需要让 banana 继承自 fruit 基类即可,但是,在系统中要修改的地方可不少,Fruit f = new apple ()的地方都要改为 Fruit f = new banana(),这种改动量就非常大了


下面我们主要介绍 Spring 框架中采用的 IOC 后实现的方法,如:


Spring 容器将会根据配置文件来创建调用对象(Sale),同时把被调用的对象(Fruit 的子类)的实例化对象通过构造函数或 set 方法的形式注入调用者对象中


== 具体而言 ==优点:


  1. 通过 IOC 容器,开发任意不需要关注对象是任何被创建的,同时增加新的类也非常方便,需要修改配置文件即可,即实现对象的热插拔

  2. IOC 容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试


缺点:


  1. 对象的创建是通过反射机制实例化出来的,因此对系统的性能会有一定的影响

  2. 创建对象的流程变得比较复杂

AOP

AOP 即是面向切面编程的思想,把功能分为核心业务和周边业务,在添加周边业务的时候要尽量避免影响周边业务功能,例如:增删改查是核心业务功能,查日志,报告是周边业新的日志的时候就应该避免取影响核心的业务功能


==概念==切入点:在哪些类和方法上切入增强/通知:定义在方法执行的时候实际做什么织入:将增强/通知添加到目标类的具体连接点上的过程切面:切面由切点和增强/通知组成,


SpringAOP 是通过代理来实现的,代理模式就是一种设计模式,它提供了对目标对象的额外访问方式,即通过代理对象来间接访问目标对象,这样就可以不修改原来对象的前提下,提供额外的访问方式,拓展目标对象功能,简单来说 AOP 代理模式就是通过一个中间件来访问原目标对象,以达到增强原对象的功能和简化方式 StringAOP 代理的实现方式主要有俩种:


  1. 静态代理静态编译在编译时就已经实现,编译完成后代理类实际上是一个 class 文件

  2. 动态代理在运行 JVM 中动态生成的,即编译完成没有实际的 class 文件,而是在运行动态生成类字节码,并加载到 JVM 中

AOP 注解

String2.0 之后提供了注解配置 AOP 的方式,开启的方式是在 XML 中配置


(1)Before:在目标方法被调用之前做增强处理,@Before 只需要指定切入点表达式即可


(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning 除了指定切入点表达式后,还可以指定一个返回值形参名 returning,代表目标方法的返回值


(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing 除了指定切入点表达式后,还可以指定一个 throwing 的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象


(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After 可以指定一个切入点表达式


(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个 ProceedingJoinPoint

String Bean

Bean 是构成用户应用程序的主干的 Java 对象,由 SpringIOC 容器管理 Bean 是基于用户提供给容器的配置元数据的创建,配置,装配,管理,一个 Spring Bean 的定义包含容器所必须的所有配置元数据,包括如何创建一个 Bean,它的生命周期详细及它的依赖


  • 作用域:

  • Spring 支持 5 种作用域,SingLeton 与 Prototype 是基本作用域,适用于所有 Bean,Singleton 是 Spring 默认作用域。Request,Session,GlobalSession 是 Web 作用域,只有在 Web 应用中使用 Spring 时,这三个作用域才有效。现分别介绍如下

  • Singleton:单例模式,在 SpringIOC 容器中,使用 Singleton 作用域的 Bean 将只有一个实例

  • Prototype:原型模式,每次注入,SpringIOC 容器将创建一个新的实例,即每次 Http 请求将会产生不同的 Bean 实例

  • Request:对应每次 Http 请求,使用 Request 作用域的 Bean 都会创建一个新实例,即每次 Http 请求将产生不同的 Bean 实例

  • Session:对应每次 HttpSession,使用 Session 作用域的 Bean 都会创建一个新的实例

  • Global Session:同一个全局的 HttpSession,只会创建一个新实例,典型情况下,仅在使用 portlet context 的时候有效


比较常用的是<font color = red>Singleton 和 Prototype<font color = black>这俩个作用域,Spring 默认使用 Singleton 作用域,容器会管理 Bean 的整个生命周期。而使用 prototype 作用域时,容器创建实例交给调用组件后,将不再管理维护该实例,使用 Singleton 作为作用域的好吃,是可以节省频繁创建与销毁实例的开销。**注意:**单例情况下,Bean 不是线程安全的


  • 生命周期:

  • SpringBean 的完整生命周期从创建 Spring 容器开始,直到最终 Spring 容器销毁 Bean,这其中包含了一系列关键点,简单概括为以下的步骤:

  • 实例化

  • 属性填充

  • 三种方式初始化

  • 处理 Awar 接口

  • BeanPostProcessor 子接口的处理,如 AutowiredAnnotationBeanPostProcessor 扫描 @autowired 注解,完成自动注入

  • 处理各种后置处理器,在初始化方法后的后置方法中会根据情况包装为代理类,即 AOP

  • 销毁

String 注解

String 常用的注解可以简单分为组件类注解,装配 Bean 注解和配置类注解


**组件类注解:**作用在类或者方法上,用来标识需要的 Java 类,常用的组件类注解由:


  • @Component:用来标记一个普通的SpringBean类


  • @Repository: 用于标记一个 DAO 组件类

  • @Service:用来标记一个业务组件类

  • @Controller:用来标识一个业务类组件


装配 Bean 的注解:@Auto wired 和 @Resource


**配置类的注解:**作用于类和方法上,可以替代 XML 的配置,常用的配置类注解有:


  • @Configuration:注解在类上,声明当前类为配置类

  • @Bean:注解在方法上,声明当前方法的返回值为一个 Bean

  • @ComponentScan:用于 Component 进行扫描

  • WishlyConfiguration:为 @Configuration 与 @ComponentScan 的组合注解,可以替代这俩个注解

发布于: 刚刚阅读数: 5
用户头像

卷不死,就往…… 2021.10.19 加入

2019NOIP退役成员,华为云享专家,阿里云专家博主,csdn博主,努力进行算法分享,有问题欢迎私聊

评论

发布
暂无评论
String基础整合_java_秋名山码民_InfoQ写作社区