您的位置:首页 > 编程语言 > Java开发

spring mvc 小记(三):关于AOP

2016-09-12 21:48 246 查看
使用spring mvc已有2年之久,却还是停留在使用阶段,感觉这么下去不是办法,所以还是想往深处一探究竟。

我们已经知道,Spring核心思想就是IOC和AOP,那这其中的AOP到底是啥?

从概念上讲,aop即面向切面编程,但是aop并不是spring独有的,只是spring把它用的比较到位而已。我们也可以在框架中自定义一个切面,作用是计算某个请求所耗费的时间,看看所谓的面向切面编程是什么样子的。前提是:spring
mvc框架已经存在。

用两种方式实现:

1、注解式

<span style="font-size:18px;"><!-- 通过在你的Spring的配置中引入下列元素来启用Spring对@AspectJ的支持 -->
<aop:aspectj-autoproxy/></span>
配置文件中开启切面注解,然后写一个普通类

<span style="font-size:18px;">@Aspect
@Component
public class TimeAspect1 {

private static Log logger = LogFactory.getLog(TimeAspect1.class);

// service层的统计耗时切面,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的
public static final String POINT = "execution(* com.jk.dao.*.*(..))";

/**
* 在切入点之前执行
*/
@Before(POINT)
publ
4000
ic void doBefore() {
logger.info("==========================befor================================");
}

/**
* 统计方法执行耗时Around环绕通知
* @param joinPoint
* @return
*/
@Around(POINT)
public Object timeAround(ProceedingJoinPoint joinPoint) {
// 定义返回对象、得到方法需要的参数
Object obj = null;
long startTime = System.currentTimeMillis();

try {
obj = joinPoint.proceed();
// 获取执行的方法名
long endTime = System.currentTimeMillis();
logger.info("-----方法执行耗时:" + (endTime-startTime) + " ms");

} catch (Throwable e) {
e.printStackTrace();
}
return obj;
}

/**
* 在切入点之后执行
*/
@After(POINT)
public void doAfter() {
logger.info("==========================after================================");
}
}</span>
在类上加一个@Aspect注解,该类被扫描时就会被当作一个切面,切面类中定义了3个方法,分别注解为@Befor、@Around、@After,在切入点之前、环绕、之后后执行,访问后可以看到相应的日志信息,并计算出了切点执行所耗费的时间。这里有一个要注意的地方,刚刚折腾了一下:这种配置下,controller貌似不能被当作切点,可能还需要其他特殊配置?

2、配置式

<span style="font-size:18px;"><!--自定义切面 开始-->
<bean id="TimeAspect2" class="com.jk.aspect.TimeAspect2"></bean>
<aop:config>
<aop:pointcut id="pc1" expression="execution(* com.jk.dao.*.*(..))"/>
<aop:aspect ref="TimeAspect2">
<aop:before method="befor" pointcut-ref="pc1"/>
<aop:around method="around" pointcut-ref="pc1"/>
<aop:after method="after" pointcut-ref="pc1"/>
</aop:aspect>
</aop:config>
<!--自定义切面 结束--></span>
在spring配置文件中加入上面的配置,切面所在的类和切点所在的包要注意配置准确,一一对应,然后就是编写切面类

<span style="font-size:18px;">public class TimeAspect2 {
private static final Log logger = LogFactory.getLog(TimeAspect2.class);

public void befor(){
logger.info("=====================befor============");
}

public Object around(ProceedingJoinPoint joinPoint){
Object object = null;
try {
long startTime = System.currentTimeMillis();
object = joinPoint.proceed();
Object [] args = joinPoint.getArgs();
for(Object o :args){
System.out.println("==="+o);
}
long endTime = System.currentTimeMillis();

logger.info("====本次花费:"+(endTime-startTime)+"ms");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return object;
}

public void after(){
logger.info("=======================after=============");
}
}</span>
两种切面配置完毕!

到此对于aop,我能想到的应用的地方就是spring的事务管理,还有例子中的统计某个类执行的时间,也算是对aop有了一点点了解,代码可能不是很完善,如果有大神能指点一二,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java spring mvc aop