目录
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做动态代理