文章分类 » Blog my Blog

spring之面向切面编程(AOP)PointCut匹配法则说明

Pointcut 是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合.
args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
其中execution 是用的最多的,其格式为:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
returning type pattern,name pattern, and parameters pattern是必须的.
ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法.
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型.
举例说明:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”)
***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

pointcutexp包里的任意类.
within(com.test.spring.aop.pointcutexp.*)
pointcutexp包和所有子包里的任意类.
within(com.test.spring.aop.pointcutexp..*)
实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
this(com.test.spring.aop.pointcutexp.Intf)
***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

带有@Transactional标注的所有类的任意方法.
@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional)
带有@Transactional标注的任意方法.
@annotation(org.springframework.transaction.annotation.Transactional)
***> @within和@target针对类的注解,@annotation是针对方法的注解

参数带有@Transactional标注的方法.
@args(org.springframework.transaction.annotation.Transactional)
参数为String类型(运行是决定)的方法.
args(String)
Pointcut 可以通过Java注解和XML两种方式配置,如下所示:

  1. <aop:config>
  2.     <aop:aspectrefaop:aspectref=”aspectDef”>
  3.         <aop:pointcutidaop:pointcutid=”pointcut1″expression=”execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”/>
  4.         <aop:before pointcut-ref=”pointcut1″ method=”beforeAdvice” />
  5.     </aop:aspect>
  6. </aop:config>
  7. @Component
  8. @Aspect
  9. public class AspectDef {
  10.     //@Pointcut(“execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”)
  11.     //@Pointcut(“within(com.test.spring.aop.pointcutexp..*)”)
  12.     //@Pointcut(“this(com.test.spring.aop.pointcutexp.Intf)”)
  13.     //@Pointcut(“target(com.test.spring.aop.pointcutexp.Intf)”)
  14.     //@Pointcut(“@within(org.springframework.transaction.annotation.Transactional)”)
  15.     //@Pointcut(“@annotation(org.springframework.transaction.annotation.Transactional)”)
  16.     @Pointcut(“args(String)”)
  17.     public void pointcut1() {
  18.     }
  19.     @Before(value = “pointcut1()”)
  20.     public void beforeAdvice() {
  21.         System.out.println(“pointcut1 @Before…”);
  22.     }

java_memcached-release 关键类及方法整理

java_memcached-release 关键类及方法整理说明如下。
SockIOPool
  这个类用来创建管理客户端和服务器通讯连接池,客户端主要的工作包括数据通讯、服务器定位、hash 码生成等都是由这个类完成的。
1.public static SockIOPool getInstance()
  获得连接池的单态方法。这个方法有一个重载方法getInstance( String poolName ),每个poolName 只构造一个SockIOPool 实例。缺省构造的poolName 是default。如果在客户端配置多个memcached 服务,一定要显式声明poolName。
2.public void setServers( String[] servers )
  设置连接池可用的cache 服务器列表,server 的构成形式是IP:PORT(如:127.0.0.1:11211)
3.public void setWeights( Integer[] weights )
  设置连接池可用cache 服务器的权重,和server 数组的位置一一对应其实现方法是通过根据每个权重在连接池的bucket 中放置同样数目的server(如下代码所示),因此所有权重的最大公约数应该是1,不然会引起bucket 资源的浪费。
4.public void setInitConn( int initConn )
  设置开始时每个cache 服务器的可用连接数
5.public void setMinConn( int minConn )
  设置每个服务器最少可用连接数
6.public void setMaxConn( int maxConn )
  设置每个服务器最大可用连接数
7.public void setMaxIdle( long maxIdle )
  设置可用连接池的最长等待时间
8.public void setMaintSleep( long maintSleep )
  设置连接池维护线程的睡眠时间 设置为0,维护线程不启动 维护线程主要通过log 输出socket 的运行状况,监测连接数目及空闲等待时间等参数以控制连接创建和关闭。
9.public void setNagle( boolean nagle )
  设置是否使用Nagle 算法,因为我们的通讯数据量通常都比较大(相对TCP 控制数据)而且要求响应及时,因此该值需要设置为false(默认是true)
10.public void setSocketTO( int socketTO )
  设置socket 的读取等待超时值
11.public void setSocketConnectTO( int socketConnectTO )
  设置socket 的连接等待超时值
12.public void setAliveCheck( boolean aliveCheck )
  设置连接心跳监测开关。 设为true 则每次通信都要进行连接是否有效的监测,造成通信次数倍增,加大网络负载,因此该参数应该在对HA 要求比较高的场合设为TRUE,默认状态是false。
13.public void setFailback( boolean failback )
  设置连接失败恢复开关 设置为TRUE,当宕机的服务器启动或中断的网络连接后,这个socket 连接还可继续使用,否则将不再使用,默认状态是true,建议保持默认。
14.public void setFailover( boolean failover )
  设置容错开关 设置为TRUE,当当前socket 不可用时,程序会自动查找可用连接并返回,否则返回NULL,默认状态是true,建议保持默认。
15.public void setHashingAlg( int alg )
  设置hash 算法 alg=0 使用String.hashCode()获得hash code,该方法依赖JDK,可能和其他客户端不兼容,建议不使用 alg=1 使用original 兼容hash 算法,兼容其他客户端; alg=2 使用CRC32 兼容hash 算法,兼容其他客户端,性能优于original 算法; alg=3 使用MD5 hash 算法采用前三种hash 算法的时候,查找cache 服务器使用余数方法。采用最后一种hash 算法查找cache 服务时使用consistent 方法。
16.public void initialize()
  设置完pool 参数后最后调用该方法,启动pool。
MemcachedClient
1.public void setCompressEnable( boolean compressEnable )
  设定是否压缩放入cache 中的数据 默认值是ture 如果设定该值为true,需要设定CompressThreshold
2.public void setCompressThreshold( long compressThreshold )
  设定需要压缩的cache 数据的阈值 默认值是30k
3.public void setPrimitiveAsString( boolean primitiveAsString )
  设置cache 数据的原始类型是String .默认值是false 只有在确定cache 的数据类型是string 的情况下才设为true,这样可以加快处理速度。
4.public void setDefaultEncoding( String defaultEncoding )
  当primitiveAsString 为true 时使用的编码转化格式 默认值是utf‐8 如果确认主要写入数据是中文等非ASCII 编码字符,建议采用GBK 等更短的编码格式
5.cache 数据写入操作方法
5.1.set 方法
  将数据保存到cache 服务器,如果保存成功则返回true 如果cache 服务器存在同样的key,则替换之 set 有5 个重载方法,key 和value 是必须的参数,还有过期时间,hash 码,value 是否字符串三个可选参数
5.2.add 方法
  将数据添加到cache 服务器,如果保存成功则返回true 如果cache 服务器存在同样key,则返回false add 有4 个重载方法,key 和value 是必须的参数,还有过期时间,hash 码两个可选参数
5.3.replace 方法
  将数据替换cache 服务器中相同的key,如果保存成功则返回true如果cache 服务器不存在同样key,则返回false replace 有4 个重载方法,key 和value 是必须的参数,还有过期时间,hash 码两个可选参数 建议分析key 的规律,如果呈现某种规律有序,则自己构造hash 码,提高存储效率
6.cache 数据读取操作方法
  使用get 方法从cache 服务器获取一个数据 如果写入时是压缩的或序列化的,则get的返回会自动解压缩及反序列化 get 方法有3 个重载方法,key 是必须的参数,hash 码和value是否字符串是可选参数 .

配置ant

Windows 下的安装和配置

安装步骤:

  1. 下载最新版本,ANT官方网站: http://ant.apache.org/ 下载后解压缩即可。
  2. 配置环境变量:

打开环境变量配置窗口可以通过下面步骤打开:我的电脑(Vista之后叫 计算机) –> 右键属性菜单点击 –> 高级(Vista之后是 高级系统设置) –>  点击环境变量按钮(如下图:)

image

然后在随后出现的环境变量窗口中的系统变量这里,增加下面的两个设置:

image

  • ANT_HOME:C:apache-ant-1.7.1                 (这里为你自己解压缩的目录)
  • PATH:%ANT_HOME%bin                          (这个设置是为了方便在dos环境下操作)

 

完成上述步骤,就安装完毕。

 

查看是否安装成功。

在dos窗口中输入命令ant,若出现结果:
Buildfile:build.xml does not exist!
Build failed
说明ant安装成功!因为ant默认运行build.xml文件,这个文件需要我们建立。

 

一个简单的使用ANT的例子

在 D 盘根目录下新建一个 build.xml 文件,文件的内容如下:

<?xml version="1.0" encoding="GBK"?>
<project name="测试脚本" default="copyfile" basedir="." >
   <target name="copyfile">
      <copy file="d:/a.txt" todir="e:/Temp" overwrite="true" />
   </target>
</project>

在 D 盘根目录下新建一个 a.txt 文件,内容随便。

进入DOS,依次执行:

d:
ant

如同下面的截图:

image

执行完毕后,我们会在 e:/Temp 目录下看到 a.txt 文件,跟D盘根目录下的完全一样,即Copy成功。

 

 

如果中间提示类似如下错误:

Unable to locate tools.jar. Expected to find it in C:Program FilesJavajre6libtools.jar

这是因为JDK 的安装有问题或者是 JAVA_HOME 环境变量没有设置或者设置有问题, jre下肯定没tools.jar。