使用注解进行简单开发遇到的坑--------------------Spring学习日志5

第一个异常:java.lang.ClassCastException
第二个异常:明明使用注解配置了@Aspect 并且getBean();也能用,为什么就是没有拦截?
第三个异常:类型找不到

一个一个说,先贴代码

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd

">

    <!--注意这里,假如,你的service实现了接口方法,那么我们就应该在后面使用这个proxy-target-class="true"-->
    <context:component-scan base-package="aoptest"></context:component-scan>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

</beans>

这是解决一个异常java.lang.ClassCastException.我们知道Spring实现动态代理的有良种方法,第一种是利用Java自身的Porxy类来实现代理,但是他智能实现有实现类的,没有接口的代理.第二种就是cglib字节码增强的方式.这种方式既可以使用只有实现类的,也可以使用实现了接口的类的代理.那么第一种异常出现的原因就是说.我们因为继承了接口实现的类,所以他会认为我们使用的是cglib的方式,所以会报这个异常.那么只要加上"proxy-target-class=“true”" ,就瞬间解决.

第二个问题,先贴代码

package aoptest.aspect;


import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AopAspect {

    @Before("execution(* aoptest.service.*.*(..))")
    public void before(){
        System.out.println("前置拦截,开始事务");
    }


    @After("execution(* aoptest.aops.*.*(..))")
    public void after(){
        System.out.println("后置拦截,提交事务");
    }

}

注意这个表达式execution(* aoptest.aops..(…))

第一个星配对的是所有类型 ,这个一般不变.后面才是重点.第二个值是你包在的,第三个星是你的类,第四个星是你的方法,后面(两个点)是参数,这个也不变.但是这个Aop的表达式很迷.我现在得出的结论就是,如果你能正常获得Bean,并且能调用其中的方法,但是就是无法被代理,那么就直接去查这个.我试过只要指向总包,后面跟点星点星括号两点,也能用,但是反倒直接指用不了,所以解决办法有三,第一个直接指向总包,第二个就放内包,第三个就少一个点星.这三种方法绝壁能解决,我今天就为这个试了一天,.决定明天研究下源码.

第三个就是找不到type
这个要检查三个方面 ,第一个就是看你的配置文件路径是否正确,第二个就是看你到底有没有开context和aop的约束.第三个就是直接去看你的注解,你肯定指向错误.

注解其实并不难,理解就行,多写写多练练就觉得也就那么回事

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值