项目中都用到了Spring、Mybatis、SpringMVC框架,首先来谈一谈Spring框架,Spring框架以IOC、AOP作为主要思想。

  IOC----控制反转

   IOC的全称为Inversion of Control 即控制反转,这是一种思想,而不是只发具体的技术。传统方式是通过程序直接new来创建一个对象,而IOC方式是把对象的创建交由容器来管理。传统方式利用new来创建对象使得类与类之间有严重的依赖关系,那通过IOC方   式,我们可以将类之间的耦合关系解开,类与类之间松散耦合。

   通俗来说,IOC是利用Spring来控制对象的生命周期和对象之间的关系。在传统的方式中,在一个对象中,如果要使用另外的对象,那么就需要new一个另外的对象,用完后再销毁这个对象。类似于找妹子,我们去找看对眼的妹子,然后找她们要微信,求认识,然后进一步的展开追求。那IOC呢,就相当于一个媒婆,它是你找对象的中间媒介,这个媒婆手头有很多适龄男女的资料,你可以向她提关于女朋友的要求,她会为你找到一个符合你要求的对象。如果媒婆找的人不合适,我们就抛异常。

   具体说来呢,就是所有的类都会在Spring容器中进行登记,告诉Spring容器你是什么,你需要什么,然后spring会在系统运行到适当的适合把你需要的东西给你,同时也把你交给需要你的东西。所有类的创建、销毁都交给spring来控制,即控制对象生命周期的不再是引用它的对象,而是spring。对于具体对象而言,原来是它控制其他对象,现在是所有对象都被spring控制,故叫做控制反转。

    DI  依赖注入

   在系统运行中,动态的向某个对象提供它所需要的其他对象,这是通过DI(Dependency Injection)实现的。如之前对象A需要操作数据库,那么它就需要一个Connection对象,那现在spring会帮助我们在程序运行时构造一个Connection.spring就是通过反射来实现注入的。

   AOP----面向切面编程

  简单说来,AOP通过动态代理的方式,不改变源代码逻辑,在源代码基础上进行功能增强。

  传统的面向对象编程(OOP)是纵向的编程,基于子类继承父类,建立起一种对象的层次结构,适用于纵向关系,而对于一些像日志、安全性、异常处理等与对象核心功能无关的模块,OOP则没有用武之地,例如一个项目已经上线运行,但是想在这个项目代码中加入日志功能,那停掉服务器修改代码是一项得不偿失的事情了,这时候就到了AOP发挥功能的时候了。

    AOP的几个核心概念:    

    1、横切关注点

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

    2、切面(aspect)

      类是对物体特征的抽象,切面就是对横切关注点的抽象

    3、连接点(joinpoint)

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

    4、切入点(pointcut)

      对连接点进行拦截的定义

    5、通知(advice)

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

    6、目标对象

      代理的目标对象

    7、织入(weave)

      将切面应用到目标对象并导致代理对象创建的过程

    8、引入(introduction)

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

    

      AOP的底层实现是基于动态代理的,动态代理技术分为两种:

       1.JDK的动态代理,这种方式要求有接口

       2.CGLIB的动态代理,这种方式没有接口,采用生成类的子类的方式

      使用JDK方式生成动态代理举例:

        在接口UserDao的实现类UserDaoImpl中定义两个方法save()和update()

        

        

       现在要在中间模拟记录日志功能,有接口,用jdk的动态代理方式
              构建工具类MyProxyUtils.java,InvocationHandler()为内部类

      

      增强方法

      

      CGLIB动态代理

      

      

框架-Spring的更多相关文章

  1. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  2. [Spring框架]Spring开发实例: XML+注解.

    前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...

  3. 初识轻量级Java开源框架 --- Spring

    初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...

  4. java DI 框架spring(web)、Guice(web)、Dagger&Dagger2(android)

    java DI 框架spring(web).Guice(web).Dagger&Dagger2(android) (待续...)

  5. 开放源代码的设计层面框架Spring——day01

    spring第一天     一.Spring概述         1.1spring概述             1.1.1spring介绍                 Spring是分层的Jav ...

  6. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(下)

    在上一篇(详解intellij idea 搭建SSM框架(spring+maven+mybatis+mysql+junit)(上))博文中已经介绍了关于SSM框架的各种基础配置,(对于SSM配置不熟悉 ...

  7. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  8. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  9. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

  10. 跟着刚哥学习Spring框架--Spring容器(二)

    Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是S ...

随机推荐

  1. BZOJ 1834 网络扩容 最大流+最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题目大意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是 ...

  2. 【洛谷】【前缀和+st表】P2629 好消息,坏消息

    [题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...

  3. day2-作业及答案

    作业:第一组: 1.接收用户输入一个年份,判断是否是闰年(判断闰年的方法是该年能被4整除并且不能被100整除,或者是可以被400整除) 2.接收用户输入一组整数,输入负数时结束输入,输出这组数字的和: ...

  4. <数据结构与算法分析>读书笔记--函数对象

    关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...

  5. vue实例的属性和方法

    vue实例的属性和方法 1. 属性 vm.$el #指定要绑定的元素 vm.$data #Vue 实例的数据对象 vm.$options #获取自定义属性的值 new Vue({ customOpti ...

  6. [转]OPENCV3.3+CUDA9.0 环境搭建若干错误总结

    编译OpenCV设计启用OpenGL三维可视化支持和启用GPU CUDA并行加速处理的基本知识: 1.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL,这就意味着在OpenCV中可以轻 ...

  7. Python2.7-fileinput

    fileinput 模块,对输入的文件流进行迭代操作,可以说是对 open() 的一个扩展,它可以直接修改文件,也可以对他们进行备份 模块方法: fileinput.input([files[, in ...

  8. redis安装及常用命令

    查看redis版本 redis-server -v或者redis-cli -v 安装redis 硬件要求 查看版本 uname -a  内存32G 8核CPU 查看内存大小 cat /proc/mem ...

  9. Android关于LinearLayout和RelativeLayout背景设置的区别

    1.LinearLayout:设置背景时即设置android:background时,假如LayoutLayout设置了android:layout_width="wrap_content& ...

  10. python 爬虫--同花顺-使用代理

    1.http://www.goubanjia.com/  在上面获取 使用http协议的公网IP和端口 参考:https://blog.csdn.net/qq_23934063/article/det ...