spring 4 笔记

spring4 笔记

  • spring与IOC
  • spring 与Aop
    • 切面类 五种通知
    • 方法签名execution

spring与IOC

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

spring 与Aop

1.** 前置通知 实现接口 MethodBeforeAdvice**

public class xxxxx implements  MethodBeforeAdvice{
  public void before(Method method ,Object[] args ,Object target) 
         throws Throwable{
         //业务代码
  }
}
  1. 后置通知 实现接口 AfterReturningAdvice
public class xxxxx implements  AfterReturningAdvice{
  public void afterReturning(Object returnValue,Method method ,Object[] args ,Object target) 
         throws Throwable{
        //业务代码
  }
}
  1. 环绕通知 实现接口 MethodInterceptor
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

  • execution(* com.springdemo.part1…(…))
    表示执行该包下所有类的所有方法,…表示任何参数
  • execution (public * AspectDemo.*(…))
    匹配 AspectDemo接口的所有公有方法
  • execution (public double AspectDemo.*(…))
    匹配 AspectDemo中返回 double 类型数值的方法
  • execution (public double AspectDemo.*(double, …))
    匹配第一个参数为 double 类型的方法, … 匹配任意数量任意类型的参数
  • execution (public double AspectDemo.*(double, double))
    匹配参数类型为 double, double 类型的方法
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>

你可能感兴趣的:(java)