Spring的DI和AOP

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

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

Spring的DI和AOP_第2张图片
不同于之前的自行创建,而是传入构造参数,这是依赖方式之一:①构造注入

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

通过ApplicationContext容器来读取代码运行时的上下文,来生成对应的bean,来解耦;
Spring的DI和AOP_第3张图片

这里额外提一下注入外部的值:
Spring的DI和AOP_第4张图片

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

一个简单的AOP服务:
Spring的DI和AOP_第6张图片

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

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

你可能感兴趣的:(Spring,AOP,DI,Spring)