Spring基本知识

1. 概念及核心

使用spring久了,会突然间想问,为什么要使用spring?思考这个问题的答案,就会涉及到spring的核心价值:

  1. IoC,控制反转、依赖注入。它管理容器中对象的依赖关系。我的理解就是扁平化管理,看起来是扁平的,想要什么对象直接和Spring说就可以拿到,每个提供服务的对象自己初始化自己。IoC之所以漂亮,它就像工地的吊塔,管理物体的所有位置。

  2. AOP,面向切面编程。AOP应用在:所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等需要统一处理的逻辑上,使用切面编程,代码耦合度最小。AspectJ: 编译时增强进行AOP;GCLIB:运行时生成某个类的子类进行AOP。当被AOP的bean有实现接口时,默认用java的代理;否则用GClib代理。

Spring的设计理念是轻量级的,不要求使用者依赖Spring框架的东西。

Spring Bean的初始化过程:

2. 常用特性

让Spring Bean在初始化或释放时,做些事情

有3种方式:

  1. xml中配置bean,并指定init-method和destory-method方法,但是由于现在都使用注解配置bean,所以这种方式不常用。
  2. bean实现InitializingBean和DisposableBean接口,这种方式也不错。但是要写比较多的代码。
  3. 给方法注解上@PostConstruct@PreDestroy,这种方式用起来最方便。

当spring容器关闭时,做些事情

1)如果是某个bean的销毁,可以配置其destory方法

2)如果是整个context销毁时,可以实现ApplicationListener 接口

怎样把一个方法变成异步调用?

在方法上注解上@Async,返回值用Future就可以了

spring带的定时任务执行器

实际上和ScheduledThreadPool差不多,方便的是通过注解一个方法就可以把这个方法定时任务执行起来。

缺点:整个Spring容器共享一个线程池,如果线程池阻塞住了,就麻烦了

自定义spring扫描注解,初始化bean

例如,实现一个自定义@MyAnnotation的注解,当一个类上面注解了这个,就会对这个类做一些事情。

扫描器:ClassPathBeanDefinitionScanner,直接new并设置setResourceLoader(applicationContext),重写scan方法

1)调用findCandidateComponents(basePackage)拿到该包下所有的bean(BeanDefinition)

2)对于需要处理的bean,处理后创建一个beanDefinitionHolder(这个相当于xml配置里面的bean)然后registerBeanDefinition到BeanDefinitionRegistry中

文档更新时间: 2018-11-10 22:55   作者:nick