Spring5核心原理、JVM学习笔记(1)

本文介绍了Spring框架的设计初衷,强调了轻量级、依赖注入和面向切面编程的重要性。详细阐述了AOP的概念、使用方法,如切点定义、通知类型,并解析了AOP的实现原理,涉及BeanPostProcessor和代理对象的生成过程。通过AOP,可以实现代码解耦,提高复用性。
摘要由CSDN通过智能技术生成


一、Spring 的设计初衷

1、基于POJO 的轻量级和最小侵入性编程;

2、通过依赖注入和面向接口松耦合;

3、基于切面和惯性进行声明式编程;

4、通过切面和模板减少样板式代码;

二、AOP编程理念

1.AOP介绍

AOP即面向切面编程,是一种编程思想。它允许程序员对横切关注点或横切典型的职责分界线的行为进行模块化。其核心构造是切面,它将拿下影响到多个类的行为封装到可重用的模块中。在Spring中AOP集成到了Spring事务、日志和其他各种特性的上下文中。
AOP编程的常用场景有:Authentication 权限、Caching 缓存、Error handling 错误处理、Debugging  调试、Logging日志、Transactions 事务。
主要解决了面向对象编程部分场景代码重复率高的问题。

2.AOP使用方法

@Aspect声明这是一个切面Bean(类注解)
@Pointcut(“execution(切入点的地址)”) 注解,用来定义一个切点,即上文中所关注的某件事情的入口,切入点定义了事件触发时机。(方法注解)
@Before(“@Pointcut注解的方法名”)前置通知
@After(“@Pointcut注解的方法名”)后置通知
@Around(“@Pointcut注解的方法名”)环绕通知
@AfterReturn配置返回后通知。
@AfterThrowing 配置异常通知。

3.AOP原理

1.SpringAop接入由BeanPostProcessor后置处理器开始。
该后置处理器的掉用发生在SpringIoc容器完成Bean实例对象的创建的依赖注入之后。

public interface BeanPostProcessor {
    //bean初始化方法调用前被调用
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //bean初始化方法调用后被调用
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

2 AbstractAutowireCapableBeanFactory 类的CreateBean()和initializeBean()方法
为容器创建的Bean实例对象添加BeanPostPrecessor后置处理器。

	/**
	 * Initialize the given bean instance, applying factory callbacks
	 * as well as init methods and bean post processors.
	 * <p>Called from {@link #createBean} for traditionally defined beans,
	 * and from {@link #initializeBean} for existing bean instances.
	 */
	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
        // 回调BeanPostProcessor的postProcessBeforeInitialization方法
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
 
		try {
        // 调用 bean的 initializingBean的接口方法:afterPropertiesSet:调用自定义的initMethod。
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		...
		//  调用 BeanPostProcessor的 postProcessorAfterInitialization方法
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
 
		return wrappedBean;
	}

其中PostProcessorsAfterInitialization()方法中掉用了方法wrapIfNecessary()其中又掉用了poxyFactory.getProxy()方法获取代理。
代理对象执行目标方法
得到目标方法的拦截器链(增强器包装成拦截器MethodInterceptor)
利用拦截器的链式机制,依次进入每一个拦截器进行执行;

总结

Spring AOP(面向切面编程)是在Bean初始化过程中通过代理的机制生产一个代理对象,实现在切入点方法的前置、后置统一处理。从而达到解耦、提升代码复用率等作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值