认识IOC与AOP(Spring)

1、 控制反转(Inversion of Control,简称IOC):也称为依赖注入,是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度。
扩展: 程序的耦合:调用者与被调用者的依赖关系
         企业开发的原则:“编译时不依赖,运行时才依赖”

// 所谓的A类依赖B类
public class PersonServiceBean{
      private PersonDao personDao=new PersonDaoBean();
  
      public void save(Person person){
            personDao.save(person);
      }
}

         PersonDaoBean是在应用内部创建及维护的。
        所谓“控制反转”就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。
        依赖注入,当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类就可以改成:

public class PersonServiceBean{
      private PersonDao personDao;
      // 通过构造参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入
       public PersonServiceBean(PersonDao personDao ){
         this.personDao=personDao ;
      }
      public void save(Person person){
            personDao.save(person);
      }
}

        所谓依赖注入是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
        注入方法(把类需要的对象给它,作用类似于new)有3种:

  • 构造函数注入
  • 属性注入(注解)
    @Autowired:默认根据类型进行匹配
    @Resource:首先根据名称进行匹配,再根据类型进行匹配
  • 接口注入

2、面向切面编程(AOP),完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 :
(1)面向切面编程提供声明式事务管理
(2)spring支持用户自定义的切面
        AOP可以为某一类对象 进行监督和控制,也就是在调用这类对象的具体方法的前后去调用你指定的功能模块,从而达到对一个模块扩充的功能。可以通过注解或者XML文档进行实现。

        开发切面,切面里面写的功能模块,叫做通知。
        前置通知@Before、后置通知@AfterReturning、最终通知@After、异常通知@AfterThrowing、环绕通知@Around。(在目标方法中织入增强处理的方式不同)
        后置通知和最终通知的区别:
        后置通知只有在方法正常执行后才会被调用,如果方法执行过程中报错,则不会执行后置通知,而是执行异常通知。
        无论方法执行有没有报错,都会执行最终通知
Spring AOP配置元素:

<aop:config> AOP配置的顶层元素,大多数的<aop:*>元素必须包含在<aop:config>元素内
<aop:pointcut> 定义切点
<aop:aspect> 定义切面
<aop:after> 定义最终增强(不管被通知的方法是否执行成功)
<aop:after-returning>定义after-returning增强
<aop:after-throwing>定义after-throwing增强
<aop:around> 定义环绕增强
<aop:before> 定义前置增强
<aop:aspectj-autoproxy> 启动@AspectJ注解驱动的切面

        AOP最重要的一个应用:Spring的事务管理器。
        Spring的事务管理器就是一个切面,切面中的功能不再是计算时间、输出日志,而是管理事务。因为Spring的事务管理器要对一组数据库操作做事务控制。所以事务管理器需要切入到一个可以包含所有Dao操作的方法中,即Service方法。
        Spring事务管理器的特点:所有的事务,要么同时提交,要么同时回滚。只要有一次失误失败,所有事务一起回滚。
        JDBC事务的特点:每执行完一次数据库操作就提交一次事务。

理解“面向切面编程”
        比如在两个类中,可能都需要在每个方法中记录日志。按照面向对象的设计方法,我们就必须在两个日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这写重复的代码统一起来。
        也许会有人说,那好办啊,我们可以将这段代码写在一个独立的类中独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?
        这种在运行时,动态地将代码切入到类的制定方法、指定位置上的编程思想就是面向切面编程。
        简单地说就是不改变原程序的基础上为代码增加新的功能,对代码进行增强处理。

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