简单方式配置aop

是否感慨过技术枯燥繁杂,不够直观没法快速掌握?面对厚厚的书籍你是否感到力不从心?

spring父子容器

web.xml 配置子容器spring mvc

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:config/springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

web.xml配置父容器

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/springmvc-mybatis.xml</param-value>
  </context-param>

注意点:父容器和子容器

父容器配置文件扫描除controller之外的注解,子容器扫描的是controller注解

aop配置在子容器的话父容器是感知不到的,调用controller目标类方法时aop是不会生效的。

解决方案:父容器子容器都配上,这样就会生成代理类了


image.png

很显然我配置的是cglib代理,默认为jdk代理。

<!-- 启用aspectj 注解 ,默认是jkd接口代理,我们使用cglib基于实现类代理,否则注解必须放在接口了--> 
    <!-- 应用场景一:使用多数据源注解时 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

注意点:配置对aop:aspectj注解,注意jdk是基于接口代理,proxy-target-class=false默认,cglib基于实现类代理proxy-target-class=true

注意点:配置对aop:aspectj注解,注意jdk是基于接口代理,proxy-target-class=false默认,cglib基于实现类代理proxy-target-class=true


1
2
3
4
5
6
7
8
9
10
11
12
13
14
@DataSource("dataSourceTwo")
@Transactional
public String testCall() throws InterruptedException {
System.out.println("===={call pkg.p()}===");
mapper.testCall();
System.out.println("===={call pkg.p()}调用完毕,开始等待10秒再次调用===");
Thread.sleep(20000);
System.out.println("===={call pkg.p()}10秒后调用完毕===");
mapper.testCall();
return null;
}
public void testCalla() throws InterruptedException {
this.testCall();
}


1
2
3
4
5
6
7
8
@Order(1)
@Aspect
@Repository
public class DataSourceAspect {
    //@Pointcut("execution(* com.bank.pingan.service.impl.common.*.*(..))")
@Pointcut("@annotation(com.bank.pingan.comm.annotation.DataSource)")
private void anyMethod() {  
    }

注意点:配置的aop切入点为自定注解。

问题:如果调用testCalla()方法aop会生效嘛?


重新看看this.testCalla this是什么:


image.png

为什么不是代理对象?

因为你切入点并非是testCalla 而是testCall 


©声明:本站原创文章采用 BY-NC-SA 共享协议,受法律保护,转载请注明出处;转载文章版权归原作者所有。
©转载请注明来源:

未经允许不得转载:最优质网--最有指望 » 简单方式配置aop

赞 (0) 打赏

评论 0

评论前必须登录!

登陆 注册

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏