标签:blog types out pac 源码解析 检测 attribute ade 结构
我们知道BeanDefintion定义了Bean在IoC容器内的基本数据结构。在学习IoC之前先了解BeanDefition对我们理解IoC容器是有帮助的。
首先BeanDefinition是一个接口,继承了AttributeAccessor和BeanMetadataElement。
我们主要来学习下他的一个实现类,AbstractBeanDefinition。
这虽然是一个抽象类,但是提供了BeanDefinition接口的全部实现。是一个基本的框架。其子类有RootBeanDefinition(表示父级),ChildBeanDefinition(表示子级)和GenericBeanDefinition(一般的BeanDefinition实现)。
来看代码:
1 /* 2 * Copyright 2002-2016 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.springframework.beans.factory.support; 18 19 import java.lang.reflect.Constructor; 20 import java.util.Arrays; 21 import java.util.LinkedHashMap; 22 import java.util.LinkedHashSet; 23 import java.util.Map; 24 import java.util.Set; 25 26 import org.springframework.beans.BeanMetadataAttributeAccessor; 27 import org.springframework.beans.MutablePropertyValues; 28 import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 29 import org.springframework.beans.factory.config.BeanDefinition; 30 import org.springframework.beans.factory.config.ConstructorArgumentValues; 31 import org.springframework.core.io.DescriptiveResource; 32 import org.springframework.core.io.Resource; 33 import org.springframework.util.Assert; 34 import org.springframework.util.ClassUtils; 35 import org.springframework.util.ObjectUtils; 36 import org.springframework.util.StringUtils; 37 38 /** 39 * Base class for concrete, full-fledged {@link BeanDefinition} classes, 40 * factoring out common properties of {@link GenericBeanDefinition}, 41 * {@link RootBeanDefinition}, and {@link ChildBeanDefinition}. 42 * 43 * <p>The autowire constants match the ones defined in the 44 * {@link org.springframework.beans.factory.config.AutowireCapableBeanFactory} 45 * interface. 46 * 47 * @author Rod Johnson 48 * @author Juergen Hoeller 49 * @author Rob Harrop 50 * @author Mark Fisher 51 * @see GenericBeanDefinition 52 * @see RootBeanDefinition 53 * @see ChildBeanDefinition 54 */ 55 @SuppressWarnings("serial") 56 public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor 57 implements BeanDefinition, Cloneable { 58 59 60 public static final String SCOPE_DEFAULT = ""; 61 62 /***************************自动注入时的策略***************************/ 63 64 public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO; 65 66 public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME; 67 68 public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE; 69 70 public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR; 71 72 @Deprecated 73 public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT; 74 75 /***************************依赖检查的策略***************************/ 76 //不做检查 77 public static final int DEPENDENCY_CHECK_NONE = 0; 78 79 //检查除简单类型属性以及集合类型属性外的引用类型属性 80 public static final int DEPENDENCY_CHECK_OBJECTS = 1; 81 82 //检查简单类型属性以及集合类型属性 83 public static final int DEPENDENCY_CHECK_SIMPLE = 2; 84 85 //全部检查 86 public static final int DEPENDENCY_CHECK_ALL = 3; 87 88 public static final String INFER_METHOD = "(inferred)"; 89 90 //表示这个Bean的类,可能是字符串,比如"com.insaneXs.TestA",也可能是class对象 91 private volatile Object beanClass; 92 93 //表示这个bean的范围 94 private String scope = SCOPE_DEFAULT; 95 96 //是否是抽象的,在定义bean的时候,由abstract属性设置,抽象的BeanDefition在getBean时会抛出异常 97 private boolean abstractFlag = false; 98 99 //是否延迟加载 100 private boolean lazyInit = false; 101 102 private int autowireMode = AUTOWIRE_NO; 103 104 private int dependencyCheck = DEPENDENCY_CHECK_NONE; 105 106 //依赖关系,在定义bean的时候,由depend-on属性设置,被依赖的bean在该bean之前被容器初始化 107 private String[] dependsOn; 108 109 private boolean autowireCandidate = true; 110 111 private boolean primary = false; 112 113 private final Map<String, AutowireCandidateQualifier> qualifiers = 114 new LinkedHashMap<String, AutowireCandidateQualifier>(0); 115 116 //是都允许访问非共有的属性 117 private boolean nonPublicAccessAllowed = true; 118 119 //调用构造函数时,是否采用宽松匹配 120 private boolean lenientConstructorResolution = true; 121 122 //工厂类Bean的名字 123 private String factoryBeanName; 124 125 //工厂方法的名字 126 private String factoryMethodName; 127 128 //构造函数参数的封装 129 private ConstructorArgumentValues constructorArgumentValues; 130 131 //在定义bean时,property标签设置的属性 132 private MutablePropertyValues propertyValues; 133 134 //跟Bean定义时的look-up有关 135 private MethodOverrides methodOverrides = new MethodOverrides(); 136 137 //指定init方法名称,会在初始化的时候被调用 138 private String initMethodName; 139 140 //指定destroy方法名称,会在被销毁时调用 141 private String destroyMethodName; 142 143 144 private boolean enforceInitMethod = true; 145 146 private boolean enforceDestroyMethod = true; 147 148 //表示该Bean是否是由程序生成的 149 private boolean synthetic = false; 150 151 private int role = BeanDefinition.ROLE_APPLICATION; 152 153 private String description; 154 155 private Resource resource; 156 157 158 protected AbstractBeanDefinition() { 159 this(null, null); 160 } 161 162 protected AbstractBeanDefinition(ConstructorArgumentValues cargs, MutablePropertyValues pvs) { 163 setConstructorArgumentValues(cargs); 164 setPropertyValues(pvs); 165 } 166 167 //深拷贝 168 protected AbstractBeanDefinition(BeanDefinition original) { 169 setParentName(original.getParentName()); 170 setBeanClassName(original.getBeanClassName()); 171 setScope(original.getScope()); 172 setAbstract(original.isAbstract()); 173 setLazyInit(original.isLazyInit()); 174 setFactoryBeanName(original.getFactoryBeanName()); 175 setFactoryMethodName(original.getFactoryMethodName()); 176 setConstructorArgumentValues(new ConstructorArgumentValues(original.getConstructorArgumentValues())); 177 setPropertyValues(new MutablePropertyValues(original.getPropertyValues())); 178 setRole(original.getRole()); 179 setSource(original.getSource()); 180 copyAttributesFrom(original); 181 182 if (original instanceof AbstractBeanDefinition) { 183 AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original; 184 if (originalAbd.hasBeanClass()) { 185 setBeanClass(originalAbd.getBeanClass()); 186 } 187 setAutowireMode(originalAbd.getAutowireMode()); 188 setDependencyCheck(originalAbd.getDependencyCheck()); 189 setDependsOn(originalAbd.getDependsOn()); 190 setAutowireCandidate(originalAbd.isAutowireCandidate()); 191 setPrimary(originalAbd.isPrimary()); 192 copyQualifiersFrom(originalAbd); 193 setNonPublicAccessAllowed(originalAbd.isNonPublicAccessAllowed()); 194 setLenientConstructorResolution(originalAbd.isLenientConstructorResolution()); 195 setMethodOverrides(new MethodOverrides(originalAbd.getMethodOverrides())); 196 setInitMethodName(originalAbd.getInitMethodName()); 197 setEnforceInitMethod(originalAbd.isEnforceInitMethod()); 198 setDestroyMethodName(originalAbd.getDestroyMethodName()); 199 setEnforceDestroyMethod(originalAbd.isEnforceDestroyMethod()); 200 setSynthetic(originalAbd.isSynthetic()); 201 setResource(originalAbd.getResource()); 202 } 203 else { 204 setResourceDescription(original.getResourceDescription()); 205 } 206 } 207 208 209 //由其他BeanDefinition的值来覆盖自身的值 210 public void overrideFrom(BeanDefinition other) { 211 if (StringUtils.hasLength(other.getBeanClassName())) { 212 setBeanClassName(other.getBeanClassName()); 213 } 214 if (StringUtils.hasLength(other.getScope())) { 215 setScope(other.getScope()); 216 } 217 setAbstract(other.isAbstract()); 218 setLazyInit(other.isLazyInit()); 219 if (StringUtils.hasLength(other.getFactoryBeanName())) { 220 setFactoryBeanName(other.getFactoryBeanName()); 221 } 222 if (StringUtils.hasLength(other.getFactoryMethodName())) { 223 setFactoryMethodName(other.getFactoryMethodName()); 224 } 225 getConstructorArgumentValues().addArgumentValues(other.getConstructorArgumentValues()); 226 getPropertyValues().addPropertyValues(other.getPropertyValues()); 227 setRole(other.getRole()); 228 setSource(other.getSource()); 229 copyAttributesFrom(other); 230 231 if (other instanceof AbstractBeanDefinition) { 232 AbstractBeanDefinition otherAbd = (AbstractBeanDefinition) other; 233 if (otherAbd.hasBeanClass()) { 234 setBeanClass(otherAbd.getBeanClass()); 235 } 236 setAutowireMode(otherAbd.getAutowireMode()); 237 setDependencyCheck(otherAbd.getDependencyCheck()); 238 setDependsOn(otherAbd.getDependsOn()); 239 setAutowireCandidate(otherAbd.isAutowireCandidate()); 240 setPrimary(otherAbd.isPrimary()); 241 copyQualifiersFrom(otherAbd); 242 setNonPublicAccessAllowed(otherAbd.isNonPublicAccessAllowed()); 243 setLenientConstructorResolution(otherAbd.isLenientConstructorResolution()); 244 getMethodOverrides().addOverrides(otherAbd.getMethodOverrides()); 245 if (StringUtils.hasLength(otherAbd.getInitMethodName())) { 246 setInitMethodName(otherAbd.getInitMethodName()); 247 setEnforceInitMethod(otherAbd.isEnforceInitMethod()); 248 } 249 if (otherAbd.getDestroyMethodName() != null) { 250 setDestroyMethodName(otherAbd.getDestroyMethodName()); 251 setEnforceDestroyMethod(otherAbd.isEnforceDestroyMethod()); 252 } 253 setSynthetic(otherAbd.isSynthetic()); 254 setResource(otherAbd.getResource()); 255 } 256 else { 257 setResourceDescription(other.getResourceDescription()); 258 } 259 } 260 261 //根据默认设置来修改自身 262 public void applyDefaults(BeanDefinitionDefaults defaults) { 263 setLazyInit(defaults.isLazyInit()); 264 setAutowireMode(defaults.getAutowireMode()); 265 setDependencyCheck(defaults.getDependencyCheck()); 266 setInitMethodName(defaults.getInitMethodName()); 267 setEnforceInitMethod(false); 268 setDestroyMethodName(defaults.getDestroyMethodName()); 269 setEnforceDestroyMethod(false); 270 } 271 272 273 //设置bean的className 274 @Override 275 public void setBeanClassName(String beanClassName) { 276 this.beanClass = beanClassName; 277 } 278 279 //获取这个Bean的className 280 @Override 281 public String getBeanClassName() { 282 Object beanClassObject = this.beanClass; 283 //如果已经被解析成class,则通过class.getName方法返回class的名称 284 if (beanClassObject instanceof Class) { 285 return ((Class<?>) beanClassObject).getName(); 286 } 287 else { 288 return (String) beanClassObject; 289 } 290 } 291 292 //设置这个bean的class 293 public void setBeanClass(Class<?> beanClass) { 294 this.beanClass = beanClass; 295 } 296 297 //返回这个bean的class,如果beanClass为空,未被解析,则会抛出异常 298 public Class<?> getBeanClass() throws IllegalStateException { 299 Object beanClassObject = this.beanClass; 300 if (beanClassObject == null) { 301 throw new IllegalStateException("No bean class specified on bean definition"); 302 } 303 if (!(beanClassObject instanceof Class)) { 304 throw new IllegalStateException( 305 "Bean class name [" + beanClassObject + "] has not been resolved into an actual Class"); 306 } 307 return (Class<?>) beanClassObject; 308 } 309 310 //beanClass是否被解析成class 311 public boolean hasBeanClass() { 312 return (this.beanClass instanceof Class); 313 } 314 315 //解析beanClass 316 public Class<?> resolveBeanClass(ClassLoader classLoader) throws ClassNotFoundException { 317 String className = getBeanClassName(); 318 if (className == null) { 319 return null; 320 } 321 Class<?> resolvedClass = ClassUtils.forName(className, classLoader); 322 this.beanClass = resolvedClass; 323 return resolvedClass; 324 } 325 326 //设置bean的范围 327 @Override 328 public void setScope(String scope) { 329 this.scope = scope; 330 } 331 332 //获取bean的返回 333 @Override 334 public String getScope() { 335 return this.scope; 336 } 337 338 //是否是单例 339 @Override 340 public boolean isSingleton() { 341 return SCOPE_SINGLETON.equals(scope) || SCOPE_DEFAULT.equals(scope); 342 } 343 344 //是否是prototype 345 @Override 346 public boolean isPrototype() { 347 return SCOPE_PROTOTYPE.equals(scope); 348 } 349 350 351 public void setAbstract(boolean abstractFlag) { 352 this.abstractFlag = abstractFlag; 353 } 354 355 356 @Override 357 public boolean isAbstract() { 358 return this.abstractFlag; 359 } 360 361 @Override 362 public void setLazyInit(boolean lazyInit) { 363 this.lazyInit = lazyInit; 364 } 365 366 @Override 367 public boolean isLazyInit() { 368 return this.lazyInit; 369 } 370 371 372 public void setAutowireMode(int autowireMode) { 373 this.autowireMode = autowireMode; 374 } 375 376 377 public int getAutowireMode() { 378 return this.autowireMode; 379 } 380 381 //获取自动注入模式 382 public int getResolvedAutowireMode() { 383 //如果是自动检测,则根据构造函数来判断 384 if (this.autowireMode == AUTOWIRE_AUTODETECT) { 385 // Work out whether to apply setter autowiring or constructor autowiring. 386 // If it has a no-arg constructor it‘s deemed to be setter autowiring, 387 // otherwise we‘ll try constructor autowiring. 388 Constructor<?>[] constructors = getBeanClass().getConstructors(); 389 for (Constructor<?> constructor : constructors) { 390 if (constructor.getParameterTypes().length == 0) { 391 return AUTOWIRE_BY_TYPE; 392 } 393 } 394 return AUTOWIRE_CONSTRUCTOR; 395 } 396 else { 397 return this.autowireMode; 398 } 399 } 400 401 402 public void setDependencyCheck(int dependencyCheck) { 403 this.dependencyCheck = dependencyCheck; 404 } 405 406 407 public int getDependencyCheck() { 408 return this.dependencyCheck; 409 } 410 411 412 @Override 413 public void setDependsOn(String... dependsOn) { 414 this.dependsOn = dependsOn; 415 } 416 417 418 @Override 419 public String[] getDependsOn() { 420 return this.dependsOn; 421 } 422 423 424 @Override 425 public void setAutowireCandidate(boolean autowireCandidate) { 426 this.autowireCandidate = autowireCandidate; 427 } 428 429 430 @Override 431 public boolean isAutowireCandidate() { 432 return this.autowireCandidate; 433 } 434 435 436 @Override 437 public void setPrimary(boolean primary) { 438 this.primary = primary; 439 } 440 441 442 @Override 443 public boolean isPrimary() { 444 return this.primary; 445 } 446 447 448 //自动注入时,用来增加其他限制 449 public void addQualifier(AutowireCandidateQualifier qualifier) { 450 this.qualifiers.put(qualifier.getTypeName(), qualifier); 451 } 452 453 454 public boolean hasQualifier(String typeName) { 455 return this.qualifiers.keySet().contains(typeName); 456 } 457 458 459 public AutowireCandidateQualifier getQualifier(String typeName) { 460 return this.qualifiers.get(typeName); 461 } 462 463 464 public Set<AutowireCandidateQualifier> getQualifiers() { 465 return new LinkedHashSet<AutowireCandidateQualifier>(this.qualifiers.values()); 466 } 467 468 469 public void copyQualifiersFrom(AbstractBeanDefinition source) { 470 Assert.notNull(source, "Source must not be null"); 471 this.qualifiers.putAll(source.qualifiers); 472 } 473 474 475 476 public void setNonPublicAccessAllowed(boolean nonPublicAccessAllowed) { 477 this.nonPublicAccessAllowed = nonPublicAccessAllowed; 478 } 479 480 481 public boolean isNonPublicAccessAllowed() { 482 return this.nonPublicAccessAllowed; 483 } 484 485 486 //构造器是否宽松匹配 487 public void setLenientConstructorResolution(boolean lenientConstructorResolution) { 488 this.lenientConstructorResolution = lenientConstructorResolution; 489 } 490 491 492 public boolean isLenientConstructorResolution() { 493 return this.lenientConstructorResolution; 494 } 495 496 497 //设置获取工厂Bean的Name 498 @Override 499 public void setFactoryBeanName(String factoryBeanName) { 500 this.factoryBeanName = factoryBeanName; 501 } 502 503 504 @Override 505 public String getFactoryBeanName() { 506 return this.factoryBeanName; 507 } 508 509 //设置工厂方法,通常用来实现单例模式 510 @Override 511 public void setFactoryMethodName(String factoryMethodName) { 512 this.factoryMethodName = factoryMethodName; 513 } 514 515 516 @Override 517 public String getFactoryMethodName() { 518 return this.factoryMethodName; 519 } 520 521 //设置构造函数参数 522 public void setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues) { 523 this.constructorArgumentValues = 524 (constructorArgumentValues != null ? constructorArgumentValues : new ConstructorArgumentValues()); 525 } 526 527 528 @Override 529 public ConstructorArgumentValues getConstructorArgumentValues() { 530 return this.constructorArgumentValues; 531 } 532 533 534 public boolean hasConstructorArgumentValues() { 535 return !this.constructorArgumentValues.isEmpty(); 536 } 537 538 //设置属性 539 public void setPropertyValues(MutablePropertyValues propertyValues) { 540 this.propertyValues = (propertyValues != null ? propertyValues : new MutablePropertyValues()); 541 } 542 543 544 @Override 545 public MutablePropertyValues getPropertyValues() { 546 return this.propertyValues; 547 } 548 549 //方法注入 550 public void setMethodOverrides(MethodOverrides methodOverrides) { 551 this.methodOverrides = (methodOverrides != null ? methodOverrides : new MethodOverrides()); 552 } 553 554 555 public MethodOverrides getMethodOverrides() { 556 return this.methodOverrides; 557 } 558 559 //设置init方法 560 public void setInitMethodName(String initMethodName) { 561 this.initMethodName = initMethodName; 562 } 563 564 565 public String getInitMethodName() { 566 return this.initMethodName; 567 } 568 569 570 public void setEnforceInitMethod(boolean enforceInitMethod) { 571 this.enforceInitMethod = enforceInitMethod; 572 } 573 574 575 public boolean isEnforceInitMethod() { 576 return this.enforceInitMethod; 577 } 578 579 580 //设置destory方法 581 public void setDestroyMethodName(String destroyMethodName) { 582 this.destroyMethodName = destroyMethodName; 583 } 584 585 586 public String getDestroyMethodName() { 587 return this.destroyMethodName; 588 } 589 590 591 public void setEnforceDestroyMethod(boolean enforceDestroyMethod) { 592 this.enforceDestroyMethod = enforceDestroyMethod; 593 } 594 595 596 public boolean isEnforceDestroyMethod() { 597 return this.enforceDestroyMethod; 598 } 599 600 601 //是否由代码生成 602 public void setSynthetic(boolean synthetic) { 603 this.synthetic = synthetic; 604 } 605 606 607 public boolean isSynthetic() { 608 return this.synthetic; 609 } 610 611 612 public void setRole(int role) { 613 this.role = role; 614 } 615 616 617 @Override 618 public int getRole() { 619 return this.role; 620 } 621 622 623 public void setDescription(String description) { 624 this.description = description; 625 } 626 627 628 @Override 629 public String getDescription() { 630 return this.description; 631 } 632 633 634 public void setResource(Resource resource) { 635 this.resource = resource; 636 } 637 638 639 public Resource getResource() { 640 return this.resource; 641 } 642 643 644 public void setResourceDescription(String resourceDescription) { 645 this.resource = new DescriptiveResource(resourceDescription); 646 } 647 648 649 @Override 650 public String getResourceDescription() { 651 return (this.resource != null ? this.resource.getDescription() : null); 652 } 653 654 public void setOriginatingBeanDefinition(BeanDefinition originatingBd) { 655 this.resource = new BeanDefinitionResource(originatingBd); 656 } 657 658 659 @Override 660 public BeanDefinition getOriginatingBeanDefinition() { 661 return (this.resource instanceof BeanDefinitionResource ? 662 ((BeanDefinitionResource) this.resource).getBeanDefinition() : null); 663 } 664 665 //校验 666 public void validate() throws BeanDefinitionValidationException { 667 //指定了工厂方法的bean,不能Y由methodOverriders。 668 //因为工厂方法已经指定了bean实例化的方法,CGLib在这种情况下无效 669 if (!getMethodOverrides().isEmpty() && getFactoryMethodName() != null) { 670 throw new BeanDefinitionValidationException( 671 "Cannot combine static factory method with method overrides: " + 672 "the static factory method must create the instance"); 673 } 674 675 if (hasBeanClass()) { 676 prepareMethodOverrides(); 677 } 678 } 679 680 681 public void prepareMethodOverrides() throws BeanDefinitionValidationException { 682 // Check that lookup methods exists. 683 MethodOverrides methodOverrides = getMethodOverrides(); 684 if (!methodOverrides.isEmpty()) { 685 Set<MethodOverride> overrides = methodOverrides.getOverrides(); 686 synchronized (overrides) { 687 for (MethodOverride mo : overrides) { 688 prepareMethodOverride(mo); 689 } 690 } 691 } 692 } 693 694 //确认这个重写的方法是否有被重载 695 protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException { 696 int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName()); 697 if (count == 0) { 698 throw new BeanDefinitionValidationException( 699 "Invalid method override: no method with name ‘" + mo.getMethodName() + 700 "‘ on class [" + getBeanClassName() + "]"); 701 } 702 else if (count == 1) { 703 //重载的值默认为true, 704 //API上说设置为false可以提高运行性能 705 mo.setOverloaded(false); 706 } 707 } 708 709 710 711 @Override 712 public Object clone() { 713 return cloneBeanDefinition(); 714 } 715 716 717 public abstract AbstractBeanDefinition cloneBeanDefinition(); 718 719 @Override 720 public boolean equals(Object other) { 721 if (this == other) { 722 return true; 723 } 724 if (!(other instanceof AbstractBeanDefinition)) { 725 return false; 726 } 727 728 AbstractBeanDefinition that = (AbstractBeanDefinition) other; 729 730 if (!ObjectUtils.nullSafeEquals(getBeanClassName(), that.getBeanClassName())) return false; 731 if (!ObjectUtils.nullSafeEquals(this.scope, that.scope)) return false; 732 if (this.abstractFlag != that.abstractFlag) return false; 733 if (this.lazyInit != that.lazyInit) return false; 734 735 if (this.autowireMode != that.autowireMode) return false; 736 if (this.dependencyCheck != that.dependencyCheck) return false; 737 if (!Arrays.equals(this.dependsOn, that.dependsOn)) return false; 738 if (this.autowireCandidate != that.autowireCandidate) return false; 739 if (!ObjectUtils.nullSafeEquals(this.qualifiers, that.qualifiers)) return false; 740 if (this.primary != that.primary) return false; 741 742 if (this.nonPublicAccessAllowed != that.nonPublicAccessAllowed) return false; 743 if (this.lenientConstructorResolution != that.lenientConstructorResolution) return false; 744 if (!ObjectUtils.nullSafeEquals(this.constructorArgumentValues, that.constructorArgumentValues)) return false; 745 if (!ObjectUtils.nullSafeEquals(this.propertyValues, that.propertyValues)) return false; 746 if (!ObjectUtils.nullSafeEquals(this.methodOverrides, that.methodOverrides)) return false; 747 748 if (!ObjectUtils.nullSafeEquals(this.factoryBeanName, that.factoryBeanName)) return false; 749 if (!ObjectUtils.nullSafeEquals(this.factoryMethodName, that.factoryMethodName)) return false; 750 if (!ObjectUtils.nullSafeEquals(this.initMethodName, that.initMethodName)) return false; 751 if (this.enforceInitMethod != that.enforceInitMethod) return false; 752 if (!ObjectUtils.nullSafeEquals(this.destroyMethodName, that.destroyMethodName)) return false; 753 if (this.enforceDestroyMethod != that.enforceDestroyMethod) return false; 754 755 if (this.synthetic != that.synthetic) return false; 756 if (this.role != that.role) return false; 757 758 return super.equals(other); 759 } 760 761 @Override 762 public int hashCode() { 763 int hashCode = ObjectUtils.nullSafeHashCode(getBeanClassName()); 764 hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.scope); 765 hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.constructorArgumentValues); 766 hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.propertyValues); 767 hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.factoryBeanName); 768 hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.factoryMethodName); 769 hashCode = 29 * hashCode + super.hashCode(); 770 return hashCode; 771 } 772 773 @Override 774 public String toString() { 775 StringBuilder sb = new StringBuilder("class ["); 776 sb.append(getBeanClassName()).append("]"); 777 sb.append("; scope=").append(this.scope); 778 sb.append("; abstract=").append(this.abstractFlag); 779 sb.append("; lazyInit=").append(this.lazyInit); 780 sb.append("; autowireMode=").append(this.autowireMode); 781 sb.append("; dependencyCheck=").append(this.dependencyCheck); 782 sb.append("; autowireCandidate=").append(this.autowireCandidate); 783 sb.append("; primary=").append(this.primary); 784 sb.append("; factoryBeanName=").append(this.factoryBeanName); 785 sb.append("; factoryMethodName=").append(this.factoryMethodName); 786 sb.append("; initMethodName=").append(this.initMethodName); 787 sb.append("; destroyMethodName=").append(this.destroyMethodName); 788 if (this.resource != null) { 789 sb.append("; defined in ").append(this.resource.getDescription()); 790 } 791 return sb.toString(); 792 } 793 794 }
标签:blog types out pac 源码解析 检测 attribute ade 结构
原文地址:http://www.cnblogs.com/insaneXs/p/7797291.html