• Java 随笔 代理模式 3-cglib


    0. 学习、工作两头都在推进度是有点累的

    cglib底层使用的是asm
    asm简介
    cglib简介 Code Generation Library
    enhancerKey代理类生成细节及其名称拼接方式
    enhancerKey代理类、需要增强类的代理类生成流程
    关于enhancerKey的擦边球
    对每种Callback接口的实践
    cglib中Enhancer简单使用

    1. 私有静态变量Enhancer.EnhancerKey在ioc过程中的初始化

    • Enhancer#KEY_FACTORY变量并不在new的初始化,早在ioc阶段就初始化了
    • 把Enhancer.EnhancerKey放在前面是因为:Ehancer创建增强的子类的逻辑代码跟EnhancerKey初始化无异
    • 用户自己的类的代理过程跟Enhancer.EnhancerKey是高度相似的(参考EnhancerKey的代理即可)

    1.1 ioc过程中BeanFactory的PostProcessor钩子的环节初始化这个EnhancerKey

    // org.springframework.context.support.AbstractApplicationContext#refresh
    	@Override
    	public void refresh() throws BeansException, IllegalStateException {
    		synchronized (this.startupShutdownMonitor) {
    			// Prepare this context for refreshing.
    			prepareRefresh();
    
    			// Tell the subclass to refresh the internal bean factory.
    			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
    			// Prepare the bean factory for use in this context.
    			prepareBeanFactory(beanFactory);
    
    			try {
    				// Allows post-processing of the bean factory in context subclasses.
    				postProcessBeanFactory(beanFactory);
    
    				// step into ...
    				// 本身EnhancerKey就是一个被代理生成的keyFactoryBean->通过postProcessor钩子初始化
    				// 再加上,该bean必须早于其他需要cglib代理的bean初始化 -> 就在这个阶段做了
    				// Invoke factory processors registered as beans in the context.
    				invokeBeanFactoryPostProcessors(beanFactory);
    
    				// Register bean processors that intercept bean creation.
    				registerBeanPostProcessors(beanFactory);
    
    				// Initialize message source for this context.
    				initMessageSource();
    
    				// Initialize event multicaster for this context.
    				initApplicationEventMulticaster();
    
    				// Initialize other special beans in specific context subclasses.
    				onRefresh();
    
    				// Check for listener beans and register them.
    				registerListeners();
    
    				// Instantiate all remaining (non-lazy-init) singletons.
    				finishBeanFactoryInitialization(beanFactory);
    
    				// Last step: publish corresponding event.
    				finishRefresh();
    			}
    
    			catch (BeansException ex) {
    				if (logger.isWarnEnabled()) {
    					logger.warn("Exception encountered during context initialization - " +
    							"cancelling refresh attempt: " + ex);
    				}
    
    				// Destroy already created singletons to avoid dangling resources.
    				destroyBeans();
    
    				// Reset 'active' flag.
    				cancelRefresh(ex);
    
    				// Propagate exception to caller.
    				throw ex;
    			}
    
    			finally {
    				// Reset common introspection caches in Spring's core, since we
    				// might not ever need metadata for singleton beans anymore...
    				resetCommonCaches();
    			}
    		}
    	}
    	
    	// org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
    	/**
    	 * Instantiate and invoke all registered BeanFactoryPostProcessor beans,
    	 * respecting explicit order if given.
    	 * 

    Must be called before singleton instantiation. */ protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // step into ... // beanFactory的postProcessor钩子调用 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor) if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } } // org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List) public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // Invoke BeanDefinitionRegistryPostProcessors first, if any. Set<String> processedBeans = new HashSet<>(); if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; registryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else { regularPostProcessors.add(postProcessor); } } // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let the bean factory post-processors apply to them! // Separate between BeanDefinitionRegistryPostProcessors that implement // PriorityOrdered, Ordered, and the rest. List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear. boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); } // step into ... // Now, invoke the postProcessBeanFactory callback of all processors handled so far. invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { // Invoke factory processors registered with the context instance. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let the bean factory post-processors apply to them! String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, // Ordered, and the rest. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (processedBeans.contains(ppName)) { // skip - already processed in first phase above } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // Next, invoke the BeanFactoryPostProcessors that implement Ordered. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // Finally, invoke all other BeanFactoryPostProcessors. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); // Clear cached merged bean definitions since the post-processors might have // modified the original metadata, e.g. replacing placeholders in values... beanFactory.clearMetadataCache(); } // org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(java.util.Collection, org.springframework.beans.factory.config.ConfigurableListableBeanFactory) private static void invokeBeanFactoryPostProcessors( Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) { for (BeanFactoryPostProcessor postProcessor : postProcessors) { // step into ... postProcessor.postProcessBeanFactory(beanFactory); } } // org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanFactory /** * Prepare the Configuration classes for servicing bean requests at runtime * by replacing them with CGLIB-enhanced subclasses. */ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { int factoryId = System.identityHashCode(beanFactory); if (this.factoriesPostProcessed.contains(factoryId)) { throw new IllegalStateException( "postProcessBeanFactory already called on this post-processor against " + beanFactory); } this.factoriesPostProcessed.add(factoryId); if (!this.registriesPostProcessed.contains(factoryId)) { // BeanDefinitionRegistryPostProcessor hook apparently not supported... // Simply call processConfigurationClasses lazily at this point then. processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory); } // step into ... // 好熟悉的字眼 enhanceConfigurationClasses(beanFactory); beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory)); } // org.springframework.context.annotation.ConfigurationClassPostProcessor#enhanceConfigurationClasses /** * Post-processes a BeanFactory in search of Configuration class BeanDefinitions; * any candidates are then enhanced by a {@link ConfigurationClassEnhancer}. * Candidate status is determined by BeanDefinition attribute metadata. * @see ConfigurationClassEnhancer */ public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) { Map<String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap<>(); for (String beanName : beanFactory.getBeanDefinitionNames()) { BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName); Object configClassAttr = beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE); MethodMetadata methodMetadata = null; if (beanDef instanceof AnnotatedBeanDefinition) { methodMetadata = ((AnnotatedBeanDefinition) beanDef).getFactoryMethodMetadata(); } if ((configClassAttr != null || methodMetadata != null) && beanDef instanceof AbstractBeanDefinition) { // Configuration class (full or lite) or a configuration-derived @Bean method // -> resolve bean class at this point... AbstractBeanDefinition abd = (AbstractBeanDefinition) beanDef; if (!abd.hasBeanClass()) { try { abd.resolveBeanClass(this.beanClassLoader); } catch (Throwable ex) { throw new IllegalStateException( "Cannot load configuration class: " + beanDef.getBeanClassName(), ex); } } } if (ConfigurationClassUtils.CONFIGURATION_CLASS_FULL.equals(configClassAttr)) { if (!(beanDef instanceof AbstractBeanDefinition)) { throw new BeanDefinitionStoreException("Cannot enhance @Configuration bean definition '" + beanName + "' since it is not stored in an AbstractBeanDefinition subclass"); } else if (logger.isInfoEnabled() && beanFactory.containsSingleton(beanName)) { logger.info("Cannot enhance @Configuration bean definition '" + beanName + "' since its singleton instance has been created too early. The typical cause " + "is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " + "return type: Consider declaring such methods as 'static'."); } configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef); } } if (configBeanDefs.isEmpty()) { // nothing to enhance -> return immediately return; } ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer(); for (Map.Entry<String, AbstractBeanDefinition> entry : configBeanDefs.entrySet()) { AbstractBeanDefinition beanDef = entry.getValue(); // If a @Configuration class gets proxied, always proxy the target class beanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE); // Set enhanced subclass of the user-specified bean class Class<?> configClass = beanDef.getBeanClass(); // step into ... // 返回这个增强后的类 // configClass : 启动类 Class<?> enhancedClass = enhancer.enhance(configClass, this.beanClassLoader); if (configClass != enhancedClass) { if (logger.isTraceEnabled()) { logger.trace(String.format("Replacing bean definition '%s' existing class '%s' with " + "enhanced class '%s'", entry.getKey(), configClass.getName(), enhancedClass.getName())); } beanDef.setBeanClass(enhancedClass); } } } // org.springframework.context.annotation.ConfigurationClassEnhancer#enhance /** * Loads the specified class and generates a CGLIB subclass of it equipped with * container-aware callbacks capable of respecting scoping and other bean semantics. * @return the enhanced subclass */ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader) { if (EnhancedConfiguration.class.isAssignableFrom(configClass)) { if (logger.isDebugEnabled()) { logger.debug(String.format("Ignoring request to enhance %s as it has " + "already been enhanced. This usually indicates that more than one " + "ConfigurationClassPostProcessor has been registered (e.g. via " + "). This is harmless, but you may " + "want check your configuration and remove one CCPP if possible", configClass.getName())); } return configClass; } // step into ... // 创建增强类 Class<?> enhancedClass = createClass(newEnhancer(configClass, classLoader)); if (logger.isTraceEnabled()) { logger.trace(String.format("Successfully enhanced %s; enhanced class name is: %s", configClass.getName(), enhancedClass.getName())); } return enhancedClass; }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355

    1.2 初始化第一个Enhancer实例的同时将完成EnhancerKey的初始化

    • EnhancerKey类型使用 private static final ,因为此时初始化过后再new Enhancer实例的时候将不需要初始化EnhancerKey
    	// org.springframework.context.annotation.ConfigurationClassEnhancer#newEnhancer
    	/**
    	 * Creates a new CGLIB {@link Enhancer} instance.
    	 */
    	private Enhancer newEnhancer(Class<?> configSuperClass, @Nullable ClassLoader classLoader) {
    		// step into ...
    		// 就是这里第一次使用(此时应用还是处于启动阶段)
    		Enhancer enhancer = new Enhancer();
    		enhancer.setSuperclass(configSuperClass);
    		enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});
    		enhancer.setUseFactory(false);
    		enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
    		enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));
    		enhancer.setCallbackFilter(CALLBACK_FILTER);
    		enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
    		return enhancer;
    	}
    	
    	// org.springframework.cglib.proxy.Enhancer#KEY_FACTORY
    	private static final EnhancerKey KEY_FACTORY =
    		// step into ...
    		(EnhancerKey) KeyFactory.create(EnhancerKey.class, KeyFactory.HASH_ASM_TYPE, null);
    	
    	// org.springframework.cglib.core.KeyFactory#create(java.lang.Class, org.springframework.cglib.core.KeyFactoryCustomizer, java.util.List)
    	public static KeyFactory create(Class keyInterface, KeyFactoryCustomizer first, List<KeyFactoryCustomizer> next) {
    		// step into ...
    		return create(keyInterface.getClassLoader(), keyInterface, first, next);
    	}
    	
    	// org.springframework.cglib.core.KeyFactory#create(java.lang.ClassLoader, java.lang.Class, org.springframework.cglib.core.KeyFactoryCustomizer, java.util.List)
    	public static KeyFactory create(ClassLoader loader, Class keyInterface, KeyFactoryCustomizer customizer,
    			List<KeyFactoryCustomizer> next) {
    		// public static class Generator extends AbstractClassGenerator
    		// 该类是KeyFactory内部类,也就是gen也是用于生成key的
    		Generator gen = new Generator();
    		gen.setInterface(keyInterface);
    		
    		// 这里是spring为后面处理做准备(更好的结合spring&cglib)
    		// SPRING PATCH BEGIN
    		gen.setContextClass(keyInterface);
    		// SPRING PATCH END
    
    		if (customizer != null) {
    			gen.addCustomizer(customizer);
    		}
    		if (next != null && !next.isEmpty()) {
    			for (KeyFactoryCustomizer keyFactoryCustomizer : next) {
    				gen.addCustomizer(keyFactoryCustomizer);
    			}
    		}
    		gen.setClassLoader(loader);
    		// step into ...
    		return gen.create();
    	}
    	
    	// org.springframework.cglib.core.KeyFactory.Generator#create
    	public KeyFactory create() {
    		// 获取被代理类实现的接口的名字(这里是Enhancer$EnhancerKey)作为代理类的类名前缀
    		setNamePrefix(keyInterface.getName());
    		// step into ...
    		return (KeyFactory) super.create(keyInterface.getName());
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    1.3 AbstractClassGenerator:生成Enhancer.EnhancerKey的代理类字节码并且defineClass

    	// org.springframework.cglib.core.AbstractClassGenerator#create
    	protected Object create(Object key) {
    		try {
    			ClassLoader loader = getClassLoader();
    			// 这几个map初始状态都是空的
    			Map<ClassLoader, ClassLoaderData> cache = CACHE;
    			ClassLoaderData data = cache.get(loader);
    			if (data == null) {
    				synchronized (AbstractClassGenerator.class) {
    					cache = CACHE;
    					data = cache.get(loader);
    					if (data == null) {
    						// newMap 覆盖 oldMap
    						Map<ClassLoader, ClassLoaderData> newCache = new WeakHashMap<ClassLoader, ClassLoaderData>(cache);
    						// step into ...
    						// 创建一个classloaderData
    						data = new ClassLoaderData(loader);
    						newCache.put(loader, data);
    						// 刷新这个缓存oldmap为newMap
    						CACHE = newCache;
    					}
    				}
    			}
    			this.key = key;
    			Object obj = data.get(this, getUseCache());
    			if (obj instanceof Class) {
    				return firstInstance((Class) obj);
    			}
    			return nextInstance(obj);
    		}
    		catch (RuntimeException | Error ex) {
    			throw ex;
    		}
    		catch (Exception ex) {
    			throw new CodeGenerationException(ex);
    		}
    	}
    	
    	// org.springframework.cglib.core.AbstractClassGenerator.ClassLoaderData
    	// 包装classloader的一个内部类
    	// 声明了两个函数,但还没有开始调用
    	protected static class ClassLoaderData {
    
    		private final Set<String> reservedClassNames = new HashSet<String>();
    
    
    		// 其实就是代理类的cache
    		/**
    		 * {@link AbstractClassGenerator} here holds "cache key" (e.g. {@link org.springframework.cglib.proxy.Enhancer}
    		 * configuration), and the value is the generated class plus some additional values
    		 * (see {@link #unwrapCachedValue(Object)}.
    		 * 

    The generated classes can be reused as long as their classloader is reachable.

    *

    Note: the only way to access a class is to find it through generatedClasses cache, thus * the key should not expire as long as the class itself is alive (its classloader is alive).

    */
    private final LoadingCache<AbstractClassGenerator, Object, Object> generatedClasses; /** * Note: ClassLoaderData object is stored as a value of {@code WeakHashMap} thus * this classLoader reference should be weak otherwise it would make classLoader strongly reachable * and alive forever. * Reference queue is not required since the cleanup is handled by {@link WeakHashMap}. */ private final WeakReference<ClassLoader> classLoader; private final Predicate uniqueNamePredicate = new Predicate() { public boolean evaluate(Object name) { return reservedClassNames.contains(name); } }; // 第一个函数(获取当前Generator的key,代理类的cache-key) // 明白了吧,这里也是给缓存map用的 private static final Function<AbstractClassGenerator, Object> GET_KEY = new Function<AbstractClassGenerator, Object>() { public Object apply(AbstractClassGenerator gen) { // 返回 AbstractClassGenerator.key return gen.key; } }; public ClassLoaderData(ClassLoader classLoader) { if (classLoader == null) { throw new IllegalArgumentException("classLoader == null is not yet supported"); } //设置类加载器 弱引用 即在下次垃圾回收时就会进行回收 this.classLoader = new WeakReference<ClassLoader>(classLoader); // 第二个函数 Function<AbstractClassGenerator, Object> load = new Function<AbstractClassGenerator, Object>() { public Object apply(AbstractClassGenerator gen) { // 注意:这里只是声明...后面才会调用...埋下伏笔 // 调用this.generate生成代理类 Class klass = gen.generate(ClassLoaderData.this); // 返回包装后的代理类 return gen.wrapCachedClass(klass); } }; // step into ... // 现在让我们回到new ClassLoaderData(loader) generatedClasses = new LoadingCache<AbstractClassGenerator, Object, Object>(GET_KEY, load); } } // org.springframework.cglib.core.AbstractClassGenerator#create protected Object create(Object key) { try { ClassLoader loader = getClassLoader(); Map<ClassLoader, ClassLoaderData> cache = CACHE; ClassLoaderData data = cache.get(loader); if (data == null) { synchronized (AbstractClassGenerator.class) { cache = CACHE; data = cache.get(loader); if (data == null) { Map<ClassLoader, ClassLoaderData> newCache = new WeakHashMap<ClassLoader, ClassLoaderData>(cache); data = new ClassLoaderData(loader); newCache.put(loader, data); CACHE = newCache; } } } this.key = key; // step into ... Object obj = data.get(this, getUseCache()); if (obj instanceof Class) { return firstInstance((Class) obj); } return nextInstance(obj); } catch (RuntimeException | Error ex) { throw ex; } catch (Exception ex) { throw new CodeGenerationException(ex); } } // org.springframework.cglib.core.AbstractClassGenerator.ClassLoaderData protected static class ClassLoaderData { // 前面提到了,这里不赘述了 ... public Object get(AbstractClassGenerator gen, boolean useCache) { if (!useCache) { return gen.generate(ClassLoaderData.this); } else { // step into ... // 注意generatedClasses是内部类变量 // private final LoadingCache generatedClasses; Object cachedValue = generatedClasses.get(gen); return gen.unwrapCachedValue(cachedValue); } } } public class LoadingCache<K, KK, V> { protected final ConcurrentMap<KK, Object> map; protected final Function<K, V> loader; // 这位就是 AbstractClassGenerator$ClassLoaderData$2 protected final Function<K, KK> keyMapper; public static final Function IDENTITY = new Function() { public Object apply(Object key) { return key; } }; public LoadingCache(Function<K, KK> keyMapper, Function<K, V> loader) { this.keyMapper = keyMapper; this.loader = loader; this.map = new ConcurrentHashMap(); } // org.springframework.cglib.core.internal.LoadingCache#get // 从加载过的代理类里边找(cache) public V get(K key) { // this.keyMapper即AbstractClassGenerator$ClassLoaderData$2@xxxx类型的(跟前面ClassLoaderData的一个本地变量不谋而合) // 这意味者这里调用的apply函数,其实前面声明好的第一个函数(从缓存中找代理类) KK cacheKey = this.keyMapper.apply(key); // this.map初始状态也是空的 Object v = this.map.get(cacheKey); // step into ... // 找不到->只能创建一个啦 return v != null && !(v instanceof FutureTask) ? v : this.createEntry(key, cacheKey, v); } // org.springframework.cglib.core.internal.LoadingCache#createEntry protected V createEntry(final K key, KK cacheKey, Object v) { boolean creator = false; FutureTask task; Object result; if (v != null) { task = (FutureTask)v; } else { task = new FutureTask(new Callable<V>() { public V call() throws Exception { // 调用ClassLoaderData提前声明好的第二个函数 -> 生成代理类 return LoadingCache.this.loader.apply(key); } }); result = this.map.putIfAbsent(cacheKey, task); if (result == null) { creator = true; // 调用task的run task.run(); } else { if (!(result instanceof FutureTask)) { return result; } task = (FutureTask)result; } } try { result = task.get(); } catch (InterruptedException var9) { throw new IllegalStateException("Interrupted while loading cache item", var9); } catch (ExecutionException var10) { Throwable cause = var10.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException)cause; } throw new IllegalStateException("Unable to load cache item", cause); } if (creator) { this.map.put(cacheKey, result); } return result; } } // org.springframework.cglib.core.AbstractClassGenerator#generate protected Class generate(ClassLoaderData data) { Class gen; // private static final ThreadLocal CURRENT = new ThreadLocal(); Object save = CURRENT.get(); CURRENT.set(this); try { ClassLoader classLoader = data.getClassLoader(); if (classLoader == null) { throw new IllegalStateException("ClassLoader is null while trying to define class " + getClassName() + ". It seems that the loader has been expired from a weak reference somehow. " + "Please file an issue at cglib's issue tracker."); } synchronized (classLoader) { // step into ... // 生成并赋值代理类的名字 // getUniqueNamePredicate:AbstractClassGenerator$ClassLoaderData$1@4503 String name = generateClassName(data.getUniqueNamePredicate()); data.reserveName(name); this.setClassName(name); } if (attemptLoad) { try { gen = classLoader.loadClass(getClassName()); return gen; } catch (ClassNotFoundException e) { // ignore } } byte[] b = strategy.generate(this); String className = ClassNameReader.getClassName(new ClassReader(b)); ProtectionDomain protectionDomain = getProtectionDomain(); synchronized (classLoader) { // just in case // SPRING PATCH BEGIN // 返回代理类的Class gen = ReflectUtils.defineClass(className, b, classLoader, protectionDomain, contextClass); // SPRING PATCH END } return gen; } catch (RuntimeException | Error ex) { throw ex; } catch (Exception ex) { throw new CodeGenerationException(ex); } finally { CURRENT.set(save); } } // org.springframework.cglib.core.AbstractClassGenerator#generateClassName // org.springframework.cglib.proxy.Enhancer$EnhancerKey private String namePrefix; private Source source; protected static class Source { // org.springframework.cglib.core.KeyFactory String name; public Source(String name) { this.name = name; } } // org.springframework.cglib.proxy.Enhancer$EnhancerKey private Object key; private String generateClassName(Predicate nameTestPredicate) { // step into ... return namingPolicy.getClassName(namePrefix, source.name, key, nameTestPredicate); } // org.springframework.cglib.core.DefaultNamingPolicy#getClassName protected String getTag() { return "ByCGLIB"; } // org.springframework.cglib.core.SpringNamingPolicy#getTag @Override protected String getTag() { return "BySpringCGLIB"; } // false private static final boolean STRESS_HASH_CODE = Boolean.getBoolean("org.springframework.cglib.test.stressHashCodes"); public String getClassName(String prefix, String source, Object key, Predicate names) { if (prefix == null) { prefix = "org.springframework.cglib.empty.Object"; } else if (prefix.startsWith("java")) { prefix = "$" + prefix; } // 这里的source即Enhancer的全限定类名 String base = prefix + "$$" + source.substring(source.lastIndexOf(46) + 1) + this.getTag() + "$$" + Integer.toHexString(STRESS_HASH_CODE ? 0 : key.hashCode()); // org.springframework.cglib.proxy.Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f String attempt = base; for(int var7 = 2; names.evaluate(attempt); attempt = base + "_" + var7++) { } // 最终拼接的代理类名: // org.springframework.cglib.proxy.Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f return attempt; } // org.springframework.cglib.core.AbstractClassGenerator#generate protected Class generate(ClassLoaderData data) { Class gen; Object save = CURRENT.get(); CURRENT.set(this); try { ClassLoader classLoader = data.getClassLoader(); if (classLoader == null) { throw new IllegalStateException("ClassLoader is null while trying to define class " + getClassName() + ". It seems that the loader has been expired from a weak reference somehow. " + "Please file an issue at cglib's issue tracker."); } synchronized (classLoader) { String name = generateClassName(data.getUniqueNamePredicate()); data.reserveName(name); this.setClassName(name); } if (attemptLoad) { try { gen = classLoader.loadClass(getClassName()); return gen; } catch (ClassNotFoundException e) { // ignore } } // 执行执行生成代理类的字节码(数组) // 其实就是cglib操作asm的api生成代理类的class文件 // 这里略过.... byte[] b = strategy.generate(this); String className = ClassNameReader.getClassName(new ClassReader(b)); ProtectionDomain protectionDomain = getProtectionDomain(); synchronized (classLoader) { // just in case // SPRING PATCH BEGIN // 将生成的代理类的字节码加载到vm方法区 gen = ReflectUtils.defineClass(className, b, classLoader, protectionDomain, contextClass); // SPRING PATCH END } return gen; } catch (RuntimeException | Error ex) { throw ex; } catch (Exception ex) { throw new CodeGenerationException(ex); } finally { CURRENT.set(save); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390

    1.4 AbstractClassGenerator:创建Enhancer.EnhancerKey的代理类实例

    	// org.springframework.cglib.core.AbstractClassGenerator#create
    	protected Object create(Object key) {
    		try {
    			ClassLoader loader = getClassLoader();
    			Map<ClassLoader, ClassLoaderData> cache = CACHE;
    			ClassLoaderData data = cache.get(loader);
    			if (data == null) {
    				synchronized (AbstractClassGenerator.class) {
    					cache = CACHE;
    					data = cache.get(loader);
    					if (data == null) {
    						Map<ClassLoader, ClassLoaderData> newCache = new WeakHashMap<ClassLoader, ClassLoaderData>(cache);
    						data = new ClassLoaderData(loader);
    						newCache.put(loader, data);
    						CACHE = newCache;
    					}
    				}
    			}
    			this.key = key;
    			Object obj = data.get(this, getUseCache());
    			if (obj instanceof Class) {
    				// step into ...
    				// 经过前面的走读,我们直到这个Obj其实是代理类的Class实例
    				return firstInstance((Class) obj);
    			}
    			// 后面通过这个enhancerKey工厂生成cache-key的代理类生成都走这里
    			return nextInstance(obj);
    		}
    		catch (RuntimeException | Error ex) {
    			throw ex;
    		}
    		catch (Exception ex) {
    			throw new CodeGenerationException(ex);
    		}
    	}
    	
    	// org.springframework.cglib.core.KeyFactory.Generator#firstInstance
    	protected Object firstInstance(Class type) {
    		// step into ...
    		return ReflectUtils.newInstance(type);
    	}
    	
    	// org.springframework.cglib.core.ReflectUtils#newInstance(java.lang.Class)
    	public static Object newInstance(Class type) {
    		return newInstance(type, Constants.EMPTY_CLASS_ARRAY, null);
    	}
    	public static Object newInstance(Class type, Class[] parameterTypes, Object[] args) {
    		return newInstance(getConstructor(type, parameterTypes), args);
    	}
    	public static Object newInstance(final Constructor cstruct, final Object[] args) {
    		boolean flag = cstruct.isAccessible();
    		try {
    			if (!flag) {
    				cstruct.setAccessible(true);
    			}
    			// 通过代理类的构造反射来创建其实例
    			Object result = cstruct.newInstance(args);
    			return result;
    		}
    		catch (InstantiationException e) {
    			throw new CodeGenerationException(e);
    		}
    		catch (IllegalAccessException e) {
    			throw new CodeGenerationException(e);
    		}
    		catch (InvocationTargetException e) {
    			throw new CodeGenerationException(e.getTargetException());
    		}
    		finally {
    			if (!flag) {
    				cstruct.setAccessible(flag);
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    1.5 EnhancerKey代理类(反编译后)

    package org.springframework.cglib.proxy;
    
    import org.springframework.asm.Type;
    import org.springframework.cglib.core.KeyFactory;
    import org.springframework.cglib.core.WeakCacheKey;
    import org.springframework.cglib.proxy.Enhancer.EnhancerKey;
    
    public class Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f extends KeyFactory implements EnhancerKey {
        private final String FIELD_0;
        private final String[] FIELD_1;
        private final WeakCacheKey FIELD_2;
        private final Type[] FIELD_3;
        private final boolean FIELD_4;
        private final boolean FIELD_5;
        private final Long FIELD_6;
    
        public Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f() {
        }
    
        public Object newInstance(String var1, String[] var2, WeakCacheKey var3, Type[] var4, boolean var5, boolean var6, Long var7) {
    		// step into ...
            return new Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f(var1, var2, var3, var4, var5, var6, var7);
        }
    
        public Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f(String var1, String[] var2, WeakCacheKey var3, Type[] var4, boolean var5, boolean var6, Long var7) {
    		// step into ...
    		// 其实就是将方法传入的变量赋值到本地而已
            this.FIELD_0 = var1;
            this.FIELD_1 = var2;
            this.FIELD_2 = var3;
            this.FIELD_3 = var4;
            this.FIELD_4 = var5;
            this.FIELD_5 = var6;
            this.FIELD_6 = var7;
        }
    	
    	// 重写后的hashCode、equals、toString方法(没别的了)...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2. 通过cglib的AopProxy获取Enhancer.EnhancerKey代理类实例

    2.1 创建cglib的AopProxy

    	// org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy
    	// BeanFactory初始化bean:beanInstance->populate->initializingBean(afterPostProcess)
    	@Override
    	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    		if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
    			Class<?> targetClass = config.getTargetClass();
    			if (targetClass == null) {
    				throw new AopConfigException("TargetSource cannot determine target class: " +
    						"Either an interface or a target is required for proxy creation.");
    			}
    			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    				return new JdkDynamicAopProxy(config);
    			}
    			// step into ...
    			// cglib动态代理类创建之梦开始的地方...
    			// 走到这里的条件 被代理的类 不是一个接口 & 本身不是代理类
    			return new ObjenesisCglibAopProxy(config);
    		}
    		else {
    			return new JdkDynamicAopProxy(config);
    		}
    	}
    	
    	// org.springframework.aop.framework.ObjenesisCglibAopProxy#ObjenesisCglibAopProxy
    	public ObjenesisCglibAopProxy(AdvisedSupport config) {
    		// step into ...
    		super(config);
    	}
    	
    	// org.springframework.aop.framework.CglibAopProxy#CglibAopProxy
    	// class CglibAopProxy implements AopProxy
    	/**
    	 * Create a new CglibAopProxy for the given AOP configuration.
    	 * @param config the AOP configuration as AdvisedSupport object
    	 * @throws AopConfigException if the config is invalid. We try to throw an informative
    	 * exception in this case, rather than let a mysterious failure happen later.
    	 */
    	public CglibAopProxy(AdvisedSupport config) throws AopConfigException {
    		Assert.notNull(config, "AdvisedSupport must not be null");
    		if (config.getAdvisors().length == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) {
    			throw new AopConfigException("No advisors and no TargetSource specified");
    		}
    		// 赋值代理配置
    		this.advised = config;
    		// step into ...
    		// 通过代理配置创建一个分发器实例(该类其实是用于包装代理配置类的私有内部类)
    		this.advisedDispatcher = new AdvisedDispatcher(this.advised);
    	}
    	
    	// org.springframework.aop.framework.CglibAopProxy.AdvisedDispatcher
    	/**
    	 * Dispatcher for any methods declared on the Advised class.
    	 */
    	private static class AdvisedDispatcher implements Dispatcher, Serializable {
    
    		private final AdvisedSupport advised;
    
    		public AdvisedDispatcher(AdvisedSupport advised) {
    			this.advised = advised;
    		}
    
    		@Override
    		public Object loadObject() {
    			return this.advised;
    		}
    	}
    	
    	// 至此cglib代理模式的AopProxy创建完毕 ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    2.2 AopProxy.getProxy获取Enhancer.EnhancerKey代理类实例

    	// org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader)
    	// 现在cglib代理模式的AopProxy实例已经创建出来了,是时候获取这个代理类了
    	/**
    	 * Create a new proxy according to the settings in this factory.
    	 * 

    Can be called repeatedly. Effect will vary if we've added * or removed interfaces. Can add and remove interceptors. *

    Uses the given class loader (if necessary for proxy creation). * @param classLoader the class loader to create the proxy with * (or {@code null} for the low-level proxy facility's default) * @return the proxy object */ public Object getProxy(@Nullable ClassLoader classLoader) { return createAopProxy() // step into ... .getProxy(classLoader); } // org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader) // class CglibAopProxy implements AopProxy, @Override public Object getProxy(@Nullable ClassLoader classLoader) { if (logger.isTraceEnabled()) { logger.trace("Creating CGLIB proxy: " + this.advised.getTargetSource()); } try { Class<?> rootClass = this.advised.getTargetClass(); Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy"); Class<?> proxySuperClass = rootClass; if (rootClass.getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) { proxySuperClass = rootClass.getSuperclass(); Class<?>[] additionalInterfaces = rootClass.getInterfaces(); for (Class<?> additionalInterface : additionalInterfaces) { this.advised.addInterface(additionalInterface); } } // Validate the class, writing log messages as necessary. validateClassIfNecessary(proxySuperClass, classLoader); // step into ... // 这里创建cglib的增强类,为什么我们要追踪这个对象的new过程? // 其实不然,Enhancer里边有个private static final 修饰的私有常量 // 该常量即其私有的内部类EnhancerKey仅用于内部生成缓存的key // 你可以把Enhancer理解成cglib在动态代理时的字节码增强器 // Configure CGLIB Enhancer... Enhancer enhancer = createEnhancer(); if (classLoader != null) { enhancer.setClassLoader(classLoader); if (classLoader instanceof SmartClassLoader && ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) { enhancer.setUseCache(false); } } enhancer.setSuperclass(proxySuperClass); enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader)); Callback[] callbacks = getCallbacks(rootClass); Class<?>[] types = new Class<?>[callbacks.length]; for (int x = 0; x < types.length; x++) { types[x] = callbacks[x].getClass(); } // fixedInterceptorMap only populated at this point, after getCallbacks call above enhancer.setCallbackFilter(new ProxyCallbackFilter( this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset)); enhancer.setCallbackTypes(types); // Generate the proxy class and create a proxy instance. return createProxyClassAndInstance(enhancer, callbacks); } catch (CodeGenerationException | IllegalArgumentException ex) { throw new AopConfigException("Could not generate CGLIB subclass of " + this.advised.getTargetClass() + ": Common causes of this problem include using a final class or a non-visible class", ex); } catch (Throwable ex) { // TargetSource.getTarget() failed throw new AopConfigException("Unexpected AOP exception", ex); } }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    2.3 cglib生成Enhancer.EnhancerKey代理类的class(反编译后)

    public class OrderServiceImpl$$EnhancerBySpringCGLIB$$7dfa864d extends OrderServiceImpl implements SpringProxy, Advised, Factory {
        private boolean CGLIB$BOUND;
        public static Object CGLIB$FACTORY_DATA;
        private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
        private static final Callback[] CGLIB$STATIC_CALLBACKS;
        private MethodInterceptor CGLIB$CALLBACK_0;
        private MethodInterceptor CGLIB$CALLBACK_1;
        private NoOp CGLIB$CALLBACK_2;
        private Dispatcher CGLIB$CALLBACK_3;
        private Dispatcher CGLIB$CALLBACK_4;
        private MethodInterceptor CGLIB$CALLBACK_5;
        private MethodInterceptor CGLIB$CALLBACK_6;
        private static Object CGLIB$CALLBACK_FILTER;
        private static final Method CGLIB$createOrder$0$Method;
        private static final MethodProxy CGLIB$createOrder$0$Proxy;
        private static final Object[] CGLIB$emptyArgs;
        private static final Method CGLIB$queryOrder$1$Method;
        private static final MethodProxy CGLIB$queryOrder$1$Proxy;
        private static final Method CGLIB$equals$2$Method;
        private static final MethodProxy CGLIB$equals$2$Proxy;
        private static final Method CGLIB$toString$3$Method;
        private static final MethodProxy CGLIB$toString$3$Proxy;
        private static final Method CGLIB$hashCode$4$Method;
        private static final MethodProxy CGLIB$hashCode$4$Proxy;
        private static final Method CGLIB$clone$5$Method;
        private static final MethodProxy CGLIB$clone$5$Proxy;
    
        static void CGLIB$STATICHOOK5() {
    			// 此处省略cglib代理类在静态块中对变量的初始化
        }
    
        final Order CGLIB$createOrder$0(String var1, String var2) {
            return super.createOrder(var1, var2);
        }
    
        public final Order createOrder(String var1, String var2) {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (var10000 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
            return var10000 != null ? (Order)var10000.intercept(this, CGLIB$createOrder$0$Method, new Object[]{var1, var2}, CGLIB$createOrder$0$Proxy) : super.createOrder(var1, var2);
        }
    
    	// 此处省略一大堆其他默认实现的接口的重写方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    3. 代理类调用的过程

    3.1 DynamicAdvisedInterceptor拦截器链生成、配置

    	// org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)
    	// class CglibAopProxy implements AopProxy,
    	@Override
    	public Object getProxy(@Nullable ClassLoader classLoader) {
    		if (logger.isTraceEnabled()) {
    			logger.trace("Creating CGLIB proxy: " + this.advised.getTargetSource());
    		}
    
    		try {
    			Class<?> rootClass = this.advised.getTargetClass();
    			Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");
    
    			Class<?> proxySuperClass = rootClass;
    			if (rootClass.getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) {
    				proxySuperClass = rootClass.getSuperclass();
    				Class<?>[] additionalInterfaces = rootClass.getInterfaces();
    				for (Class<?> additionalInterface : additionalInterfaces) {
    					this.advised.addInterface(additionalInterface);
    				}
    			}
    
    			// Validate the class, writing log messages as necessary.
    			validateClassIfNecessary(proxySuperClass, classLoader);
    
    			// Configure CGLIB Enhancer...
    			Enhancer enhancer = createEnhancer();
    			if (classLoader != null) {
    				enhancer.setClassLoader(classLoader);
    				if (classLoader instanceof SmartClassLoader &&
    						((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
    					enhancer.setUseCache(false);
    				}
    			}
    			enhancer.setSuperclass(proxySuperClass);
    			enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
    			enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
    			enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));
    
    			// step into ...
    			// aop的advice实现接口Callback
    			Callback[] callbacks = getCallbacks(rootClass);
    			Class<?>[] types = new Class<?>[callbacks.length];
    			for (int x = 0; x < types.length; x++) {
    				types[x] = callbacks[x].getClass();
    			}
    			// fixedInterceptorMap only populated at this point, after getCallbacks call above
    			enhancer.setCallbackFilter(new ProxyCallbackFilter(
    					this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
    			enhancer.setCallbackTypes(types);
    
    			// Generate the proxy class and create a proxy instance.
    			return createProxyClassAndInstance(enhancer, callbacks);
    		}
    		catch (CodeGenerationException | IllegalArgumentException ex) {
    			throw new AopConfigException("Could not generate CGLIB subclass of " + this.advised.getTargetClass() +
    					": Common causes of this problem include using a final class or a non-visible class",
    					ex);
    		}
    		catch (Throwable ex) {
    			// TargetSource.getTarget() failed
    			throw new AopConfigException("Unexpected AOP exception", ex);
    		}
    	}
    	
    	// org.springframework.aop.framework.CglibAopProxy#getCallbacks
    	private Callback[] getCallbacks(Class<?> rootClass) throws Exception {
    		// Parameters used for optimization choices...
    		boolean exposeProxy = this.advised.isExposeProxy();
    		boolean isFrozen = this.advised.isFrozen();
    		boolean isStatic = this.advised.getTargetSource().isStatic();
    
    		// step into ...
    		// 可以看到Aop的advice类型是DynamicAdvisedInterceptor
    		// 这给了我们提示:把断点标记于DynamicAdvisedInterceptor.intercept()
    		// Choose an "aop" interceptor (used for AOP calls).
    		Callback aopInterceptor = new DynamicAdvisedInterceptor(this.advised);
    
    		// Choose a "straight to target" interceptor. (used for calls that are
    		// unadvised but can return this). May be required to expose the proxy.
    		Callback targetInterceptor;
    		if (exposeProxy) {
    			targetInterceptor = (isStatic ?
    					new StaticUnadvisedExposedInterceptor(this.advised.getTargetSource().getTarget()) :
    					new DynamicUnadvisedExposedInterceptor(this.advised.getTargetSource()));
    		}
    		else {
    			targetInterceptor = (isStatic ?
    					new StaticUnadvisedInterceptor(this.advised.getTargetSource().getTarget()) :
    					new DynamicUnadvisedInterceptor(this.advised.getTargetSource()));
    		}
    
    		// Choose a "direct to target" dispatcher (used for
    		// unadvised calls to static targets that cannot return this).
    		Callback targetDispatcher = (isStatic ?
    				new StaticDispatcher(this.advised.getTargetSource().getTarget()) : new SerializableNoOp());
    
    		Callback[] mainCallbacks = new Callback[] {
    				aopInterceptor,  // for normal advice
    				targetInterceptor,  // invoke target without considering advice, if optimized
    				new SerializableNoOp(),  // no override for methods mapped to this
    				targetDispatcher, this.advisedDispatcher,
    				new EqualsInterceptor(this.advised),
    				new HashCodeInterceptor(this.advised)
    		};
    
    		Callback[] callbacks;
    
    		// If the target is a static one and the advice chain is frozen,
    		// then we can make some optimizations by sending the AOP calls
    		// direct to the target using the fixed chain for that method.
    		if (isStatic && isFrozen) {
    			Method[] methods = rootClass.getMethods();
    			Callback[] fixedCallbacks = new Callback[methods.length];
    			this.fixedInterceptorMap = new HashMap<>(methods.length);
    
    			// TODO: small memory optimization here (can skip creation for methods with no advice)
    			for (int x = 0; x < methods.length; x++) {
    				Method method = methods[x];
    				List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, rootClass);
    				fixedCallbacks[x] = new FixedChainStaticTargetInterceptor(
    						chain, this.advised.getTargetSource().getTarget(), this.advised.getTargetClass());
    				this.fixedInterceptorMap.put(method, x);
    			}
    
    			// Now copy both the callbacks from mainCallbacks
    			// and fixedCallbacks into the callbacks array.
    			callbacks = new Callback[mainCallbacks.length + fixedCallbacks.length];
    			System.arraycopy(mainCallbacks, 0, callbacks, 0, mainCallbacks.length);
    			System.arraycopy(fixedCallbacks, 0, callbacks, mainCallbacks.length, fixedCallbacks.length);
    			this.fixedInterceptorOffset = mainCallbacks.length;
    		}
    		else {
    			callbacks = mainCallbacks;
    		}
    		return callbacks;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136

    3.2 调用拦截器(DynamicAdvisedInterceptor)链,执行增强逻辑

    	// org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept
    	@Override
    	@Nullable
    	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    		Object oldProxy = null;
    		boolean setProxyContext = false;
    		Object target = null;
    		TargetSource targetSource = this.advised.getTargetSource();
    		try {
    			if (this.advised.exposeProxy) {
    				// Make invocation available if necessary.
    				oldProxy = AopContext.setCurrentProxy(proxy);
    				setProxyContext = true;
    			}
    			// Get as late as possible to minimize the time we "own" the target, in case it comes from a pool...
    			target = targetSource.getTarget();
    			Class<?> targetClass = (target != null ? target.getClass() : null);
    			
    			// 这跟jdk代理很像,index:0为Spring-aop的ExposeInvocationInterceptor,后面才是我们自己的advice
    			List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
    			Object retVal;
    			// Check whether we only have one InvokerInterceptor: that is,
    			// no real advice, but just reflective invocation of the target.
    			if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {
    				// We can skip creating a MethodInvocation: just invoke the target directly.
    				// Note that the final invoker must be an InvokerInterceptor, so we know
    				// it does nothing but a reflective operation on the target, and no hot
    				// swapping or fancy proxying.
    				Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);
    				retVal = methodProxy.invoke(target, argsToUse);
    			}
    			else {
    				// step into ...
    				// 创建需要被代理的方法调用器并调用(process)
    				// We need to create a method invocation...
    				retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
    			}
    			retVal = processReturnType(proxy, target, method, retVal);
    			return retVal;
    		}
    		finally {
    			if (target != null && !targetSource.isStatic()) {
    				targetSource.releaseTarget(target);
    			}
    			if (setProxyContext) {
    				// Restore old proxy.
    				AopContext.setCurrentProxy(oldProxy);
    			}
    		}
    	}
    	
    	// org.springframework.aop.framework.CglibAopProxy.CglibMethodInvocation#proceed
    	@Override
    	@Nullable
    	public Object proceed() throws Throwable {
    		try {
    			// step into ...
    			return super.proceed();
    		}
    		catch (RuntimeException ex) {
    			throw ex;
    		}
    		catch (Exception ex) {
    			if (ReflectionUtils.declaresException(getMethod(), ex.getClass())) {
    				throw ex;
    			}
    			else {
    				throw new UndeclaredThrowableException(ex);
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    4. cglib相关的基类

    4.1 cglibAopProxy:接入spring-aop的AopProxy

    public interface AopProxy {
    	Object getProxy();
    	Object getProxy(@Nullable ClassLoader classLoader);
    }
    
    /* ------------------向下搜索实现类--------------------*/
    
    class CglibAopProxy implements AopProxy, Serializable {
    	protected final AdvisedSupport advised;
    	private final transient AdvisedDispatcher advisedDispatcher;
    	public CglibAopProxy(AdvisedSupport config) throws AopConfigException {
    		this.advised = config;
    		this.advisedDispatcher = new AdvisedDispatcher(this.advised);
    	}
    	@Override
    	public Object getProxy(@Nullable ClassLoader classLoader) {
    		// Enhancer.new+set
    		Enhancer enhancer = createEnhancer();
    		// 获取所有拦截器
    		Callback[] callbacks = getCallbacks(rootClass);
    		// 创建代理类的Class及其实例对象
    		return createProxyClassAndInstance(enhancer, callbacks);
    	}
    	protected Enhancer createEnhancer() {
    		return new Enhancer();
    	}
    	protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) {
    		enhancer.create()
    	}
    
    	private static class CglibMethodInvocation extends ReflectiveMethodInvocation {
    		@Override
    		@Nullable
    		public Object proceed() throws Throwable {
    			return super.proceed();
    		}
    	}
    }
    
    /* ------------------向下搜索实现类--------------------*/
    
    class ObjenesisCglibAopProxy extends CglibAopProxy {
    	public ObjenesisCglibAopProxy(AdvisedSupport config) {
    		super(config);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4.2 Callback:cglib的增强拦截器接口

    public interface Callback {}
    
    • 1

    4.2.1 AdvisedDispatcher :调度所有作用于被代理方法的一种Callback

    public interface Dispatcher extends Callback {
        Object loadObject() throws Exception;
    }
    
    class CglibAopProxy implements AopProxy, Serializable {
    	private static class AdvisedDispatcher implements Dispatcher, Serializable {
    		private final AdvisedSupport advised;
    		@Override
    		public Object loadObject() {
    			return this.advised;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.2.2 MethodInterceptor :用于增强方法的一种Callback

    
    import java.lang.reflect.Method;
    public interface MethodInterceptor extends Callback {
        Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
    }
    
    /* ----------------cglib for spring.aop的一种实现 ------------------- */
    class CglibAopProxy implements AopProxy, Serializable {
    	private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable {
    		private final AdvisedSupport advised;
    		@Override
    		public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    			List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
    			retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
    			return retVal;
    		}
    	}
    }
    
    	// org.springframework.aop.framework.DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice
    	@Override
    	public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
    			Advised config, Method method, @Nullable Class<?> targetClass) {
    
    		// This is somewhat tricky... We have to process introductions first,
    		// but we need to preserve order in the ultimate list.
    		AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
    		Advisor[] advisors = config.getAdvisors();
    		List<Object> interceptorList = new ArrayList<>(advisors.length);
    		Class<?> actualClass = (targetClass != null ? targetClass : method.getDeclaringClass());
    		Boolean hasIntroductions = null;
    
    		for (Advisor advisor : advisors) {
    			if (advisor instanceof PointcutAdvisor) {
    				// Add it conditionally.
    				PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
    				if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(actualClass)) {
    					MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
    					boolean match;
    					if (mm instanceof IntroductionAwareMethodMatcher) {
    						if (hasIntroductions == null) {
    							hasIntroductions = hasMatchingIntroductions(advisors, actualClass);
    						}
    						match = ((IntroductionAwareMethodMatcher) mm).matches(method, actualClass, hasIntroductions);
    					}
    					else {
    						// methodMatcher.matches(Mathod,Class)
    						match = mm.matches(method, actualClass);
    					}
    					if (match) {
    						MethodInterceptor[] interceptors = registry.getInterceptors(advisor);
    						if (mm.isRuntime()) {
    							// Creating a new object instance in the getInterceptors() method
    							// isn't a problem as we normally cache created chains.
    							for (MethodInterceptor interceptor : interceptors) {
    								interceptorList.add(new InterceptorAndDynamicMethodMatcher(interceptor, mm));
    							}
    						}
    						else {
    							interceptorList.addAll(Arrays.asList(interceptors));
    						}
    					}
    				}
    			}
    			else if (advisor instanceof IntroductionAdvisor) {
    				IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
    				if (config.isPreFiltered() || ia.getClassFilter().matches(actualClass)) {
    					Interceptor[] interceptors = registry.getInterceptors(advisor);
    					interceptorList.addAll(Arrays.asList(interceptors));
    				}
    			}
    			else {
    				Interceptor[] interceptors = registry.getInterceptors(advisor);
    				interceptorList.addAll(Arrays.asList(interceptors));
    			}
    		}
    
    		return interceptorList;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    4.3 GeneratorStrategy:代理类的字节码生成策略

    • 其实这里是真正的字节码生成的实现,ClassGenerator 也是调用 GeneratorStrategy 生成代理类的字节码数组
    public interface GeneratorStrategy {
        byte[] generate(ClassGenerator var1) throws Exception;
    }
    
    public class DefaultGeneratorStrategy implements GeneratorStrategy {
        public byte[] generate(ClassGenerator cg) throws Exception {
            DebuggingClassWriter cw = this.getClassVisitor();
            this.transform(cg).generateClass(cw);
            return this.transform(cw.toByteArray());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.4 ClassGenerator:代理类的字节码生成器

    public interface ClassGenerator {
        void generateClass(ClassVisitor var1) throws Exception;
    }
    
    • 1
    • 2
    • 3

    4.4.1 AbstractClassGenerator

    abstract public class AbstractClassGenerator<T> implements ClassGenerator {
    	
    	private GeneratorStrategy strategy = DefaultGeneratorStrategy.INSTANCE;
    	protected Class generate(ClassLoaderData data) {
    		Class gen;
    		// 在这里调用 GeneratorStrategy 生成代理类的字节码数组
    		byte[] b = strategy.generate(this);
    		String className = ClassNameReader.getClassName(new ClassReader(b));
    		gen = ReflectUtils.defineClass(className, b, classLoader, protectionDomain, contextClass);
    		return gen;
    	}
    	
    	protected static class ClassLoaderData {
    		private final Set<String> reservedClassNames = new HashSet<String>();
    		private final LoadingCache<AbstractClassGenerator, Object, Object> generatedClasses;
    		private final WeakReference<ClassLoader> classLoader;
    		// 返回字节码生成器的key(例如EnhancerKey的使用)
    		private static final Function<AbstractClassGenerator, Object> GET_KEY = new Function<AbstractClassGenerator, Object>() {...};
    		public ClassLoaderData(ClassLoader classLoader) {
    			this.classLoader = new WeakReference<ClassLoader>(classLoader);
    			Function<AbstractClassGenerator, Object> load = new Function<AbstractClassGenerator, Object>() {...};
    			generatedClasses = new LoadingCache<AbstractClassGenerator, Object, Object>(GET_KEY, load);
    		}
    	}
    	
    	protected Object create(Object key) {
    		ClassLoaderData data = cache.get(loader);
    		Object obj = data.get(this, getUseCache());
    		if (obj instanceof Class) {
    			// EnhancerKey作为代理类会比其他用户的代理类先一步(发生在ioc) -> EnhancerKey执行这个方法
    			return firstInstance((Class) obj);
    		}
    		// 用户代理类执行这个方法
    		return nextInstance(obj);
    	}
    	
    	// 实现见Enhancer
    	abstract protected Object firstInstance(Class type) throws Exception;
    	abstract protected Object nextInstance(Object instance) throws Exception;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    4.4.2 Enhancer:AbstractClassGenerator基础上进一步的封装

    public class Enhancer extends AbstractClassGenerator {
    
    	private static final EnhancerKey KEY_FACTORY =
    			(EnhancerKey) KeyFactory.create(EnhancerKey.class, KeyFactory.HASH_ASM_TYPE, null);
    
    	// 多个参数组合而成的Enhancer的key
    	public interface EnhancerKey {
    		public Object newInstance(String type,
    				String[] interfaces,
    				WeakCacheKey<CallbackFilter> filter,
    				Type[] callbackTypes,
    				boolean useFactory,
    				boolean interceptDuringConstruction,
    				Long serialVersionUID);
    	}
    
    	public Object create() {
    		return createHelper();
    	}
    
    	private Object createHelper() {
    		preValidate();
    		// EnhancerKey本身也是代理类
    		Object key = KEY_FACTORY.newInstance((superclass != null) ? superclass.getName() : null,
    				ReflectUtils.getNames(interfaces),
    				filter == ALL_ZERO ? null : new WeakCacheKey<CallbackFilter>(filter),
    				callbackTypes,
    				useFactory,
    				interceptDuringConstruction,
    				serialVersionUID);
    		Object result = super.create(key);
    		return result;
    	}
    
    	protected Object firstInstance(Class type) throws Exception {
    			return createUsingReflection(type);
    	}
    	protected Object nextInstance(Object instance) {
    		EnhancerFactoryData data = (EnhancerFactoryData) instance;
    		return data.newInstance(argumentTypes, arguments, callbacks);
    	}
    	
    	private Object createUsingReflection(Class type) {
    		return ReflectUtils.newInstance(type);
    	}
    	public static Object newInstance(Class type) {
    		// 反射调用构造器创建实例
    		return newInstance(type, Constants.EMPTY_CLASS_ARRAY, null);
    	}
    	static class EnhancerFactoryData {
    		public Object newInstance(Class[] argumentTypes, Object[] arguments, Callback[] callbacks) {
    			return ReflectUtils.newInstance(generatedClass, argumentTypes, arguments);
    		}
    	}
    
    	// 实现自ClassGenerator
    	public void generateClass(ClassVisitor v) throws Exception {
    		// 生成代理class的底层代码比较复杂,略过了
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    4.4.3 KeyFactory:EnhancerKey代理类的父类

    abstract public class KeyFactory {
    	public static KeyFactory create(Class keyInterface, KeyFactoryCustomizer first, List<KeyFactoryCustomizer> next) {
    		return create(keyInterface.getClassLoader(), keyInterface, first, next);
    	}
    	public static KeyFactory create(ClassLoader loader, Class keyInterface, KeyFactoryCustomizer customizer,
    			List<KeyFactoryCustomizer> next) {
    		Generator gen = new Generator();
    		gen.setInterface(keyInterface);
    		gen.setClassLoader(loader);
    		return gen.create();
    	}
    	public static class Generator extends AbstractClassGenerator {
    		// 并没有重写父类的create()
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    【Java 基础篇】Java List 使用指南:深入解析列表操作
    [论文笔记]Poly-encoder
    bootstrap按钮
    keil 编译stm32,编译信息释义
    JS面向对象编程
    不用USB,通过adb无线调试安卓手机页面
    java基于ssm+jsp 多用户博客个人网站
    Yolo v8数据马赛克数据增强代码详解
    Flowable 之事件和网关
    SpringMVC(五、AOP)
  • 原文地址:https://blog.csdn.net/weixin_43638238/article/details/126680272