如果你正在使用Spring管理/访问资源(Dao/Service),那么你可能也需要添加一些基础的性能监控。在Spring AOP的帮助下这将变成一个简单的任务,不需要任何现有代码的变化,只是一些简单的配置。
第一步,你首先的将spring-aop、aspectj和cglib库导入,如果你使用maven管理你的项目依赖的话,很简单加上如下依赖关系就可以了。
02
|
<
groupId
>org.aspectj</
groupId
>
|
03
|
<
artifactId
>aspectjweaver</
artifactId
>
|
04
|
<
version
>1.5.4</
version
>
|
07
|
<
groupId
>cglib</
groupId
>
|
08
|
<
artifactId
>cglib-nodep</
artifactId
>
|
09
|
<
version
>2.2</
version
>
|
12
|
<
groupId
>org.springframework</
groupId
>
|
13
|
<
artifactId
>spring-aop</
artifactId
>
|
14
|
<
version
>2.5.6</
version
>
|
接下来,指明你需要监视的内容,并把AOP配好。通常,仅仅需要在现有的SpringXML配置文件中增加一个横切点。这个配置将会将位于
包"com.mycompany.services"下的所有方法的响应时间记录下来。注:这些类必须使用Spring
context初始化,否则AOP将不会被执行。
1
|
<
bean
id
=
"performanceMonitor"
|
2
|
class
=
"org.springframework.aop.interceptor.PerformanceMonitorInterceptor"
/>
|
5
|
<
aop:pointcut
id
=
"allServiceMethods"
expression
=
"execution(* com.mycompany.services.*.*(..))"
/>
|
6
|
<
aop:advisor
pointcut-ref
=
"allServiceMethods"
advice-ref
=
"performanceMonitor"
order
=
"2"
/>
|
接下来,需要配置好日志系统,例如log4j。
1
|
<
logger
name
=
"org.springframework.aop.interceptor.PerformanceMonitorInterceptor"
additivity
=
"false"
>
|
2
|
<
level
value
=
"TRACE"
/>
|
3
|
<
appender-ref
ref
=
"STDOUT"
/>
|
ok了,现在我们运行一下程序你会发现下面的日志输出:
1
|
TRACE PerformanceMonitorInterceptor - StopWatch
'PerfTestService.processRequest'
: running
time
(millis) = 1322
|
2
|
TRACE PerformanceMonitorInterceptor - StopWatch
'PerfTestService.processRequest'
: running
time
(millis) = 98
|
3
|
TRACE PerformanceMonitorInterceptor - StopWatch
'PerfTestService.processRequest'
: running
time
(millis) = 1764
|
这些是大量的一些原始数据,但不幸的是这些东西对我们几乎没用,每一个方法调用都会有记录,而且缺乏一些其他信息。所以,除非你打算写一些日志分析程序、或者使用第三方软件,否则的话,我想你应该在日志被记录前做出一些处理。
一个简单的办法就是在这之间写一个简单的拦截器类来替代Spring给我们提供的默认的类
(PerformanceMonitorInterceptor)。下面的一个例子,这个例子提供了一些有用的信息(最后一个、平均、最大的响应时间),
另外当一个方法的响应时间超出指定的时间后给出警告。
默认的,每当十个方法调用的时候,做一次记录,在任何方法响应时间超过1000ms的时候给出警告。
01
|
public
class
PerfInterceptor
implements
MethodInterceptor {
|
03
|
Logger logger = LoggerFactory.getLogger(PerfInterceptor.
class
.getName());
|
04
|
private
static
ConcurrentHashMap<String, MethodStats> methodStats =
new
ConcurrentHashMap<String, MethodStats>();
|
05
|
private
static
long
statLogFrequency =
10
;
|
06
|
private
static
long
methodWarningThreshold =
1000
;
|
08
|
public
Object invoke(MethodInvocation method)
throws
Throwable {
|
09
|
long
start = System.currentTimeMillis();
|
11
|
return
method.proceed();
|
14
|
updateStats(method.getMethod().getName(),(System.currentTimeMillis() - start));
|
18
|
private
void
updateStats(String methodName,
long
elapsedTime) {
|
19
|
MethodStats stats = methodStats.get(methodName);
|
21
|
stats =
new
MethodStats(methodName);
|
22
|
methodStats.put(methodName,stats);
|
25
|
stats.totalTime += elapsedTime;
|
26
|
if
(elapsedTime > stats.maxTime) {
|
27
|
stats.maxTime = elapsedTime;
|
30
|
if
(elapsedTime > methodWarningThreshold) {
|
31
|
logger.warn(
"method warning: "
+ methodName +
"(), cnt = "
+ stats.count +
", lastTime = "
+ elapsedTime +
", maxTime = "
+ stats.maxTime);
|
34
|
if
(stats.count % statLogFrequency ==
0
) {
|
35
|
long
avgTime = stats.totalTime / stats.count;
|
36
|
long
runningAvg = (stats.totalTime-stats.lastTotalTime) / statLogFrequency;
|
37
|
logger.debug(
"method: "
+ methodName +
"(), cnt = "
+ stats.count +
", lastTime = "
+ elapsedTime +
", avgTime = "
+ avgTime +
", runningAvg = "
+ runningAvg +
", maxTime = "
+ stats.maxTime);
|
40
|
stats.lastTotalTime = stats.totalTime;
|
45
|
public
String methodName;
|
47
|
public
long
totalTime;
|
48
|
public
long
lastTotalTime;
|
51
|
public
MethodStats(String methodName) {
|
52
|
this
.methodName = methodName;
|
现在,你只需要将你的Spring配置文件中做相关修改,将这个类应用进去,再运行程序,你将会看到如下的统计信息。
1
|
WARN PerfInterceptor - method warning: processRequest(), cnt = 10, lastTime = 1072, maxTime = 1937
|
2
|
TRACE PerfInterceptor - method: processRequest(), cnt = 10, lastTime = 1072, avgTime = 1243, runningAvg = 1243, maxTime = 1937
|
3
|
WARN PerfInterceptor - method warning: processRequest(), cnt = 20, lastTime = 1466, maxTime = 1937
|
4
|
TRACE PerfInterceptor - method: processRequest(), cnt = 20, lastTime = 1466, avgTime = 1067, runningAvg = 892, maxTime = 1937
|
正如你看到的一样,这些统计数据可以在不修改任何现有的Java代码的情况下,提供有关class/method性能的有价值的反馈,而根据这个日志,你可以很轻松的找出程序中的瓶颈。
分享到:
相关推荐
此外,`springtest`文件可能包含了一些用于测试Spring AOP性能监控器的示例代码,你可以根据这些代码进一步实践和理解这个主题。记住,理论知识与实际操作相结合才能更好地掌握技术。 总结来说,Spring AOP性能监控...
使用 Spring AOP 进行方法耗时监测的好处有以下几点: 1. 代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 ...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如日志、性能监控等。在运行时,这些关注点被编织到应用程序的主业务逻辑中,使得代码更简洁、模块化。在Spring AOP中,切面...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
- **性能监控**:记录方法执行时间,分析系统性能瓶颈。 ### 6. 性能对比 JDK动态代理由于基于接口,对非接口类无法处理,而CGLIB则无此限制,但CGLIB的性能相对较低。在实际应用中,应根据具体需求和性能要求选择...
Spring AOP(面向切面编程)是...这样,我们可以保持业务逻辑的清晰,同时实现系统级的服务,如事务管理、日志记录、性能监控等。在实际项目中,正确配置和使用这些依赖库,对于实现高效、灵活的面向切面编程至关重要。
Spring框架提供了对AOP的强大支持,使得我们可以方便地实现日志记录、事务管理、性能监控等多种跨切面的关注点。 首先,让我们深入理解一下Spring AOP的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或横切关注点(如日志、事务管理、性能监控等)注入的方式。在本Demo中,我们将深入探讨Spring AOP...
AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、事务管理、性能监控等,与业务逻辑解耦。要使用Spring的AOP功能,我们需要引入特定的库,这正是标题中提到的"Spring使用AOP的三个...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在使用Spring AOP时,通常需要引入特定的jar包来支持其功能。...
- **性能监控**:在关键方法前、后插入性能计时通知,便于性能分析。 - **权限校验**:在方法执行前进行用户权限验证,确保安全。 5. **源码解析** - Spring AOP的实现涉及到反射、动态代理、代理模式等多个核心...
9. **应用场景**:Spring AOP常用于日志记录、事务管理、性能监控、安全性控制等。例如,你可以定义一个切面来记录所有服务层方法的调用,或者在每次数据库操作前开启事务并在操作成功后提交事务。 通过以上介绍,...
3. 性能监控:统计方法的执行时间,用于性能分析。 4. 安全控制:在方法调用前检查权限。 总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务管理、性能监控等。...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过在运行时插入额外的行为(如日志记录、性能监控等)来增强对象的功能。动态代理则是Spring AOP实现的核心技术之一...
- 性能监控:统计方法的执行时间和调用次数。 7. **实战演练** 创建一个简单的Spring AOP应用,首先定义一个切面类,包含切点和通知,然后在Spring配置文件中启用AOP并注册切面,最后编写测试类验证AOP功能是否...