有关Spring的一些总结

为什么要用Spring呢

肯定是为了开发方便啊,那是如何让开发变得方便的呢?
Spring提供了一个javaweb开发的基本框架;如早期开发想要获取对象必须调用者自己new对象,当项目变大,组件越来越多,程序规模越来越大,这种方式会让组件之间的耦合度很高,难以维护。而spring的出现就解决了这种问题,调用者不再需要自己去创建对象,将各个组件之间解耦。

Spring的特点

  1. 非侵入式:spring的API不会出现在业务逻辑上,业务逻辑上的代码仍然是最原始的java类,这些代码也可以快速移植到其他框架上。
  2. 容器:spring可以管理对象的生命周期,对象与对象之间的依赖关系。它其实就是一个bean工厂(BeanFactory),应用中bean的实例化,获取,销毁等都由这个工厂管理。这个容器也可以看成是一个MAP,key为bean对象的name或id,value为bean对象,就是你告诉容器需要的bean的名字容器就根据名字给你想要的bean。
  3. IOC:对象不是由调用者本身去创建,而是由spring容器去完成,并注入调用者(DI)。而且依赖注入并不是对象从容器中寻找,而是在对象初始化时spring容器主动将依赖传递给对象,Spring负责把模块依赖的其他模块推送(push)进来,而不是模块自己去拉取(pull),所以是一个"反转(IOC)",进一步简化了大型应用程序开发。
  4. AOP:这是一种编程思想,是对面向对象的一种补充。在早期的业务中有很多可以被多场景重复使用的代码片段,这些片段可以抽取出来当应用场景需要这个代码片段时再织入业务逻辑中;这个代码片段就叫做切面。

为啥叫spring容器

首先Spring容器,其容器不止一种,如ClasspathXmlApplicationContext,XmlWebApplicationContext等多种容器,所有这些容器的父类都是BeanFactory。比容器更适合的名字应该是工厂,因为仅仅作为容器存对象的话,ArrayList,HashSet也可以做到,但是spring的工厂内不仅仅存储对象(bean)还存储着对象的定义(beandefinition)。工厂内可以对bean进行实例化和销毁等操作,而不仅仅是储存对象。如prototype模式的bean,BeanFactory就主要表现为一个工厂了,每次请求都返回一个不同的实例。而大多数singleton模式则更像一个存储Bean的容器。

AOP思想

AOP(Aspect-Oriented Programming), 即面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不同的抽象软件结构的视角。
在OOP中, 我们以类(class)作为我们的基本单元,
在AOP中的基本单元是 Aspect(切面)。

SpringAOP中的动态代理主要两种方式
1.JDK动态代理
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,JDK动态代理的核心是InvocationHandler接口和Proxy类
2.CGLIB动态代理
如果目标没有实现接口,那么SpringAOP会选择使用CGLIB来动态代理目标类,当然Spring也支持配置强制使用CGLIB动态代理
CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它无法使用CGLIB做动态代理

AspectJ

AspectJ就是一种实现AOP思想的技术,就是将外围业务(日志,权限,性能监测、事务控制)以一种特殊的方式自动应用到核心模块中的技术。
AspectJ采用的就是静态织入的方式。AspectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类。
在这里插入图片描述

基于AspectJ的Spring AOP开发

Spring AOP 与ApectJ 的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring AOP 并不尝试提供完整的AOP功能(即使它完全可以实现)。
Spring AOP 更注重的是与Spring IOC容器的结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势,同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代理技术的实现原理来构建Spring AOP的内部机制(动态织入),这是与AspectJ(静态织入)最根本的区别。
在AspectJ 1.5后,引入@Aspect形式的注解风格的开发,Spring也非常快地跟进了这种方式,因此Spring 2.0后便使用了与AspectJ一样的注解。请注意,Spring 只是使用了与 AspectJ 5 一样的注解,但仍然没有使用 AspectJ 的编译器,底层依然是动态代理技术的实现,因此并不依赖于 AspectJ 的编译器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值