Spring中的IOC和AOP作为面试中的常问问题,之前对于这些概念的东西不是很熟悉,现在来重新复习加深一下印象
参考文章: 深入理解Spring两大特性:IoC和AOP
IOC:
IOC是spring两大核心概念之一,ioc提供了一个ioc的bean容器,它会去帮助我们创建对象,不需要我们手动的创建,ioc有个非常强大的功能,叫做di,也就是依赖注入,我们可以通过配置或者xml文件把我们想要注入对象依赖的其他的bean自动注入进去,通过type或者类型的方式帮助我们去注入,正因为有这个依赖注入的方式,使ioc有个非常强大的东西,叫做解耦合,举个例子:比如JDBCTemplate和SQLSessionFactory,这种bean注入到容器里面,是需要依赖数据源的,如果我们JDBCTemplate和Druid的数据源强耦合在一起,就有一个问题,就是我们如果要使用JDBCTemplate就必须使用Druid的数据源,那么依赖注入能够帮助我们在JDBC注入的时候主需要依赖一个BASESource接口,不需要去依赖具体的实现,好处就是,将来我们去注入一个Druid的数据源,就会自动注入给我们的JDBCTemplate,如果注入其他的,也是一样的,也会把其他的数据源装配到我们的JDBCTemplate,这样我们的JDBCTemplate和咱们的数据源就完全的解耦合了,它不强依赖于任何一个数据源,在Springmvc启动时,就会帮助我们把所有的bean都创建好,这样我们的程序运行时,就不需要再创建bean,这样运行速度就快了许多,还有ioc给我们管理了许多的bean,有单例的,可能也会存在多例的,但是绝大部分是单例的,但是service,controller,mapper都是只有一份的,我们要用的时候就直接注入就好了,我们不需要独立的去写这些类单例,这样节省了许多的时间。
AOP:
aop是面向切面编程,同时也是一种思想,在日常的工作之中,我们会使用到很多的重复性的代码,比如说事物、日志,我们需要再很多类里同时把这些代码写进去,这样是非常麻烦的,我们要在所有的service中开启事物,提交事物,回滚事物,这些事情我们都要写,我们可不可以不写,当然可以,spring中的aop就为我们提供了这种方式,我们可以把这些共有的代码切入出来,然后放到我们需要的切入的类中,这样极大的方便了代码的书写,减少了代码的冗余性,提供了复用性,这种aop的实现是依靠动态代理,将来我们要代理的对象有接口,那么我们就使用java的原生的动态代理来实现完成动态代理的创建,如果没有实现任何的接口,就使用cglib接口完成动态代理的创建,在日常工作中,最常用的也就是事物和日志,但是我觉得ioc和aop在项目中是无处不在的,这也是spring的思想那么流行的原因。