1、【切面AOP使用场景? AOP 代理了(三级缓存机制)?】
2、控制反转ioc与依赖注入DI(dependency injection)理解:
简单来说,之前我们需要一个对象,就需要创建一个对象,哪里用哪里创建,而通过spring的控制反转,它把对象都同意管理了起来,当我们需要用的时候,只需要通过注入的方式去取这个对象就好了,至于这个对象什么时候创建的,在哪里创建的,我们不用去关心,举个例子,在activit中,当spring把它集成过来之后,它里面所包含的对象就被spring给管理起来了,我们需要使用他的任务管理也好、模型管理也行,只需要向spring去取就行了,至于他的生命周期是如何管理的,我们不用去关心,开箱即用就好了
3、关于循环依赖问题
循环依赖这个问题现象很好描述,就是A里用了B,B里用了A,这种现象很常见,而且大多数情况下我们都会遇到这种现象,但大部门情况下没问题,
比如说,很多场景下,依赖注入时,我们选择的方式是成员变量注入的方式,这种方式就不会触发循环依赖,即便是出现A、B互相调用的情况,为什么呢?因为成员变量注入与setter方法注入,是在Bean创建完成之后,初始化对象的时候才会出现,而只有在构造方法注入时才会出现这种情况,因为构成方法注入时,是在实例化阶段发生的,而其他注入方式是在初始化阶段发生的,
而默认情况下,spring默认作用域是单例,在单例作用域下,在spring启动时,就把所有的bean都创建好了,同时在创建bean实例时,处理循环依赖问题
问题:{
The dependencies of some of the beans in the application context form a cycle:
mqttController defined in file [D:\CodeProject\ops-parent\ops-facility\target\classes\com\szy\ops\box\controller\MqttController.class]
↓
orderManager (field private com.szy.ops.workflow.service.IWfProcessService com.szy.ops.web.order.service.manager.OrderManager.processService)
↓
IWfProcessServiceImpl defined in file [D:\CodeProject\ops-parent\ops-facility\target\classes\com\szy\ops\workflow\service\impl\IWfProcessServiceImpl.class]
↓
taskServiceBean defined in class path resource [org/activiti/spring/boot/ProcessEngineAutoConfiguration.class]
┌─────┐
| processEngine defined in class path resource [org/activiti/spring/boot/ProcessEngineAutoConfiguration.class]
↑ ↓
| springProcessEngineConfiguration defined in class path resource [org/activiti/spring/boot/ProcessEngineAutoConfiguration.class]
↑ ↓
| activiti7Config (field private com.szy.ops.workflow.listener.GlobalEventListener com.szy.ops.workflow.config.Activiti7Config.globalEventListener)
↑ ↓
| globalEventListener (field private org.activiti.engine.HistoryService com.szy.ops.workflow.listener.GlobalEventListener.historyService)
↑ ↓
| historyServiceBean defined in class path resource [org/activiti/spring/boot/ProcessEngineAutoConfiguration.class]
└─────┘
}
这里就出现了循环依赖问题,怎么处理呢?就用@Lazy 注解就可以了,@Lazy简单来说就是懒加载,只有在被访问时才会被实例化、初始化,具体原理就是通过创建一个【代理对象】来实现延迟化
{
@Component
public class GlobalEventListener implements ActivitiEventListener {
@Autowired
@Lazy
private HistoryService historyService;
}
}