<bean id="securityHandler" class="com.zqblogs.spring.handle.SecurityHandler"></bean>
<!-- 切面对象 -->
<bean id="userManager" class="com.zqblogs.spring.UserManagerImpl"/> <!-- 目标对象 -->
<aop:aspectj-autoproxy/>
<aop:config> <!-- 用配置方式去注册aop -->
<aop:aspect id="security" ref="securityHandler"> <!-- 指明是切面对象 ,找到advice-->
<!-- 切面的 pointcut,expression指明了advice的作用范围->
<aop:pointcut id="allAddMethod" expression="execution(* com.zqblogs.spring.bean.add*(..))"></aop:pointcut>
<!--定义切面对象的advice,并指明该advice的pointcut-->
<aop:before method="checkSecurity" pointcut-ref="allAddMethod"></aop:before>
</aop:aspect>
<bean id="userManager" class="com.zqblogs.spring.UserManagerImpl"/> <!-- 目标对象 -->
<aop:aspectj-autoproxy/>
<aop:config> <!-- 用配置方式去注册aop -->
<aop:aspect id="security" ref="securityHandler"> <!-- 指明是切面对象 ,找到advice-->
<!-- 切面的 pointcut,expression指明了advice的作用范围->
<aop:pointcut id="allAddMethod" expression="execution(* com.zqblogs.spring.bean.add*(..))"></aop:pointcut>
<!--定义切面对象的advice,并指明该advice的pointcut-->
<aop:before method="checkSecurity" pointcut-ref="allAddMethod"></aop:before>
</aop:aspect>
</aop:config>
param-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.*(..))")
另外cglib动态代理配置和jdk动态代理一样,spring会根据目标类是否实现了接口来决定使用哪一种方式。