1.在xml配置文件里面注册注入的bean 优先级要大于在在代码中添加的注解
2.xml配置文件生效是需要set和get方法的 基于注解的方式不需要
3.使用步骤
使用注解的步骤:
添加context的名称控件和约束
开启注解扫描:由spring扫描指定的包及其子包下的所有类,如果类上使用了@Component注解,就将该类装配到容器中
在类上使用@Component注解
使用注解之前一定要先开启注解扫描
<context:component-scan base-package="com.demon"/>
https://blog.csdn.net/qq_23329167/article/details/82791926
1.** 前置通知 实现接口 MethodBeforeAdvice**
public class xxxxx implements MethodBeforeAdvice{
public void before(Method method ,Object[] args ,Object target)
throws Throwable{
//业务代码
}
}
public class xxxxx implements AfterReturningAdvice{
public void afterReturning(Object returnValue,Method method ,Object[] args ,Object target)
throws Throwable{
//业务代码
}
}
public class xxxxx implements MethodInterceptor{
public void invoke(MethodInvocation invocation)
throws Throwable{
//业务代码
onject result = invocation.proceed()
return result
}
}
4.异常通知 实现 ThrowsAdvice
5.**NameMatchMethodPointcutAdvisor(名称匹配方法切入点顾问) **
<bean id="beforeAdvice" class="com.aop.advice.MyBeforeAdvice">bean>
<bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice" />
<property name="mappedNames" value="*User*" />
<bean id="beforeAdvisorProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="userService" />
<property name="interfaces" value="com.aop.service.IUserService" />
<property name="interceptorNames" value="beforeAdvisor" />
bean>
6.正则表达式指定切入点
bean>
bean>
<property name="advice" ref="myAfterReturningAdvice">property>
<property name="pattern" value=".*ir.*"/>
bean>
<property name="target" ref="someService"/>
<property name="interceptorNames" value="myAdvisor"/>
bean>
7.基于注解 AspectJ
在xml文件里面添加
<aop:aspectj-autoproxy>
当Spring IOC容器侦测到这句代码时,会自动为与切面匹配的Bean创建代理。
在AspectJ注解中,切面只是一个带有@Aspect注解的Java类,通知是标注有某种注解的简单的Java方法。
@Before:前置通知,在方法之前执行。
@After:后置通知,方法之后执行。
@AfterReturning:返回通知,方法返回结果后执行。
@AfterThrowing:异常通知,在方法抛出异常之后。
@Around:环绕通知,围绕方法执行。
@Aspect
@Service
public class AspectTest {
@Before("execution(* com.springdemo.part1.*.*(..))")
public void before(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("method: " + methodName + " begins");
}
@After("execution(* com.springdemo.part1.*.*(..))")
public void After(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("method: " + methodName + " ends");
}
/**
* 加个returning属性,该属性值与方法参数名称一致
* @param joinPoint
* @param result
*/
@AfterReturning(value="execution(* com.springdemo.part1.*.*(..))",returning="result")
public void AfterReturning(JoinPoint joinPoint,Object result ){
String methodName=joinPoint.getSignature().getName();
System.out.println("method: "+methodName+" return result:"+result);
}
/**
* 该方法定义了Exception最高异常级别,也可以定义具体异常
* @param joinPoint
* @param exception
*/
@AfterThrowing(value="execution(* com.springdemo.part1.*.*(..))",throwing="exception")
public void afterThrowing(JoinPoint joinPoint, Exception exception){
String methodName=joinPoint.getSignature().getName();
}
/**
* 环绕通知需带着ProceedingJoinPoint参数
* ProceedingJoinPoint参数决定是否执行目标方法
* 必须有返回值
* @param pjp
* @return
*/
@Around(value = "execution(* com.springdemo.part1.*.*(..))")
public Object around(ProceedingJoinPoint pjp) {
System.out.println("前");
Object result= pjp.proceed()
System.out.println("后");
return result;
}
}
execution(* com.loongshawn.method.ces..*.*(..))
表达式结构解释如下:
标识符 | 含义 |
---|---|
execution() | 表达式的主体 |
第一个“*”符号 | 表示返回值的类型任意 |
com.loongshawn.method.ces | AOP所切的服务的包名,即,需要进行横切的业务类 |
包名后面的“..” | 表示当前包及子包 |
第二个“*” | 表示类名,*即所有类 |
.*(..) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 |
7.基于xml AspectJ
<bean id="arithmeticCalculator" class="com.web.aop.impl.xml.ArithmeticCalculatorImpl">bean>
<bean id="loggingAspect" class="com.web.aop.impl.xml.LoggingAspect">bean>
<bean id="validateAspect" class="com.web.aop.impl.xml.ValidateAspect">bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.web.aop.impl.xml.ArithmeticCalculatorImpl.*(int, int))" />
<aop:aspect ref="loggingAspect" order="1" >
<aop:before method="beforMethod" pointcut-ref="pointcut"/>
<aop:after method="afterMethod" pointcut-ref="pointcut"/>
<aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="exception"/>
<aop:around method="aroundMethod" pointcut-ref="pointcut" />
aop:aspect>
<aop:aspect ref="validateAspect" order="2" >
<aop:before method="beforMethod" pointcut-ref="pointcut"/>
aop:aspect>
aop:config>