什么是AOP?怎么理解AOP与IOC?

整理了半天的文档,就知道AOP是面向切面编程降低耦合度的。求大神解答

个人理解

IOC:控制反转(DI依赖注入),将以前由我们自己手动创建对象的过程交给了Spring,Spring帮助我们生产对象、管理对象、管理对象和对象之间的依赖关系。降低了代码的耦合度,方便我们后期对项目做维护。

三种注入方式:
1.setter注入
2.构造器注入
3.属性注入(注解)
@Autowired:默认根据类型进行匹配
@Resource:首先根据名称进行匹配,再根据类型进行匹配

自动装配autowire属性

AOP:面向切面(方便)编程,可以为某一类对象 进行监督和控制,也就是在调用这类对象的具体方法的前后去调用你指定的功能模块,从而达到对一个模块扩充的功能。可以通过注解或者XML文档进行实现。  

开发切面,切面里面写的功能模块,叫做通知。
前置通知@Before、后置通知@AfterReturning、最终通知@After、异常通知@AfterThrowing、环绕通知@Around

后置通知和最终通知的区别:
后置通知只有在方法正常执行后才会被调用,如果方法执行过程中报错,则不会执行后置通知,而是执行异常通知。
无论方法执行有没有报错,都会执行最终通知

AOP最重要的一个应用:Spring的事务管理器。

Spring的事务管理器就是一个切面,切面中的功能不再是计算时间、输出日志,而是管理事务。因为Spring的事务管理器要对一组数据库操作做事务控制。所以事务管理器需要切入到一个可以包含所有Dao操作的方法中,即Service方法。

Spring事务管理器的特点:所有的事务,要么同时提交,要么同时回滚。只要有一次失误失败,所有事务一起回滚。
JDBC事务的特点:每执行完一次数据库操作就提交一次事务。

按我片面的理解,面向对象是纵向变成,aop就是横线编程;

直接描述一下应用场景吧,然后自己慢慢理解。首先所谓面向切面编程你要理解他是要切哪里。而切的这个地方有什么特点。如果我要切这里,
是不会给我省下大量的重复性的代码。因为切的目的就是为了减少工作,规范流程。那么从最简单的控制数据库的事物开始。正常操作。我们要各种
tranction begin commit rollback,几乎每个业务里面都避免不了这些代码。那我们要切的地方,就是数据库操作,特点就是有事物开关。目的就是省去
手动控制事物。当然比如我想控制日志啊,记录操作记录登录记录啊。。这些需求我们就都可以切进去了。
如果从代码上的理解。简单的说你可以把每个事件分解成 before doing after,你要控制一个通用的逻辑在某一个位置上。