Spring详解(0 控制反转和依赖注入 AOP简介 )

目录

依赖注入

控制反转和依赖注入的关系

Spring中的依赖注入

AOP 面向切面编程


Spring 框架本身的四大原则

 1) 使用pojo进行轻量级和最小侵入式开发

 2) 通过依赖注入和基于接口编程实现送耦合

 3) 通过AOP和默认习惯进行声明式编程

 4) 使用AOP和模板(template) 减少模式化代码

依赖注入

依赖注入是容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的建立和解决自己的依赖

依赖注入的目的是为了解耦,解释将实例变量传入到另一个对象中

什么是依赖?就是一个类Father 中有一个类Son的一个实例,则称 Father 对Son 有一个依赖

public class Father{
        ...

        Son son;
        public Father (){
        Son =new Son();
    }

        ...
}

这会存在几个问题:

 1) 一旦Son的构造方式发生变化,就需要修改Father中的new Son() 部分的代码

2) 想要测试不同的Son对象对Father的影响比较困难,因为Son的初始化部分已经写到Father的构造方法中

3) 如果new Son() 所需的时间很长,则在测试时比较麻烦

因此可以做如下修改

public class Father{
        ...

        Son son;
        public Father ( Son  son){
        this.son=son;
    }

        ...
}

修改之后的代码,在构造Fatherdui对象之前,就已经有一个已经初始化好的Son对象,

像这种不是自己主动初始化依赖,而是外部传入依赖的方式,就是依赖注入

控制反转

控制反转是一种面向对象编程中的一种设计原则,用来见底代码之间的耦合度,其基本思想是: 借助

第三方实现具有依赖关系的对象之间的解耦

假设有四个对象,A,B,C,D ,他们需要相互依赖才能正常工作,一个对象出现问题,整个系统就停止下来,这就是所谓的

  相互耦合 :

原系统

 

控制反转后的系统(解耦)

现在来对比下控制反转前后的系统

对象A依赖C,如果A在运行中需要使用到C的时候,必须去主动的创建C或者使用已经创建的C对象,但是无论是创建,还是使用,主动权都在A自己手中

但是引入IOC容器之后,A与C不直接联系,如果A使用到C的时候,IOC会主动创建一个对象C,然后注入到A所需的地方, 对象A获取依赖对象C的过程,变成了被动获取,这就是控制反转

spring中的控制反转是通过依赖注入实现的

控制反转和依赖注入的关系

控制反转是一种思想,依赖注入是一种模式

Spring中的依赖注入

Spring的IOC容器 是(ApplicationContext),复制创建bean,并通过容器将功能类Bean注入到所需要的bean中

Spring 提供的注入方式有: xml,注解,java配置

使用注解的优势就是减少代码的书写,开发速度较快

bean的常用注解

@Component 

@Service  业务逻辑层(service,一般放到实现类中)

@Repository  数据访问层使用(dao)

@Controller 展现层使用(例如sprispringMVC中)

注入bean的常用注解

@Autowired : spring提供的注解

@Resource 

spring4.* 推荐使用java配置

java配置是通过@Configuration和@Bean来实现的

@Configuration 声明一个类是一个配置类,相当于一个springpeiz配置的xml文件

@Bean 注解在方法上,声明当前方法返回一个Bean

AOP 面向切面编程

spring 的AOP存在的目的是解耦,AOP可以让一组类共享相同的行为

例如  oop中,把功能封装到对象中,但是有时候会出现重复的代码,假设对象A,Btong同时需要对日志进行操作,封装之后,出现了重复的代码,此时可以将相同的日志操作提取到一个工具类C中,让两个对象调用,但是对象A和B就与gong工具类C耦合了

AOP的作用是,在需要的时候,随意加入代码

常用的方式有两种: 静态代理与动态代理

静态代理是使用AsprctJ ,其操作方式为,在编译期间生成AOP的代理类,因此又称为编译增强

动态代理通过springAop是在内存中临时为方法生成AOP对象,这个对象包括目标对象所有的方法,并且在相应切点做了增强操作

SpringAop动态代理的两种方式 JDK动态代理以及cglib

JDK动态代理基于反射机制,要求代理类必须实现一个接口

cglib是基于继承,因此如果一个类被定义为final,是无法使用cglib做动态代理

猜你喜欢

转载自blog.csdn.net/aa15237104245/article/details/81169392