当前位置: 首页 > news >正文

wordpress 响应式 企业网站如何架设网站服务器

wordpress 响应式 企业网站,如何架设网站服务器,网站换友链平台,公司内部网站规划随着spingboot的大火#xff0c;注解式配置受到了大家的热烈欢迎#xff0c;而Component和Configuration都可以作为配置类#xff0c;之前一直都没觉得这两个用起来有什么差别#xff0c;可能有时程序跑的和自己想的有所区别也没注意到。 直到看到这篇文章#xff1a;htt…随着spingboot的大火注解式配置受到了大家的热烈欢迎而Component和Configuration都可以作为配置类之前一直都没觉得这两个用起来有什么差别可能有时程序跑的和自己想的有所区别也没注意到。 直到看到这篇文章https://my.oschina.net/guangshan/blog/1807721 。我意识到Component和Configuration是有区别的错误的使用可能会导致严重的后果。 请看下面一段代码 Configuration public class MyTestConfig {Beanpublic Driver driver(){Driver driver new Driver();driver.setId(1);driver.setName(driver);driver.setCar(car());return driver;}Beanpublic Car car(){Car car new Car();car.setId(1);car.setName(car);return car;} }测试代码如下RunWith(SpringRunner.class) SpringBootTest public class TestApplicationTests {Autowiredprivate Car car;Autowiredprivate Driver driver;Testpublic void contextLoads() {boolean result driver.getCar() car;System.out.println(result ? 同一个car : 不同的car);}}打印结果如下 同一个car替换为Component后的打印结果 不同的car从上面的结果可以发现使用Configuration时在driver和spring容器之中的是同一个对象而使用Component时是不同的对象。 造成不同结果的原因在ConfigurationClassPostProcessor类之中通过调用enhanceConfigurationClasses方法为被注解Configuration的类进行CGLIB代理代码如下 public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) {MapString, AbstractBeanDefinition configBeanDefs new LinkedHashMapString, AbstractBeanDefinition();for (String beanName : beanFactory.getBeanDefinitionNames()) {BeanDefinition beanDef beanFactory.getBeanDefinition(beanName);if (ConfigurationClassUtils.isFullConfigurationClass(beanDef)) {//判断是否被Configuration标注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.isWarnEnabled() beanFactory.containsSingleton(beanName)) {logger.warn(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 immediatelyreturn;}ConfigurationClassEnhancer enhancer new ConfigurationClassEnhancer();for (Map.EntryString, AbstractBeanDefinition entry : configBeanDefs.entrySet()) {AbstractBeanDefinition beanDef entry.getValue();// If a Configuration class gets proxied, always proxy the target classbeanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE);try {// Set enhanced subclass of the user-specified bean classClass? configClass beanDef.resolveBeanClass(this.beanClassLoader);Class? enhancedClass enhancer.enhance(configClass, this.beanClassLoader);//生成代理的classif (configClass ! enhancedClass) {if (logger.isDebugEnabled()) {logger.debug(String.format(Replacing bean definition %s existing class %s with enhanced class %s, entry.getKey(), configClass.getName(), enhancedClass.getName()));}//替换class将原来的替换为CGLIB代理的classbeanDef.setBeanClass(enhancedClass);}}catch (Throwable ex) {throw new IllegalStateException(Cannot load configuration class: beanDef.getBeanClassName(), ex);}}}判断是否为配置类的代码如下 //是否为配置类 public static boolean isConfigurationCandidate(AnnotationMetadata metadata) { return (isFullConfigurationCandidate(metadata) || isLiteConfigurationCandidate(metadata)); }//是否为完整配置类 public static boolean isFullConfigurationCandidate(AnnotationMetadata metadata) { return metadata.isAnnotated(Configuration.class.getName()); } //是否为精简配置类 public static boolean isLiteConfigurationCandidate(AnnotationMetadata metadata) {// Do not consider an interface or an annotation...if (metadata.isInterface()) {return false;}// Any of the typical annotations found?for (String indicator : candidateIndicators) {if (metadata.isAnnotated(indicator)) {return true;}}// Finally, lets look for Bean methods...try {return metadata.hasAnnotatedMethods(Bean.class.getName());}catch (Throwable ex) {if (logger.isDebugEnabled()) {logger.debug(Failed to introspect Bean methods on class [ metadata.getClassName() ]: ex);}return false;} } //精简配置类包含的注解 static {candidateIndicators.add(Component.class.getName());candidateIndicators.add(ComponentScan.class.getName());candidateIndicators.add(Import.class.getName());candidateIndicators.add(ImportResource.class.getName()); }从上面可以看到虽然Component注解也会当做配置类但是并不会为其生成CGLIB代理Class所以在生成Driver对象时和生成Car对象时调用car()方法执行了两次new操作所以是不同的对象。当时Configuration注解时生成当前对象的子类Class并对方法拦截第二次调用car()方法时直接从BeanFactory之中获取对象所以得到的是同一个对象。 至于产生CGLIB代理的流程可以看一下下面链接其中含有详细介绍https://my.oschina.net/guangshan/blog/1807721
http://wiki.neutronadmin.com/news/1802/

相关文章: