2009-09-30 3 views

ответ

17

АОП - это то, что вам нужно здесь. AOP позволяет добавлять код в приложение без изменения исходного кода. Spring AOP предпочитает это делать с Прокси объектов. Прокси объекты используют узор декоратора для обертывания оригинала Target объект и добавьте код. Прокси Proxy сконфигурирован для реализации одного или нескольких интерфейсов исходного объекта Target.

Здесь, во время приложения, идея заключается в использовании PerformanceMonitorInterceptor, одного из классов контроля производительности, которые поставляются с Spring Framework.

Первый вариант заключается в использовании класса Spring ProxyFactoryBean для создания Spring AOP Прокси объектов. Для этого:

  • Определите оригинальный боб:
  • Определите PerformanceMonitorInterceptor:
  • Определите RegexpMethodPointcutAdvisor:
  • Определение ProxyFactoryBean к прокси исходный компонент и применить Advisor
  • Установите уровень журнала для PerformanceMonitorInterceptor на TRACE

Ниже конфигурации Spring, которая иллюстрирует эти шаги:

<beans> 
    <bean id="MyServiceTarget" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    <property name="advice" ref="timingLogger"/> 
    <property name="patterns"> 
     <list> 
     <value>.*</value> 
     </list> 
    </property> 
    </bean> 

    <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>org.myapp.services.MyService</value> 
    </property> 
    <property name="target"><ref local="MyServiceTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
     <value>timingAdvisor</value> 
     </list> 
    </property> 
    </bean> 
</beans> 

и конфигурации уровня журнала для PerformanceMonitorInterceptor:

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE 

Начиная с весны 2.0, есть еще один вариант: используя Spring 2.0 XML Schema-based configuration и весну AspectJ style pointcut expressions. С ProxyFactoryBean вы должны явно объявить интерфейсы, которые вы хотите прокси; используя теги <aop:config> и <aop:advisor>, вы можете автоматически проксировать каждый интерфейс каждого объекта в контейнере контейнера.

<beans "add xsd declarations here" > 
    <bean id="MyService" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingAdvice" 
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <aop:config> 
    <aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))" 
     advice-ref="timingAdvice"/> 
    </aop:config> 
</beans> 
+0

+1 Кажется, это то, о чем я просил :). –

+0

действительно хорошо. Поздравляю –

+0

Не знаю почему, но он не работает. Также отредактируйте код из * * to * * –

1

Для этого можно использовать AspectJ, объявить окошко для журнала, вызванное подстановочным знаком, с обработкой до и после обработки с помощью методов before() и after().

+0

может у вас привести пример? –

2

Наконец-то я понял, как это сделать.

Прежде всего см. Сообщение от 'Pascal Thivent', это очень помогло мне. После изменения вашего log4j.properties и создания timingAdvisor, что вам нужно, привязывая этого советника к классу, который вы хотите включить для отладки. Вы должны изменить свой код следующим образом.

ранее код:

<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
      <property name="anotherDao" ref="anotherDao"/> 
    </bean> 

Новый код.

<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
     <property name="anotherDao" ref="anotherDao"/> 
</bean> 


    <bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>com.xyz.sc.db.dao.MyTableDao</value> 
    </property> 
    <property name="target"><ref local="myTableDaoTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
      <value>timingAdvisor</value> 
     </list> 
    </property> 
</bean> 
1

Я вижу, что там уже был принят ответ здесь, но я призываю всех взглянуть на последней версии Spring ToolSuite (Дистрибутив SpringSource по Eclipse). Он поставляется с утилитой профилирования из «Spring Insight», которая обеспечивает точную статистику во время выполнения в хорошем формате. Просто разверните приложение в своем внутреннем tomcat, нажмите несколько страниц, затем перейдите в сервлет/insight и посмотрите время, проведенное в каждом методе, называемом вплоть до SQL-операторов, которые были выполнены и сколько времени они взяли.

Вот ссылка на хорошую запись о Spring Insight, которая должна получить вас, что вы хотите всего за несколько минут. http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/

4

Вы можете посмотреть stagemonitor. Это монитор производительности веб-приложений с открытым исходным кодом. Он фиксирует метрики времени ответа, метрики JVM, данные запроса (включая стек вызовов, захваченный профилировщиком запросов) и многое другое. Накладные расходы очень низкие.

По желанию вы можете использовать графический графический редактор с большим сроком хранения, чтобы хранить длинную историю datapoints, с которой вы можете смотреть с помощью удобных панелей.

Пример экрана: enter image description here

Посмотрите на project website, чтобы увидеть больше скриншотов, описания функций и документации.

Примечание: Я являюсь разработчиком stagemonitor

Смежные вопросы