Spring详解(0 控制反转和依赖注入 AOP简介 )
目录依赖注入控制反转和依赖注入的关系Spring中的依赖注入AOP 面向切面编程Spring 框架本身的四大原则1) 使用pojo进行轻量级和最小侵入式开发2) 通过依赖注入和基于接口编程实现送耦合3) 通过AOP和默认习惯进行声明式编程4) 使用AOP和模板(template) 减少模式化代码依赖注入依赖注入是容器负责创建对象和维护对象间的依赖...
目录
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做动态代理
更多推荐
所有评论(0)