Spring的DI和AOP

xiaoxiao2021-02-28  35

基于POJO的轻量级和最小入侵性编程

POJO–简单的java对象。 释义: Spring不会强迫你继承他的类或者实现它的接口,最坏的情况就是使用Spring的注解; 使用非侵入性编程这样我们不论是在Spring应用还是非Spring应用中都能够发挥同样的作用; Spring通过DI来帮助应用对象实现松耦合; 两个简单的例子比较: 而通过DI,在对象创建的时候,第三方的插件进行管理它们的以来关系进行设定,依赖关系将会被自动注入到需要他们的对象当中去;

不同于之前的自行创建,而是传入构造参数,这是依赖方式之一:①构造注入

Spring通常使用基于XML 或者基于java的配置来装配(装配–组建之间的协作);

通过ApplicationContext容器来读取代码运行时的上下文,来生成对应的bean,来解耦;

这里额外提一下注入外部的值:

DI能够让互相协作的组织保持松散耦合,AOP则是允许你把遍布应用各处的功能分离起来(大部分为横切关注点:事务,日志,安全等…)形成可用组件:

一个简单的AOP服务:

根据上文我们知道DI通过ApplicationContext容器实现,那么同样,实现aop的配置我们应该也可以基于JAVA或者XML的配置实现,这里我我只给出xml: (自行百度AspectJ切点表达式语法,java方式:@Aspect声明类为切面,@Pointcut(“execution(* *.saying(..))”)定义切点) 利用AOP我们可以更好的达到业务代码的纯洁性; 同时因为Spring是基于动态代理,所以Spring只支持方法连接点,这一点与其他AOP框架是不同的,无法支持创建细粒度的通知;

怎样理解AOP和DI的关系: 通过在代理类中包裹切面,Spring在运行时期把切面织入到Spring管理的bean中,代理类封装了目标类,并拦截被通知的方法调用,再把调用转发给真正的目标bean; 即:直到应用需要被代理的bean时,Spring才创建代理对象,因为Spring是运行时才创建代理对象,所以我们不需要特殊的编译器(ApplicationContext 从BeanFactory中加载所有bean的时候)来织入Spring AOP切面。 如下图:

转载请注明原文地址: https://www.6miu.com/read-2625222.html

最新回复(0)