spring aop 谁能简单说一下 如果不用spring ,aop该怎么实现呢??
------解决方案--------------------
spring Aop面向切面编程可以使用配制文件和注解两种方式实现(一般用在权限拦截,运行期监控):
配制文件:
<bean id="myInterceptor" class="cn.xmlaop.service.MyInterceptor"/>//切面类
<bean id="personService" class="cn.xmlaop.service.impl.PersonServiceImpl"></bean>
<aop:config>
<aop:aspect id="myAspect" ref="myInterceptor">//声明切面,调用切面类,注:切面点,通知在这个配制里
<aop:pointcut id="myPointCut" expression="execution (* cn.xmlaop.service.impl.PersonServiceImpl.*(..))"/>//定义切面点,表达式用来包含哪些方法需要通知
前置通知:<aop:before pointcut-ref="myPointCut" method="doAccessCheck"/>//通知,pointcut-ref引用切点,method引用切面里的某个方法
</aop:aspect>
</aop:config>
注解方式:
@Aspect//定义为切面类 @Component("myInteceptor")//实例化
public class MyInteceptor {
@Pointcut("execution(* cn.springaop.service.impl.*.*(..))")//切点
public void AnyMethod(){//用方法的方式定义切点的名称(ID)
}
@Before("AnyMethod() && args(name)")//前置通知,args(name)//name跟前置方法里的参数名称一样,通知只有一个为String类型参数的的方法
public void doBefore(String name){
System.out.println("前置通知:"+name);
}
@AfterReturning(pointcut="AnyMethod()",returning="result")//后置通知,returning="result",只有通知有返回类型为String的方法
public void doAfterReturning(String result){
System.out.println("后置通知:"+result);
}
@After("AnyMethod()")
public void doAfter(){
System.out.println("最终通知");
}
@AfterThrowing("AnyMethod()")
public void doAfterThrowing(){
System.out.println("例外通知");
}
@Around("AnyMethod()")//环绕通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
//if(){//判断用户是否在权限
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("退出方法");
//}
return result;
}
}
spring aop是通过创建代理对象来实现的,自己可以用JDK代理和Cglib代理来实现,具体代码就不贴了