Spring面试浅谈
面试中的Spring的IOC和AOP问题
当碰到这类问题时可以参考我以下的回答:
IOC是spring两大核心概念之一,IOC给我们提供了一个bean容器,容器去帮助我们创建对象,不需要我们手动创建。IOC容器其实有一个非常强大的功能叫DI,依赖注入,我们可以通过写java代码或者xml配置的方式把我们想要注入对象所依赖的其他的bean注入进去,它是通过type或者是类型的方式帮助我们注入,正是有了这个依赖注入,使得我们IOC有个非常强大的东西,叫做解耦,我可以给您举个例子,比如我们的JDBC的Templete,像这种bean,如果我们要把他注入到容器里面,它需要依赖一个数据源的,如果我们jcbcTemplete
和德鲁伊特数据源,强耦合在一起,会导致一个问题,我们要用jdbcTemplete必须要使用德鲁伊的数据源,依赖注入可以帮助我们在jdbc注入的时候,只需要让他依赖一个datasource接口就行了,不需要让他依赖具体的实现,这样的好处是将来我们如果给容器里面注入一个德鲁伊特数据源,他自动就会注入给我们的jdbcTemplete。这样我们jdbcTemplete和我们的数据源就已经完全解耦合,他不强依赖于任何数据源,springmvc在启动的时候就会把所有的bean创建好,这样程序运行速度就会更快。IOC容器中给我们管理了很多的bean,这里面有单例的,可能也会存在多例的,但是绝大部分是单例的,这样我们的service、mapper、controller,在我们的容器里面都是只有一份,用的时候直接注入就行了,我们不需要为这些类去独立写单例,节省了很多时间,实现了面向接口编程这是我理解的IOC。接下来讲讲aop,aop是面向切面编程,他同样是一种思想,非常重要。aop咱们再日常工作中会遇到很多重复的代码,比如说事务、日志,我们需要在很多类里面同时把这些代码全部写进去,这样的话是非常麻烦的。比如说事务,我们需要在所有的service层要开启事务、提交、回滚。那么能不能不写呢,是可以的,spring的aop就给我们提供了这些方式。我们可以把这些共有的代码抽离出来,然后切入到我们想要切入的类里面,这样极大的方便了我们 的代码书写,减少了我们的冗余代码,提高了代码复用性。当然aop的实现是依赖动态代理实现的,如果我们将来要代理的对象有接口,那就使用jdk动态代理,来完成这个动态代理的创建。如果没有实现任何接口,他会采用cglib技术进行动态代理创建。然后代理的底层其实是反射。反射就是在运行状态中,根据类名获取它的属性和方法,根据对象,调用它的属性和方法。通过Method.invoke()执行方法。