Spring核心 IoC和AOP原理
1、 什么是Spring
Spring是一个轻量的Java开源框架,它简化了应用开发,实现基于POJO的编程模型。它的两大核心是:IoC(控制反转),AOP(面向切面编程)。
2、 IoC控制反转
简单的说就是将创建对象的权利交由IoC。一般来说,使用对象之前必须创建。但IoC允许我们从容器中直接获得并使用一个对象,无需事先创建它们,也不用去关注多个类之间的相互依赖关系。
原理:利用Java的反射机制,根据配置文件,在运行时动态的去创建实例,并管理各个实例之间的依赖关系。
好处:减少代码;组件松耦合;方便测试;资源统一管理,可配置;
2.1 三种注入方式
2.1.1 构造器注入
接受注入的类中定义一个有参数的构造方法,将被依赖的对象通过这个构造函数参数注入。
优点:对象初始化完成后便可使用。
缺点:当需要注入的对象很多时,构造函数参数列表会很长。如果有多种注入方式,可能需要提供多个构造函数。
public class Car{
private Wheel wheel;
//Constructor Injection
public Car(Wheel wheel){
this.wheel = wheel;
}
void run(){
wheel.run();
}
}
2.1.2 setter方法注入
IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。这个最常用。
优点:灵活。可以选择性地注入需要的对象。
缺点:对象无法在构造完成后马上进入就绪状态。依赖对象初始化完成后,由于尚未注入被依赖对象,因此还不能使用。
public class Car{
private Wheel wheel;
private void setWheel(Wheel wheel){
this.wheel = wheel;
}
public Wheel getWheel(){
return wheel;
}
}
2.1.3 接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象。
优点:接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
缺点:侵入行太强,不建议使用。
public class Car implemnets CarInterface{
private Wheel wheel;
@override
void injectWheel(Wheel wheel){
this.wheel = wheel;
}
public void run(){
wheel.run();
}
}
2.2 IoC 自动装载
下面以XML配置为例,讲解常见的装载模式:
no: 缺省
<!-- no – 缺省情况下,自动配置是通过“ref”属性手动设定 -->
<bean id="person" class="org.spring.autowring.Person">
<property name="ability" ref="ability"></property>
</bean>
byName:通过属性名自动装载
<!-- Auto-Wiring "byName" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byName"/>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
byType:通过属性的数据类型自动装载
<!-- Auto-Wiring "byType" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byType"/>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
byType需要注意,如果同时存在两个及以上的符合条件的 bean 时,⾃自动装载会抛出异常。
constructor:在构造函数参数的byType方式
<!-- constructor – 在构造函数参数的byType方式。 -->
<!-- 构造方法的参数 -->
<bean id="person" class="org.spring.autowring.Person">
<constructor-arg>
<ref bean="ability"></ref>
</constructor-arg>
</bean>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
constructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
autodetect
如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。
3、 AOP面向切面编程
AOP(面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。
AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。
3.1 JDK动态代理
spring默认使用JDK的动态代理。JDK动态代理涉及Proxy类和InvocationHandler接口。大致步骤为:
1、通过Proxy获得动态代理类
2、通过反射机制获取代理类的构造方法
3、通过构造函数获得代理对象,并将定义的InvocationHandler实例对象传为参数传入
4、通过代理对象调用目标方法
优点:不需要任何依赖,更加松耦合。
缺点:为每一个目标创建接口
3.2 CGLib动态代理
若目标对象没有实现任何接口,spring使用CGLib进行动态代理。CGLib代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
优点:不需要实现接口,因为CGLib生成的代理类是直接继承自需要被代理的类。
缺点:因为没有使用接口,系统耦合性不如JDK动态代理好。无法对final类代理,无法对final、private方法代理。
如何强制使用CGLIB实现AOP?
1、添加CGLIB库,SPRING_HOME/cglib/*.jar
2、在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
篇幅原因,这里就不展示这两种方式的实现代码了,请参照:https://www.cnblogs.com/puyangsky/p/6218925.html
Spring核心 IoC和AOP原理的更多相关文章
- spring的ioc与aop原理
ioc(反向控制) 原理: 在编码阶段,既没有实例化对象,也没有设置依赖关系,而把它交给Spring,由Spring在运行阶段实例化.组装对象.这种做法颠覆了传统的写代码实例化.组装对象.然后一 ...
- Java轻量级业务层框架Spring两大核心IOC和AOP原理
IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...
- spring中IOC和AOP原理
IoC(Inversion of Control): (1)IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控.控制权由应用代码中转 ...
- spring两个核心IOC、AOP
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 ...
- Spring 的IOC和AOP总结
Spring 的IOC和AOP IOC 1.IOC 许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我 ...
- Spring框架IOC和AOP介绍
说明:本文部分内容参考其他优秀博客后结合自己实战例子改编如下 Spring框架是个轻量级的Java EE框架.所谓轻量级,是指不依赖于容器就能运行的.Struts.Hibernate也是轻量级的. 轻 ...
- 展开说说,Spring Bean IOC、AOP 循环依赖
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 延迟满足能给你带来什么? 大学有四年时间,但几乎所有人都是临近毕业才发现找一份好工作 ...
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- spring的IOC和AOP
spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...
随机推荐
- 一些Docker 操作集合
基本 显示所有容器(包括已停止): docker container ls -a 删除所有容器: docker stop $(docker ps -q) docker rm $(docker ps - ...
- jsp安全问题及其解决建议
jsp编程语言自从推出之日起,由于它的快速.平台无关.可扩展.面向对象等特性得到了越来越广泛的应用,越来越多的厂家开发出了各种各样的支持平台如IBM 公司的WebSphere.BEA公司的WebLog ...
- 给windows右键添加快捷启动程序
给windows右键添加快捷启动程序 修改点击空白处的右键 运行--redegit 打开注册表 展开第一个H..C..R 找到 Direcory,展开 找到Background 展开 右键shell, ...
- [应用软件] VMware Workstation 12.0.0 Pro 正式版下载【附注册机+注册码】
软件信息 软件名称: VMware Workstation 软件版本: 12 软件大小: 300 MB 软件语言: 简体中文 更新时间: - 软件授权: 免费 软件类别: 安装版 运行环境: WinX ...
- uniapp小程序图片前端压缩上传
目录 1,前言 2,实现代码 1,前言 这次项目中做了一个图片上传,要求是大于2MB的就压缩成2MB一下的再上传,我这边利用了uniapp的文件接口,使用canvas做了一个压缩上传的功能,目前已上线 ...
- 你也可以很硬核「GitHub 热点速览 v.22.13」
本周特推介绍了一个非常易上手,操作难度(主要难度在于机件购买)极低的硬件项目,SmartKnob 让你有个可玩性极高的控制仪.本周特推另外一个项目则是一个安全项目,打破你对 URL 是可靠.安全的认知 ...
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销. 要同时修改数据库中两个不同表时,如果它们不是一个事 ...
- 为什么使用 Executor 框架比使用应用创建和管理线程好?
为什么要使用 Executor 线程池框架 1.每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗 时.耗资源的. 2.调用 new Thread()创建的线程缺乏管理, ...
- Mybatis框架基础入门(二)--架构简介
mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息. mapper.xml文件即sql映射文件,文件中配置了操作数据库的 ...
- 阐述final、finally、finalize的区别?
- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词.将变量声明为final,可以保证它们在使用中不被 ...