Bootstrap

Spring注解大全(二)

目录:

@Pointcut

定义切点,切点表达式(execution(权限访问符 返回值类型 方法所属的类名包路径.方法名(形参类型) 异常类型))

@Aspect@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}

    .......
}

@Before

前置增强,配合@Pointcut一起使用

@Aspect@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}
     
    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint jp){
        System.out.println("我是方法"+jp.getSignature().getName()+"的前置增强!");      
    }
}

@AfterReturning

后置增强,配合@Pointcut一起使用

@Aspect
@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}
     
    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint jp){
        System.out.println("我是方法"+jp.getSignature().getName()+"的前置增强!");      
    }

     //后置增强
     @AfterReturning(value = "pointcut()",returning = "obj")
     public void afterReturning(JoinPoint jp,Object obj){
         System.out.println("我是方法"+jp.getSignature().getName()+"的后置增强!"+",返回值为"+obj);
     }


}

@Around

环绕增强,配合@Pointcut一起使用

@Aspect
@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}
     
    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint jp){
        System.out.println("我是方法"+jp.getSignature().getName()+"的前置增强!");      
    }

     //后置增强
     @AfterReturning(value = "pointcut()",returning = "obj")
     public void afterReturning(JoinPoint jp,Object obj){
         System.out.println("我是方法"+jp.getSignature().getName()+"的后置增强!"+",返回值为"+obj);
     }

     //环绕增强
     @Around("pointcut()")
     public void around(ProceedingJoinPoint jp) throws Throwable {
         System.out.println("我是环绕增强中的前置增强!");
         Object proceed = jp.proceed();//植入目标方法
         System.out.println("我是环绕增强中的后置增强!");
     }


}

@AfterThrowing

异常抛出增强,配合@Pointcut一起使用

@Aspect
@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}
     
    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint jp){
        System.out.println("我是方法"+jp.getSignature().getName()+"的前置增强!");      
    }

     //后置增强
     @AfterReturning(value = "pointcut()",returning = "obj")
     public void afterReturning(JoinPoint jp,Object obj){
         System.out.println("我是方法"+jp.getSignature().getName()+"的后置增强!"+",返回值为"+obj);
     }

     //环绕增强
     @Around("pointcut()")
     public void around(ProceedingJoinPoint jp) throws Throwable {
         System.out.println("我是环绕增强中的前置增强!");
         Object proceed = jp.proceed();//植入目标方法
         System.out.println("我是环绕增强中的后置增强!");
     }

     //异常抛出增强
     @AfterThrowing(value = "pointcut()",throwing = "e")
     public void error(JoinPoint jp,Exception e){
         System.out.println("我是异常抛出增强"+",异常为:"+e.getMessage());
     }


}

@After

最终增强(最后执行),配合@Pointcut一起使用

@Aspect
@Component
public class AfterThrowingAspect {

    //全路径execution(public String com.cnblogs.hellxz.test.Test.access(String,String))
    @Pointcut("execution(* com.cnblogs.hellxz.test.*.*(..))")
    public void pointcut() {}
     
    //前置增强
    @Before("pointcut()")
    public void before(JoinPoint jp){
        System.out.println("我是方法"+jp.getSignature().getName()+"的前置增强!");      
    }

     //后置增强
     @AfterReturning(value = "pointcut()",returning = "obj")
     public void afterReturning(JoinPoint jp,Object obj){
         System.out.println("我是方法"+jp.getSignature().getName()+"的后置增强!"+",返回值为"+obj);
     }

     //环绕增强
     @Around("pointcut()")
     public void around(ProceedingJoinPoint jp) throws Throwable {
         System.out.println("我是环绕增强中的前置增强!");
         Object proceed = jp.proceed();//植入目标方法
         System.out.println("我是环绕增强中的后置增强!");
     }

     //异常抛出增强
     @AfterThrowing(value = "pointcut()",throwing = "e")
     public void error(JoinPoint jp,Exception e){
         System.out.println("我是异常抛出增强"+",异常为:"+e.getMessage());
     }

     //最终增强
     @After("pointcut()")
     public void after(JoinPoint jp){
         System.out.println("我是最终增强");
     }
}

@Cacheable(结合Redis搭建缓存机制)

*重点 单独一篇文章讲解

用来标记缓存查询。可用用于方法或者类中。(简介)

当标记在一个方法上时表示该方法是支持缓存的,
当标记在一个类上时则表示该类所有的方法都是支持缓存的。

 

@CacheEvict

*重点 单独一篇文章讲解

用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。@CacheEvict(value=”UserCache”)

 

 

@Required(注释检查)

适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。

通俗的讲:该注解放在setter方法上,表示当前的setter修饰的属性必须在Spring.xml中进行装配,否则报错BeanInitializationException异常,所以这是个检查注解。

public class Student {
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    @Required     //该注释放在的是set方法中,如果没有在xml配置文件中配置相关的属性,就会报错
    public void setAge(Integer age) {
        this.age = age;
    }
}



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context     
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config/>
    <!-- student bean的定义 -->
    <bean id = "student" class="com.how2java.w3cschool.required.Student">
        <property name = "name" value="派大星"/>
        <!-- 这里没有装配age属性,所以项目运行会报错 -->
    </bean>
    
</beans>


报错:“ Property 'age' is required for bean 'student' ”
;