AOP意为面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充,AOP将一些程序抽象成切面,可以保证开发者在不修改源代码的前提下,
为系统中的业务组件添加某种通用功能。使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
五种增强/通知
前置通知(@Before)
后置通知(@Ater)
返回通知(@AfterReturning)
异常通知(@AfterThrowing)
环绕通知(@Around)
Spring Bean的生命周期
首先初始化bean实例,其次spring ioc容器对bean进行依赖注入,然后实现一系列spring bean的接口,
最后当一个bean不再被调用时将从bean容器中移除。
Spring框架中的单例bean是线程安全的吗,以及如何处理?
Spring容器本身没有提供Bean的线程安全策略,因此Spring容器中的Bean本身不具备线程安全的特性。
单例、原型
一般提供了通过ThreadLocal去解决线程安全的方法
使用ThreadLocal的好处
使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,
因为ThreadLocal为每个线程保存线程私有的数据。
Spring AOP底层实现,以及两种动态代理的实现
AOP的应用场景
性能监视、事务管理、安全检查、缓存、日志记录等
Spring AOP是基于动态代理的,分别基于两种动态代理机制: JDK动态代理和CGLIB动态代理
Spring AOP 优先对接口进行代理 (使用Jdk动态代理)如果目标对象没有实现任何接口,才会对类进行代理 (使用cglib动态代理)
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
@EnableAutoConfiguration借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,
如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
META-INF/spring.factories
AutoConfigurationImportSelector
它里边有一个方法:
getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes),
作用是加载这些定义在spring.factories中的Bean。
@SpringBootApplication等同于下面三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,
然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!