给高中学弟学妹们

毕业已10年,但是高中的岁月仿佛昨日,雪天的打闹,同桌的微笑,青春的烦恼;英语的周报,黄冈的卷子,海淀的大纲。

以下是一个过来人的经验之谈,望学弟学妹们看完以后有一些心得。

  1. 专业问题:我只说说计算机专业,其他的大家可以网上找一些资料看。计算机专业主要学习内容偏逻辑和数学。

毕业以后三个主要方向:一个是工程类型,在公司实际编写软件,主要内容是应用语言以及现有框架,实现逻辑,完成功能,俗称码农(www.coolshell.cn,是一个高级工程师的博客,可以看看);另一个是研究类型,主要是编写、完善和优化各种基础软件,为工程码农提供便利(www.apache.com 是一个基金会,全世界最有名的开源软件社区,包含很多种框架类软件,大家可以看看功能);最后一个是学术类型,主要是搞理论研究,搞底层算法,发表论文,是揭示真理的人员(http://www.yinwang.org/ 是一个搞计算机语言分析的工程师的博客,有才但是愤世嫉俗)。

  1. 学习问题:高中阶段学习固然重要,但是我认为大学和研究生阶段的学习更加重要。高中学习有升学压力,学习相对注重应试,学习方向清晰,到了大学以后反而迷茫起来(最起码我当时是)。现在回头想想,人的任何提升,本质上都是认知的提升,回想一下我的往事,凡是有价值的东西,其实都是各种学习和经历得来的,正因为大学的自由,所以大学期间,我们可以从许多方向上提升认知,大学期间至少应该做这些事情:

  2. 学习一种乐器,以后学起来比较困难

  3. 多去图书馆,多读书,特别是名人传记,这样可以参考其他人的奋斗和生活方式
  4. 确定奋斗方向,一旦确定,就全力以赴,老师、同学、学生会、社团甚至学校都是你的资源
  5. 谈一场恋爱,老司机除外

希望大家可以少走弯路,有任何问题,欢迎qq咨询,753567658。

使用 spring AOP 监控代码的执行耗时

前言

使用spring提供的aop功能,我们可以很方便的实现动态代理的功能。在使用上,spring提供了两种不同的实现,分别是Spring AOP 和 AspectJ。

提供方式以及对比

spring AOP

概述

  1. 纯java实现,不需要额外的编译流程,不需要引用其他三方包。
  2. 适合集成到Servlet容器或者应用服务中
  3. 仅支持方法级别的代理,不支持成员变量
  4. 设计宗旨是集成IoC,并且有效的解决大部分企业级应用中的需求,不同于AspectJ的细粒度。
  5. 与AspectJ进行互补

非侵略性是spring设计的一个中心原则,一般情况下,不会有spring的代码存在与业务代码中。但是某些情况中,不是这样,比如注解。

实现

默认使用标准JDK中的 动态代理是实现,针对任意接口,都可以实现。

可以配置使用CGLIB进行代理,可以针对类进行代理。CGLIB的使用,对开发者是透明得到,在针对没有实现接口的类进行代理的时候,spring会自动使用CGLIB进行实现。

一般情况下,建议业务类都实现一个接口,是比较好的编程实现

这个另说把,不必要的接口实现了以后,除了繁琐没有其他作用

在一个类实现了多个接口的时候,可以强制使用CGLIB。

很多考虑的地方 spring文档
xml
<aop:config proxy-target-class="true">
<!-- other beans defined here... -->
</aop:config>

案例

项目需要统计一下一个service类的核心方法执行时间

但是通常,一个核心方法内部有很多的子方法,如何在做代理的时候,将所所有方法进行代理

本次的实现,使用了AspectJ。

代码如下:

代理配置

package com.xxx.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * Created by xxxx on 17/3/22.
 */
@Aspect
@Component
public class CostTimeAspect {

    @Around("execution(* com.xxx.service.AService.*(..))")
    public Object printTimeMethod(ProceedingJoinPoint pjp) throws Throwable {

        long time = System.currentTimeMillis();
        Object obj = pjp.proceed();
        long cost = System.currentTimeMillis() - time;
        if (cost > 0) {
            System.out.println(pjp.getSignature().toShortString() + "costs mills:" + cost);
        }
        return obj;
    }

}

spring.xml

<aop:aspectj-autoproxy />

pom.xml

需要在 build 节点中增加,并且要适配指定的jdk版本

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.4</version>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>1.7.3</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>1.7.3</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <outxml>true</outxml>
                <verbose>true</verbose>
                <showWeaveInfo>true</showWeaveInfo>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>