Spring两大特性:IOC 和AOP。IOC 控制反转,AOP 面向切面编程

  spring 核心容器的主要组件时Bean工厂(BeanFactory) ,Bean 工厂使用控制反转模式来降低程序代码之间的耦合度,并提供了面向切面编程的实现。

  Spring 常用的注解

  1. @Controller :用于标注控制器成组件。
  2. @Service:用于标注业务成组件。
  3. @Component : 用于标注这是一个受spring 容器管理的组件,组件引用名称是类名, 第一个字母小写。也可以使用@Component("beanName")指定组件的名称
  4. @Reposirty:用于标注数据库访问组件,即DAO组件。
  5. @Bean:方法级别的注解,主要用于@Configuration 或@Component 注解的类里, @Bean 注解的方法会产生一个Bean对象,该对象由Spring管理并放在IOC容器中。引用名称是方法名, 也可以使用@Bean(name = "beanName")指定组件名称
  6. @Scope("prototype"):将组件的范围设置为原型的(即多例)。保证每一个请求有一个单独的action来处理,避免action的线程问题。由于Spring默认是单例模式,只会创建一个action对象,每次访问都是同一个对象,容易产生并发问题,数据不安全。
  7. @Autowired:默认按照类型进行自动装配,在容器查找匹配的bean, 当仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
  8. @Resource:默认按名称进行自动装配,当找不到与名称匹配的Bean时会按照类型装配。

    能够明确该类时一个控制器类组件时,就用@Controller;

    能够明确该类是一个服务类组件时,就用@Service;

    能够明确该类是一个数据访问组件时,就用@Repository;

    不明确它的作用时,使用@Component;

  控制反转IOC

  创建对象的控制权反转到Spring框架上。

  通常,实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就是把new对象的操作交给Spring容器

  IOC的主要实现方式:依赖查找、依赖注入。依赖注入是一种更可取的方式。

  依赖查找,依赖注入的区别?

  依赖查找:主要是容器为组件提供一个回调接口和上下文环境。组件必须自己使用容器提供的API来查找资源和协作对象,控制反转仅体现在那些回调方法上,容器调用这些回调方法,应用代码获取到资源。

  依赖注入:组件不做定位查询,只提供标砖的JAVA方法让容器去决定依赖关系,容器全权负责组件的装配,把符合依赖关系的对象通过JAVA Bean 属性或构造方法传递给需要的对象。

    

  IOC容器:具有依赖注入功能的容器,可以创建对象的容器。IOC容器负责实例化、定位、配置应用程序中的对象并建立这些对象之间的依赖。

  依赖注入:由IOC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件之中

  Spring依赖注入的方式主要有四个:基于注解注入、Set注入方式、构造器注入方式、静态工厂注入方式。推荐使用基于注解注入的方式,配置少,比较方便。

  @Autowired和@Resource的区别

  共同点: @Autowired和@Resource都是用来装配Bean的, 都可以写在字段、setter方法上。

  不同点:

  @Autowired默认按照类型进行自动装配,该注解属于Spring,.默认情况下要求依赖对象必须存在,如果允许为null,需要设置required属性为false。如果要使用名称进行装配,可以和@QualiFier 注解一起使用

  

@Autowired
@QualiFier("beanName")
private BeanNameService beanNameService;

  @Resource默认按照名称进行装配,该注解属于J2EE,名称可以通过name属性来指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行装配;如果注解写在setter方法上,默认取属性名进行装配。当找不到与名称匹配的Bean时,会按照类型进行装配,但是,name属性一旦指定,就只会按照名称进行装配。

@Resource(name="beanNameService")
private BeanNameService beanNameService;

  面向切面编程AOP

  AOP一般应用于:签名验签、参数校验、日志记录、事务控制、权限控制、性能统计、异常处理等。

  切面(Aspect):共有功能的实现。如日志切面、权限切面、验签切面等。在实际开发中通常是一个存放共有功能实现的标准Java类。当Java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面。

  通知(Advice):切面的具体实现。就是要给目标对象织入的事情。以目标方法为参照点,根据放置的地方不同,可分为前置通知、后置通知、异常通知、最终通知、环绕通知。通常切面类中的一个方法,具体属于哪类通知,通过方法上的注解区分。

  连接点(JoinPoint):程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出等。Spring只支持方法级的连接点。一个类的所有方法前、后、抛出异常时等都是连接点。

  切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

  目标对象(Target):那些即将切入切面的对象,也就是那些被通知的对象。这些对象专注业务本身的逻辑,所有的共有功能等待AOP容器的切入。

  代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象本身业务逻辑加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。目标对象被织入共有功能后产生的对象。

  织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译时、类加载时、运行时。Spring是在运行时完成织入,运行时织入通过Java语言的反射机制与动态代理机制来动态实现。

  Pointcut用法

  

execution(modifier-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

  修饰符匹配 modifier-pattern? 例:public private

  返回值匹配 ret-type-pattern 可以用 * 表示任意返回值

  类路径匹配 declaring-type-pattern? 全路径的类名

  方法名匹配 name-pattern 可以指定方法名或者用 * 表示所有方法;set* 表示所有以set开头的方法

  参数匹配 (param-pattern) 可以指定具体的参数类型,多个参数用“,”分隔;可以用 * 表示匹配任意类型的参数;可以用 (..) 表示零个或多个任意参数

  异常类型匹配throws-pattern? 例:throws Exception

  其中后面跟着 ? 表示可选项

@Pointcut("execution(public * com.project.springbootdemo.controller.*.*(..))")
private void sign() { }

  示例:

  

/**
SignAop类使用了@Aspect注解,则该类可以被AOP容器识别为切面。 */ @Aspect
@Component
public class SignAop { /**@Pointcut声明一个切入点,范围为controller包下所有的类的所有方法*/
@Pointcut("execution(public * cn.wbnull.springbootdemo.controller.*.*(..))")
private void signAop() { }
//doBefore()方法使用@Before("signAop()")注解,表示前置通知(在某连接点之前执行的通知),但这个通知不能阻止连接点之前的执行流程,除非它抛出一个异常。
@Before("signAop()")
public void doBefore(JoinPoint joinPoint) throws Exception {
//code
} //doAfterReturning()方法使用@AfterReturning(value = "signAop()", returning = "params")注解,表示后置通知(在某连接点正常完成后执行的通知),通常在一个匹配的方法返回的时候执行。
@AfterReturning(value = "signAop()", returning = "params")
public JSONObject doAfterReturning(JoinPoint joinPoint, JSONObject params) {
//code
}
} //实际运行时,在进入controller包下所有方法前,都会进入doBefore()方法,在controller包下方法执行完成后,都会进入doAfterReturning()方法。

  

Spring IOC DI AOP 的简单理解及应用的更多相关文章

  1. 黑马-Spring(IOC&DI) AOP

    IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1.  写一个HelloWorld类 2.  写一个配置文件   把hello类放到spring容 ...

  2. spring IOC DI AOP MVC 事务, mybatis 源码解读

    demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...

  3. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  4. spring+IOC+DI+AOP优点分析(一)

    Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于sprin ...

  5. Spring ioc与aop的理解

    一 spring的特点 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易 ...

  6. J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP

    J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言   搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理.    ...

  7. 【转】spring - ioc和aop

    [转]spring - ioc和aop 1.程序中为什么会用到spring的ioc和aop 2.什么是IOC,AOP,以及使用它们的好处,即详细回答了第一个问题 3.原理 关于1: a:我们平常使用对 ...

  8. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  9. spring ioc DI 理解

    下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...

随机推荐

  1. 各种设备在linux中的文件名

    各种设备在linux中的文件名: 设备         设备在linux内的文件名 ide硬盘 /dev/ha[a-d] scs硬盘 /dev/sd[a-p] u盘 /dev/sd[a-p](与SAT ...

  2. chrome浏览器canvas画图不显示

    问题产生在学习cabvas给画布画图像的时候发现使用IE edge浏览器可以正常显示图像,而chrome则不行,经百度后知道是因为chrome浏览器会先加载javascript代码,之后才加载图片,这 ...

  3. 安卓构架组件——概述 Android Architecture Components

    谷歌官文文档地址:https://developer.android.google.cn/topic/libraries/architecture 安卓构架组建是库的集合:帮助你设计健壮的.易测试的. ...

  4. Linux学习笔记2-CentOS7安装tomcat8

    1.下载tomcat:apache-tomcat-8.5.16.tar.gz 下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat ...

  5. Failed to load C:\ProgramFilesTwo\Android\sdk\build-tools\27.0.3\lib\dx.jar

    Eclipse遇到如下错误: Failed to load C:\ProgramFilesTwo\Android\sdk\build-tools\27.0.3\lib\dx.jar 原因: eclip ...

  6. Mac版Navicat Premium激活教程

    工具: Navicat Premium12.0.20 安装包 下载注册机工具包 链接:https://pan.baidu.com/s/1NS8gk780ds1Xn-zHrSIzIw  密码:dvke ...

  7. Java并发(基础知识)—— Java中断机制

    上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...

  8. 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

    Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...

  9. openstack组件之nova

    Nova常用命令  1.查看vm列表 nova listnova list --all 2.查看镜像列表  nova image-list   3.查看卷列表 nova voluma-list 4.查 ...

  10. bzoj5161 最长上升子序列 状压DP(DP 套 DP) + 打表

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5161 题解 回顾一下以前用二分求 LIS 的方法:令 \(f[i]\) 表示长度为 \(i\) ...