Spring基础概念IOC、DI、Bean和AOP

一、前言

IOC、DI和AOP属于Spring开发的核心思想,是学习Spring开发绕不开的基础知识点,下面将会结合网上的众家之言对它们进行一次总结。

二、IOC、DI、Bean和AOP的概念理解

2.1 IOC是什么
IoC(Inversion of Control,控制反转)并不是一种技术,只是一种思想,一个重要的面向对象的编程的法则—好莱坞法则:“别找我们,我们找你”,在实际编程中体现的便是,由IOC容器帮助对象找相应的依赖对象并注入,而不是由对象主动去找。这点可以用传统的应用编程来进行比较。传统的应用程序开发,都是在类的内部主动创建依赖对象,这样就导致了类与类之间的高度耦合,不利于测试和功能的复用;采用IoC容器之后,就可以把创建和查找依赖对象的控制权交给容器,由容器进行注入组合对象,这样实现了对象之间的松散耦合,便于测试和复用,使得程序的整个体系结构变得非常灵活。
控制反转和正转
控制正转:在传统的应用程序中,对象主动控制去直接获取依赖对象,就是正转。
控制反转:由容器来帮忙创建及注入依赖对象,就是反转。

2.2 DI是什么
DI(Dependency Injection依赖注入)直白的解释便是将依赖注入到需要依赖的对象,注入操作是在运行过程中动态的向对象提供需要依赖的对象。可以以对象TestA访问数据库的操作为例,在此前的代码编写过程中,需要我们在代码中自己编写代码来获得一个Connection对象。但是有了Spring的DI之后,我们只需要告诉Spring,TestA对象需要一个Connection对象,至于Connection对象构造的方法和时机,在TestA代码中并不需要为此负责。Spring会在适当的时候构造一个Connection对象,注入到TestA当中,解决了TestA对Connection的依赖关系。
DI(Dependency Injection依赖注入)实现的方式有四种,分别是:

  • 使用属性的setter方式注入(这是最常用的方式)。
  • 使用构造器注入。
  • 使用Field注入(用于注解方式)。
  • 采用自动装配。
    以上四种实现方式可以参考博客Spring中依赖注入的四种方式

2.3 Bean是什么
Bean可以理解为装配在一起的对象,也可以理解成Bean定义了一个组件,这个组件用于具体实现某个功能,而Bean提供了一个更为简便的方法来调用组件实现你需要的功能。下面以Bean使用的范例来进行说明:

//定义一个Bean
<bean id="userAction" class="com.neusoft.gmsbs.gms.user.action.UserAction"  
scope="prototype">        
        <property name="userBO" ref="userBO" />
</bean>
// id:标识该bean的名称,通过factory.getBean("id")来获得实例
// Class:该bean的类路径
// property:bean的属性,上面的意思表示在userAction中需要实现userBO依赖功能,可以通过setter注入完成

Bean的其它属性:

Singleton:默认为true,即单例模式,每次getBean("id")时获取的都是同一个实例,如果设置为false,则为原型模式,每次获取的都是新创建的实例。
Init-method:在bean实例化后要调用的方法(bean里定义好的方法)。
Destroy-method:bean从容器里删除之前要调用的方法。
Autowrite:其属性要通过何种方法进行属性的自动装配。

Bean的使用范例一:

ApplicationContext factory = new ClassPathXmlApplicationContext("beans.xml");
UserAction action= (UserAction)factory.getBean("userAction");  // 该操作等同于UserAction action = new UserAction()

Bean的使用范例二:

<bean id="m1" class="com.yang.myshow">
        <property name="p" ref="userAction"></property>  //在其它Bean中关联bean userAction
    </bean>
</beans>,不可避免的

2.4 AOP的概念理解
AOP(Aspect Oriented Programming面向切面编程)是OOP的延续和补充,被广泛用于处理一些具体横切性质的系统级服务,比如事务管理、安全检查、缓存、对象池管理等。下面以系统事务管理中系统操作数据库为例来对AOP进行说明。

在系统操作数据库的过程中,不可以避免的需要考虑到事务相关的内容。如果在每个方法中都新建一
个事务管理器,这将会给代码带来严重的耦合性。为了简化开发过程,可以将事务相关的代码抽取出
来做为一个独立的模块。通过AOP,每一个操作数据库的方法为一个链接点,这些连接点组成一个切
面。当程序运行到其中某个切点时,将事务管理模块顺势织入到对象中,通过通知功能,完成整个事
务管控的实现。这样一来,所有的数据库操作方法中不需要在单独关心事务管理的内容,只需要关注
自身的业务代码的实现即可。所有的事务管控相关的内容都可通过AOP的方式进行了实现。简化了代
码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点。

AOP的相关概念如下:

  • 通知:定义切面是什么,以及何时使用的概念。Spring中可以应用的5种类型通知如下:
    • 前置通知(Before):在目标方法被调用之前调用通知功能。
    • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
    • 返回通知(After-returning):在目标方法成功执行之后调用通知。
    • 异常通知(After-throwing):在目标方法抛出异常后调用通知。
    • 环绕通知(Around):通知包裹了被通知的方法,在通知的方法调用之前和调用之后执行自定义的行为。
  • 链接点:是在应用执行过程中能够插入切面的一个点。
  • 切点:切点定义了切面在何处要织入的一个或者多个连接点。
  • 切面:是通知和切点的结合。通知和切点共同定义了切面的全部内容。
  • 引入:引入允许我们向现有类添加新方法或属性。
  • 织入:是把切面应用到目标对象,并创建新的代理的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入。
    织入的生命期:
    • 编译期:在目标类编译时,切面被织入,这种方式需要特殊的编译器。
    • 类加载期:切面在目标加载到JVM时被织入,这种方式需要特殊的类加载器(class loader),这种类加载器可以在目标类被引入应用前增强该目标类的字节码。
    • 运行期:切面在应用运行到某个时刻时被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SPringAOP就是以这种方式织入切面的。

三、总结

本博客主要作为Spring Cloud初学者对Spring的基础概念进行了整理和理解,并不一定的深刻,希望正在阅读的你有帮助。

参考

1.深入理解Spring的两大特征(IOC和AOP)
2.Spring依赖注入的四种方式(重点是注解方式)
3.初识Spring的DI及其基本用法
4.Spring IOC 和 DI原理 (面试必备)
5.spring的DI
6.Spring中Bean及@Bean的理解
7.12.Spring Bean是什么
8.spring里面的bean到底是什么鬼

猜你喜欢

转载自blog.csdn.net/polo2044/article/details/83545056