From b2824635e06e8105f41040025ab89c4667dfe290 Mon Sep 17 00:00:00 2001 From: jialechan Date: Sat, 18 Oct 2014 11:15:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93=E4=BD=BF=E7=94=A8=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=20=E5=85=88?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=B8=80=E4=B8=AAStatAnnotationBeanPostProce?= =?UTF-8?q?ss=EF=BC=8C=20=E5=86=8D=E6=B3=A8=E5=86=8C=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=B8=BA=E2=80=9Cdruid-stat-interceptor?= =?UTF-8?q?=E2=80=9D=E7=9A=84DruidStatInterceptor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/DruidStatBeanDefinitionParser.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/support/spring/stat/config/DruidStatBeanDefinitionParser.java diff --git a/src/main/java/com/alibaba/druid/support/spring/stat/config/DruidStatBeanDefinitionParser.java b/src/main/java/com/alibaba/druid/support/spring/stat/config/DruidStatBeanDefinitionParser.java new file mode 100644 index 0000000000..56599b0b37 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/spring/stat/config/DruidStatBeanDefinitionParser.java @@ -0,0 +1,75 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.support.spring.stat.config; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.parsing.BeanComponentDefinition; +import org.springframework.beans.factory.parsing.CompositeComponentDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.w3c.dom.Element; + +public class DruidStatBeanDefinitionParser implements BeanDefinitionParser { + + public static final String STAT_ANNOTATION_PROCESSOR_BEAN_NAME = "com.alibaba.druid.support.spring.stat.annotation.internalStatAnnotationBeanPostProcessor"; + public static final String STAT_ANNOTATION_PROCESSOR_BEAN_CLASS = "com.alibaba.druid.support.spring.stat.annotation.StatAnnotationBeanPostProcessor"; + public static final String STAT_ANNOTATION_ADVICE_BEAN_NAME = "com.alibaba.druid.support.spring.stat.DruidStatInterceptor"; + public static final String STAT_ANNOTATION_ADVICE_BEAN_CLASS = "druid-stat-interceptor"; + + @Override + public BeanDefinition parse(Element element, ParserContext parserContext) { + Object source = parserContext.extractSource(element); + + CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); + parserContext.pushContainingComponent(compDefinition); + + BeanDefinitionRegistry registry = parserContext.getRegistry(); + + if (registry.containsBeanDefinition(STAT_ANNOTATION_PROCESSOR_BEAN_NAME)) { + parserContext.getReaderContext().error( + "Only one DruidStatBeanDefinitionParser may exist within the context.", source); + } else { + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .genericBeanDefinition(STAT_ANNOTATION_PROCESSOR_BEAN_CLASS); + builder.getRawBeanDefinition().setSource(source); + registerComponent(parserContext, builder, STAT_ANNOTATION_PROCESSOR_BEAN_NAME); + } + + if (!registry.containsBeanDefinition(STAT_ANNOTATION_ADVICE_BEAN_NAME)) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .genericBeanDefinition(STAT_ANNOTATION_ADVICE_BEAN_CLASS); + builder.getRawBeanDefinition().setSource(source); + registerComponent(parserContext, builder, STAT_ANNOTATION_ADVICE_BEAN_NAME); + } + + parserContext.popAndRegisterContainingComponent(); + + return null; + } + + private static void registerComponent(ParserContext parserContext, BeanDefinitionBuilder builder, + String beanName) { + + builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + parserContext.getRegistry().registerBeanDefinition(beanName, builder.getBeanDefinition()); + BeanDefinitionHolder holder = new BeanDefinitionHolder(builder.getBeanDefinition(), beanName); + parserContext.registerComponent(new BeanComponentDefinition(holder)); + } + +} \ No newline at end of file