美文网首页Java学习笔记
Spring学习笔记(一)——IOC、AOP底层原理

Spring学习笔记(一)——IOC、AOP底层原理

作者: 顾烟凉 | 来源:发表于2018-07-14 13:31 被阅读0次

    spring概念

    spring是一站式(分层)开源轻量级框架

    JavaEE开发是分层式开发,即web层,业务层,持久层。
    

    我们为什么要使用spring框架?

    使用spring框架可以简化程序开发,创建和组装对象,为我们管理事务,加速我们的程序开发,最重要的一个原因是其解耦度达到了配置级别。

    spring核心部分

    1、IOC(控制反转)

    IOC(Inversion Of COntrol)控制反转是Spring的基础,简单地说就是把本来应该由我们手动创建对象这个过程交给了spring来完成。

    举例:在原生Java中我们要调用一个类中的非静态方法的话,首先要new一个对象,然后再去调用,这样做就耦合度非常高。

    public class User{
        public void function() {
        ........
        }
     }
    

    想要在service层调用user中的function()方法,首先就得new一个user对象,再调用对象中的方法:

    User user = new User();
    user.function();
    

    这种做法的缺点是耦合度太高,可以看到,当User这个类做出一些改变时(例如类名变更),service层创建user对象的代码也要做出改动,如此高的耦合度不仅增加了调试难度,且有可能导致在大型项目的开发中产生不必要的错误。

    进一步的优化方法是使用工厂模式解耦:

    public class UserService {
      public void function() {
      ......
      }
    }
    
    public class UserServlet{
      UserServlet us = Factory.getService();
    }
    // 工厂类
    public class factory {
      public static UserService getService(){
        return new UserService();
      }
    }
    

    通过以上代码可以看到使用工厂模式已经向“高内聚,低耦合”的思想靠近了一步,但仍然不够,于是就有了spring框架,其使用方式以及原理如下:

    底层原理
    1. ioc功能操作

    (1)通过配置文件完成
    (2)通过注解方式完成

    2. ioc底层原理使用技术

    (1)xml配置文件
    (2)dom4j解析xml
    (3)工厂模式
    (4)反射
    具体实现如下:

    public class UserService{
    }
    

    第一步:创建xml配置文件,配置其创建对象类;

    <bean id="userService" class="//类所在路径.UserService"/>
    

    第二步:创建工厂类,使用dom4j解析配置文件+反射;

    public static UserService getService() {
        // 1.使用dom4j解析xml文件
        // 根据id值UserService,得到id值对应class属性值
        String classValue = "class属性值";
        // 2.使用反射创建对象
        class class1 = class.forName(classValue);
        // 创建类对象
        UserService service = class1.newInstance();
        return service;
    }
    

    通过以上操作降低了耦合度。

    2、AOP(面向切面编程)

    AOP(Aspect Oriented Programming),即面向切面编程;Spring AOP模块主要应用在如下场景:

    • 事务处理
    • 日志处理
    • 异常处理
    • 权限控制
    • 系统性能监控
    AOP底层原理

    使用动态代理实现
    (1)基于JDK的代理

    适用于有接口情况,使用动态代理创建接口实现类代理对象
    

    (2)基于CGLIB动态代理

    适用于没有接口情况,使用动态代理创建类的子类代理对象
    

    提到AOP,我们虽然知道这是面向切面编程,但依然是一头雾水,不知何为切面,因此在学习之前我们要先了解关于AOP的部分术语,需要重点掌握的术语有三个,如下:

    • 切入点(Pointcut):对连接点(Joinpoint)进行拦截的定义。
    • 切面(Aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象,是切入点和通知的结合。
    • 通知(Advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。

    AOP采取的是横向抽取机制,取代了传统纵向继承体系重复性代码。

    那么何为软件的横向和纵向?

    从纵向结构来看就是我们软件的各个模块,它所负责的是软件的核心业务(如购商品购买、添加购物车等);从横向来看的话,软件的各个模块之间又有所关联,其中会包含一些公共模块(例如日志、权限等);这些公共模块可以存在于各个核心业务中,而AOP的处理将两者分离,使开发人员可以专注于核心业务的开发,提高了开发效率。

    结尾

    在学习spring框架这条路上实在是任重而道远,以上只是在学习过后对知识点脉络的梳理,如有错误,恳请指正。

    相关文章

      网友评论

        本文标题:Spring学习笔记(一)——IOC、AOP底层原理

        本文链接:https://www.haomeiwen.com/subject/kmfypftx.html