spring IOC和AOP的理解

简介

Spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分

我们在使用Spring框架的过程中,其实就是为了使用IOC(依赖注入)和AOP(面向切面编程),这两个是Spring的灵魂。主要用到的设计模式有工厂模式和代理模式。IOC就是典型的工厂模式,通过sessionfactory去注入实例;AOP就是典型的代理模式的体现

IOC(Inverse of Control):控制反转,也可以称为依赖倒置

IOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期

实现:BeanFactory和ApplicationContext的区别_applicationcontext和defaultlistable-CSDN博客

  • 依赖

所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B

  • 倒置

因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了,所以,不倒置,意味着A要主动获取B,才能使用B;

倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。

举例:买衣服,如果你想买一件衣服,不倒置流程:你需要衣服;你做汽车去商城;在商城买你需要的衣服,倒置流程:你需要衣服;告知商家你需要的衣服;商家送货上门

IOC容器就相当于商城,在下面代码中,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!),当然咯,我们也可以使用注解来注入。Spring依赖注入的实现技术是:动态代理

package org.leadfar.web;  
public class UserAction{  
     private UserService userService;  
     public String login(){  
          userService.valifyUser(xxx);  
     }  
     public void setUserService(UserService userService){  
          this.userService = userService;  
     }  
}  

AOP:即面向切面编程

AOP的好处就是你只需要关注你的核心逻辑,其它事情可以交给切面类去处理,达到一种可配置的、可插拔的程序结构,增加代码的可维护性

从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!

将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去

Spring中 AOP代理由Spring的 IoC容器负责生成、管理,其依赖关系也由 IoC容器负责管理。因此,AOP代理可以直接使用容器中的其他 Bean实例作为目标,这种关系可由 IoC容器的依赖注入提供。Spring默认使用 Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。当需要代理的类不是代理接口的时候,Spring自动会切换为使用 CGLIB代理,也可强制使用 CGLIB

aop失效场景

私有方法调用、静态方法调用、final方法调用,类内部自调用,内部类方法调用

aop的使用场景

日志记录,参数校验,消息发送

applicationEventPublisher发送event事件,

实现InitializingBean的afterProperties方法实现策略模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring IOC (Inversion of Control) 是一种设计模式,用于管理和组织应用程序中的对象之间的依赖关系。它通过将控制权从应用程序代码中转移给一个容器,从而实现了松耦合和可维护性。在Spring框架中,IOC容器负责创建、组装和管理对象的生命周期。 举个例子来说明,假设我们有一个应用程序,其中包含了 User 和 Order 两个类。在传统的编程方式中,我们需要手动创建这些对象,并在需要的地方进行依赖注入。但在Spring IOC中,我们只需要在配置文件中定义好这些对象,并让容器管理它们的创建和销毁。当我们需要使用这些对象时,只需要从容器中获取即可。 例如,我们可以使用 `<bean>` 标签在配置文件中定义一个 User 对象: ``` <bean id="user" class="com.example.User"> <property name="name" value="John" /> <property name="age" value="25" /> </bean> ``` 然后,在代码中可以通过获取 `user` 对象的实例: ``` User user = (User) applicationContext.getBean("user"); ``` 这样,我们就实现了对象的创建和依赖注入,而不需要手动管理对象的生命周期。 接下来是AOP(Aspect-Oriented Programming),它是一种编程范式,用于解决在面向对象编程中横切关注点的问题。AOP通过将横切关注点(如日志记录、事务管理等)与主要业务逻辑分离,使得代码更加模块化和可维护。 举个例子来说明,假设我们有一个应用程序,其中包含了多个服务类,每个服务类都需要进行日志记录。在传统的编程方式中,我们需要在每个服务类的方法中添加日志记录的代码。但是在AOP中,我们可以通过定义一个切面(Aspect)来实现日志记录功能,并将其应用到需要的方法上。 例如,我们可以使用 Spring AOP 来实现日志记录功能。首先,我们需要引入`spring-boot-starter-aop`依赖。然后,在切面类中定义日志记录的逻辑: ``` @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void beforeMethod(JoinPoint joinPoint) { // 日志记录逻辑 System.out.println("Before method: " + joinPoint.getSignature().getName()); } } ``` 在上述例子中,我们使用 `@Before` 注解来定义在方法执行之前执行的逻辑。通过 `JoinPoint` 参数,我们可以获取到方法的签名信息并进行相应的处理。 最后,在需要应用日志记录的方法上添加相应的注解即可: ``` @Service public class UserService { @LogBeforeMethod public void addUser(User user) { // 添加用户逻辑 } } ``` 在上述例子中,我们使用 `@LogBeforeMethod` 注解来说明在该方法执行之前需要应用日志记录的切面。 通过以上的例子,我们可以看到Spring IOCAOP的作用和应用。IOC通过容器管理对象的创建和依赖注入,使得代码更加模块化和可维护;而AOP通过切面的方式实现横切关注点的功能,提高了代码的复用性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringIOCAOP理解之深入浅出(建议收藏)](https://blog.csdn.net/weixin_45105261/article/details/112004029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot 切面AOP实现权限校验:实例演示与注解全解](https://blog.csdn.net/chali1314/article/details/115317063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值