java程序ioc_好程序员Java干货分享Spring框架之IOC原理

b1453e208e1799eaa6f9d461e46b20b8.png

在Spring中,我们可以从单调乏味的事务管理代码中解脱出来spring ioc原理 反射,通过声明式方式灵活地进行事务的管控,提高研发效率跟质量。

4.方便程序的测试

可以用非容器依赖的编程方法进行几乎所有的测试工作,在Spring里,测试不再是廉价的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以借助注解方便的测试Spring程序。

5.方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以减少各类框架的使用难度,Spring提供了对各类优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

6.降低Java EE API的使用难度

Spring对这些难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为减少。

79d5ba3458e0ff242ad9d3137ab7468c.png

Spring的组成

ea752b48e827880136ff31488b1e047b.png

Spring Core:Spring框架的核心。Spring其它模块都依赖于核心部件,主要借助BeanFactory提供IOC等服务。

Spring Context:Sprin上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP:通过配置管理特点,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中。

Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包含JDO、Hibernate和iBatisSQL Map。所有这种都遵循Spring的通用事务跟DAO异常层次结构。

Spring DAO: DAO抽象层提供了有含义的异常层次结构,可用该构架来管控异常处置和不同供应商抛出的出错消息。异常层次结构简化了错误处理,并且极大地减少了必须编写的异常代码数量(例如开启和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。

d4e3fc69b766c6bfa30d2093dff4c2ba.png

Spring Web: Web上下文模块构建在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。Web组件还简化了处理多个别请求或者将请求参数绑定到域对象的工作。

Spring Web MVC:为web应用提供了建模视图控制(MVC)和REST Web服务的谋求。Spring的MVC框架可以让领域建模代码跟web表单完全地分离,且可以与Spring框架的其他所有功能进行集成。

IOC和DI

IOC(Inverse Of Control)是控制反转的含义,作用是增加对象之间的耦合度。

一般状况下我们直接在对象内部通过new进行构建对象spring ioc原理 反射,是程序主动去建立依赖对象;而IoC是有专门一个容器来建立这种对象,即由Ioc容器来控制对象的建立;这样就是由容器来控制对象,而不是由我们的对象来控制,这样就完成了控制反转。

DI(Dependency Injection)即“依赖注入”:是模块之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到模块之中。依赖注入的目的只是为工具系统带来更多用途,而是为了提高模块重用的速率,并为平台打造一个灵活、可扩充的系统。通过依赖注入模式,我们只应该通过简洁的配置,而无需任何代码就可指定目标必须的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

IOC的原理:注解+反射

e311752549afecf52479b2fa42c4e4ba.png

下面的实例讲解了IOC的机理,模拟为电脑配置不同的CPU和存储,CPU有AMD和INTEL两种,内存有DDR8G和DDR16G两种

/*** CPU接口*/public interface Cpu {void run();}/***内存接口*/public interface Memory {void read();void write();}/*** AMD的CPU*/public class AMDCpu implements Cpu {public void run() {System。out。println("AMD的CPU正在运行。。。。");}}/*** Intel的CPU*/public class IntelCpu implements Cpu{public void run() {System。out。println("Intel的CPU正在运行。。。。");}}/*** DDR8G的内存*/public class DDR8GMemory implements Memory {public void read() {System。out。println("使用DDR8G的存储调用数据。。。。");}public void write() {System。

out。println("使用DDR8G的存储读取数据。。。。");}}/*** DDR16G的内存*/public class DDR16GMemory implements Memory {public void read() {System。out。println("使用DDR16G的存储调用数据。。。。");}public void write() {System。out。println("使用DDR16G的存储读取数据。。。。");}}public class TestComputer {@Testpublic void testComputer(){//硬编码方式创建对象Computer computer = new Computer();Cpu cpu = new IntelCpu();Memory memory = new DDR16GMemory();computer。setCpu(cpu);computer。setMemory(memory);computer。start();}}

上面是使用硬编码方式建立电脑的CPU和存储属性,代码和准确的泛型紧密耦合,不利于后期的维护跟扩展。

修改的模式是:不由让程序主动建立去构建CPU和存储对象,而是借助注解方式标记CPU和存储的类别,使用反射将CPU和存储的对象注入到电脑的属性中。

添加代码:

/***电脑组件的注释*/@Retention(RetentionPolicy。RUNTIME)@Target(ElementType。FIELD)public @interface MyComponent {/***组件类型* @return*/Class componentClass();}/***电脑类*/public class Computer {@MyComponent(componentClass = IntelCpu。class)private Cpu cpu;@MyComponent(componentClass = DDR8GMemory。class)private Memory memory;。。。。}public class TestComputer {@Testpublic void testComputer(){//通过反射和注释,将cpu和memory属性注入进去try {//获得Computer类型Class computerClass = Computer。class;//创建Computer对象Computer computer = computerClass。

dccfba16da471c475b1eefe31aea3aa5.png

newInstance();//获得Computer对象的属性Field[] fields = computerClass。getDeclaredFields();//遍历属性for(Field field : fields){//获得属性上定义的MyComponent注解MyComponent anno = field。getDeclaredAnnotation(MyComponent。class);//获得配置的模块类型Class aClass = anno。componentClass();//创建该模块的对象Object comp = aClass。newInstance();//调用set方法赋值给属性String name = field。getName();name = "set" + name。substring(0,1)。toUpperCase() + name。substring(1);//通过方式名跟参数类型获取方式Method method = computerClass。getDeclaredMethod(name, field。getType());//调用方法method。invoke(computer,comp);}//启动电脑computer。start();} catch (Exception e) {e。printStackTrace();}}}

程序如前面修改后,后期如果必须设置电脑的配置,只应该设置注解配置的类别,就可以注入不同的电脑部件,这样就增加了代码间的耦合性,维护代码更加比较简单。

@MyComponent(componentClass = AMDCpu.class)

private Cpu cpu;

@MyComponent(componentClass = DDR16GMemory.class)

private Memory memory;

总结

IOC(控制反转)是Spring更重要的原理,它将建立对象的主动权交给Spring容器,Spring程序只应该进行一些配置,就可以使用不同的对象,极大的减少了代码耦合性,提高了程序的灵活性,IOC的推动原理是反射模式。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-138283-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值