@Aspect 标注类可以使用切面
-
@Pointcut:标注方法的执行点,不需要在方法体内编写实际代码。
-
@Around:由你来控制什么时候执行目标方法
-
@AfterReturning:在目标方法没有异常退出时执行
-
@Before:在目标方法之前执行
-
@AfterThrowing:在目标方法异常退出时候执行
-
@After: 目标方法不管是抛出异常或者正常退出都会执行
/**
* execution 匹配在方法执行时触发,例:execution(方法修饰符_可选 返回类型 方法名 参数 异常模式_可选)
* \@annotation() 匹配标注了指定注解的目标类方法,例:@Transactional
* args() 匹配使用了指定参数的方法,例:args(String) ,表示有且仅有一个String型参数的方法
* \@args() 匹配使用了指定参数的方法,如 @args(org.springframework.stereotype.Service) 表示有且仅有一个标注了@Service的类参数的方法
* within() 匹配类名指定切点,如 with(com.example.Demo) 表示Demo的所有方法
* \@within() 匹配标注了指定注解的类及其所有子类 如@within(org.springframework.stereotype.Service)
* \@target() 所有标注了指定注解的类 如@target(org.springframework.stereotype.Service)表示所有标注了@Service的类的所有方法
* target() 通过类名指定,同时包含所有子类 如 target(com.example.Demo)
* this() 大部分时候和target()相同,区别是this是在运行时生成代理类后,才判断代理类与指定的对象类型是否匹配
*/
@Pointcut("execution(* com.spring.annotation.aop.IBuy.buy(..))")
public void inPointCut(){
}
@ControllerAdvice
1.配合 @ModelAttribute 可以配置全局的模型属性,每次http的请求都会被调用一次。
2.配合 @ExceptionHandler 可以做全局的Controllder异常处理。若@ExceptionHandler单独使用,只对当前的类的Controller有影响。Github有Demo。
@value里#和$的区别?
属性取值表达式“$”开头,用来获取配置文件中的值,格式:${expression}。不可以嵌套SpEL表达式,不过SpEL表达式可以嵌套属性取值表达式
SpEL表达式以“#”开头,表达式主体包围在花括号中,格式:#{expression},详细见下面的例子.
Spel
//算数运算
@Value("#{19 + 1}") // 20
private double add;
//逻辑运算
@Value("#{250 > 200 && 200 < 4000}") // true
private boolean and;
//正则表达式
@Value("#{'100' matches '\\d+' }") // true
private boolean validNumericStringResult;
@Autowired和@Resource之间的区别?
@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。常用语第三方jar包的类引入。
当多个事务同时存在的时候,spring如何处理这些事务的行为?
-
PROPAGATION_REQUIRED:(默认)能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行。
-
PROPAGATION_REQUIRES_NEW:该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可。
-
PROPAGATION_SUPPORTS:如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务
-
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
PROPAGATION_MANDATORY:如果外层存在事务,就加入该事务,如果外层不存在事务,就抛出异常。
-
PROPAGATION_NEVER:以非事务方式执行,如果外层存在事务,则抛出异常。
-
PROPAGATION_NESTED:一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.
//可以加在类上,方法级别的注解会覆盖类的注解
@Transactional(propagation= Propagation.SUPPORTS,readOnly=true)