Aop练习,注解练习

没有注解的

public class MyAspect {
    public  void qx(){
        System.out.println("前置通知");
    }
    public  void log(){
        System.out.println("后置通知");
    }
    public  void yic(){
        System.out.println("异常");
    }
    public  void zz(){
        System.out.println("最终通知");
    }
    public  Object hr(ProceedingJoinPoint joinPoint)throws Throwable{
    String className=joinPoint.getSignature().getName();
        System.out.println(className+"方法环绕前通知");
        Object proceed=joinPoint.proceed();
        System.out.println(className+"方法环绕后");
        return  proceed;
    }
public class UserDaoIml {
    public void add(){
        System.out.println("添加");
    }
    public void del(){
        System.out.println("删除");
    }
    public void upp(){
        System.out.println("修改");
    }
    public void find(){
        System.out.println("查询");
    }
    public void yic(){
        //System.out.println(1/0);
    }

配置文件

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

    <!-- 开启注解-->
    <aop:aspectj-autoproxy/>
    <!--目标类-->
    <bean id="StudentDao" class="com.lgq.dao.UserDaoIml"></bean>
    <!--注入增强类-->
    <bean id="MyAspect" class="com.lgq.common.MyAspect"></bean>

    <!--配置AOP面向切面编程,得到代理对象-->
    <aop:config><!--aop切面的根对象-->
        <!--
            切入点表达式
            [访问修饰符(可省略不写)] [返回值]   [包名]方法名 ,参数个数
             * cn.zz.dao.imp.UserDaoImp.save()  * 代表任意返回值
             全统配写法
             * *..*.*(..)   任意返回值, 当前包及其子包下的所有类,及类中所有方法 ,方法中所有参数
        -->
        <!--配置切入点-->
        <aop:pointcut id="pc1" expression="execution(* *..*.add(..))"/><!--任意位置下的add方法,任意返回类型的-->
        <aop:pointcut id="pc2" expression="execution(* *..*.delete(..))"/>
        <aop:pointcut id="pc3" expression="execution(* *..*.update(..))"/>
        <aop:pointcut id="pc4" expression="execution(* *..*.find(..))"/>
        <aop:pointcut id="pc5" expression="execution(* *..*.yic(..))"/>
        <!--配置切面类(切入点和通知的组合叫做切面类)-->
        <aop:aspect ref="MyAspect">
            <!--配置前置通知 -->
            <aop:before method="qx" pointcut-ref="pc1"/>
            <!--后置通知-->
            <aop:after-returning method="log" pointcut-ref="pc3"/>
            <!--最终通知-->
            <aop:after method="zz" pointcut-ref="pc4"/>
            <!--异常通知-->
            <aop:after-throwing method="yic" pointcut-ref="pc5"/>
            <!--环绕-->
            <aop:around method="hr" pointcut-ref="pc1"/>
        </aop:aspect>
    </aop:config>
    <!--配置读取jdbc-->
    <context:property-placeholder location="db.properties"/>
    <!--c3p0设置配置信息-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--将jdbc模板交给容器管理-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--读取c3p0数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>




















测试

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:applicationContext1.xml")
public class UserTest {
    @Resource
    UserDaoIml userDaoIml;
    @Test
    public void test01(){
    userDaoIml.add();
    userDaoIml.del();
    userDaoIml.upp();
    userDaoIml.find();
    userDaoIml.yic();
    }

结果

注解的

@Component
@Aspect
public class MyAspect2 {
    @Pointcut("execution(* *..*.add(..))")
    public void add1(){
    }
    @Pointcut("execution(* *..*.del(..))")
    public void del1(){

    }
    @Pointcut("execution(* *..*.upd(..))")
    public void upd1(){

    }
    @Pointcut("execution(* *..*.find(..))")
    public void find1(){

    }
    @Pointcut("execution(* *..*.ex(..))")
    public void ex1(){
    }
  @Before("add1()")
  public void  log(){
      System.out.println("前置通知");
  }
  @AfterReturning("upd1()")
    public void  hz(){
        System.out.println("后置通知");
    }
  @After("find1()")
  public void  zz(){
      System.out.println("最终");
  }
@AfterThrowing("ex1()")
public void  yc(){
    System.out.println("异常通知");
}
@Around("del1()")
public Object  hr(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    System.out.println("环绕前通知");
    Object proceed=null;
    proceed=proceedingJoinPoint.proceed();
    System.out.println("环绕后通知");
    return proceed;
}

}

 接口

public interface StudentDao {
        void add();//连接点
        void upd();//连接点 (增强功能)→ 切入点
        void del();//连接点
        void find();//连接点
        void ex();//连接点
}

-------------

@Repository
public class StudentDaoIml implements StudentDao{

    @Override
    public void add() {
        System.out.println("添加");
    }
    @Override
    public void upd() {
        System.out.println("修改");
    }
    @Override
    public void del() {
        System.out.println("删除");
    }
    @Override
    public void find() {
        System.out.println("查询");
    }
    @Override
    public void ex() {
        System.out.println(1/0);
    }


}

配置文件和上面的一样,只不过不需要这一部分了

<!--    &lt;!&ndash;配置AOP面向切面编程,得到代理对象&ndash;&gt;-->
<!--    <aop:config>&lt;!&ndash;aop切面的根对象&ndash;&gt;-->
<!--        &lt;!&ndash;-->
<!--            切入点表达式-->
<!--            [访问修饰符(可省略不写)] [返回值]   [包名]方法名 ,参数个数-->
<!--             * cn.zz.dao.imp.UserDaoImp.save()  * 代表任意返回值-->
<!--             全统配写法-->
<!--             * *..*.*(..)   任意返回值, 当前包及其子包下的所有类,及类中所有方法 ,方法中所有参数-->
<!--        &ndash;&gt;-->
<!--        &lt;!&ndash;配置切入点&ndash;&gt;-->
<!--        <aop:pointcut id="pc1" expression="execution(* *..*.add(..))"/>&lt;!&ndash;任意位置下的add方法,任意返回类型的&ndash;&gt;-->
<!--        <aop:pointcut id="pc2" expression="execution(* *..*.delete(..))"/>-->
<!--        <aop:pointcut id="pc3" expression="execution(* *..*.update(..))"/>-->
<!--        <aop:pointcut id="pc4" expression="execution(* *..*.find(..))"/>-->
<!--&lt;!&ndash;        <aop:pointcut id="pc5" expression="execution(* *..*.yic(..))"/>&ndash;&gt;-->
<!--        &lt;!&ndash;配置切面类(切入点和通知的组合叫做切面类)&ndash;&gt;-->
<!--        <aop:aspect ref="MyAspect2">-->
<!--            &lt;!&ndash;配置前置通知 &ndash;&gt;-->
<!--            <aop:before method="log" pointcut-ref="pc1"/>-->
<!--            &lt;!&ndash;后置通知&ndash;&gt;-->
<!--            <aop:after-returning method="hz" pointcut-ref="pc3"/>-->
<!--            &lt;!&ndash;最终通知&ndash;&gt;-->
<!--            <aop:after method="zz" pointcut-ref="pc4"/>-->
<!--            &lt;!&ndash;异常通知&ndash;&gt;-->
<!--            <aop:after-throwing method="yc" pointcut-ref="pc4"/>-->
<!--            &lt;!&ndash;环绕&ndash;&gt;-->
<!--            <aop:around method="hr" pointcut-ref="pc1"/>-->
<!--        </aop:aspect>-->
<!--    </aop:config>-->

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class StudentTest {
        @Autowired
        private StudentDao dao;
        @Test
        public void test2() {
            dao.add();
            dao.upd();
            dao.del();
            dao.find();
            dao.ex();
        }
    }

测试结果,这是加了异常后的,不加异常的话得把dao包里的继承接口的类里的(1/0)给注解掉.....

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bigboylll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值