用户登录
用户注册

分享至

Spring-AOP xml方式配置

  • 作者: 燕20115230
  • 来源: 51数据库
  • 2021-10-19

1.新建Maven项目

2. pom.xml 引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.0.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

主要用到了

spring框架、aspectj(这个就是aop啦,说是比spring里面的aop还好用)、spring-test(一会测试spring要用到),junit

3. 新建 目标对象,这边我还是创建了接口类

package com.itheima;

public interface ITarget {
    void save();
}
package com.itheima.impl;

import com.itheima.ITarget;

public class Target implements ITarget {
    public void save() {
        System.out.println("saveing...");
    }
}

4. 创建 applicationContext.xml

 <bean id="target" class="com.itheima.impl.Target"></bean>

5. 创建测试类

package com.itheima.test;

import com.itheima.ITarget;
import com.itheima.impl.Target;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext.xml")
public class AopTest {
    @Autowired
    private ITarget target;

    @Test
    public void test1(){
        target.save();
    }
}

测试通过

6. 创建增强类

package com.itheima.impl;

import org.aspectj.lang.ProceedingJoinPoint;

/*
增强
 */
public class MyAspect {
    public void before(){
        System.out.println("前置增强...");
    }

    public void afterReturnRuning(){
        System.out.println("后置增强...");
    }

    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前。。。");
        System.out.println(pjp.toString());
        Object proceed = pjp.proceed();
        System.out.println("环绕后。。。");
        return proceed;
    }

    public void afterThrowing(){
        System.out.println("异常增强。。。");
    }
}

7. 在 applicationContext.xml 中配置aop

<aop:config>
        <aop:aspect ref="myaspect">
<!--            <aop:pointcut id="myPointcut" expression="execution(public void com.itheima.impl.Target.save())"/>-->
<!--            <aop:pointcut id="myPointcut1" expression="execution(* *..*(..))"/>-->
            <aop:pointcut id="myPointcut" expression="execution(public void *..*(..))"/>
<!--            <aop:before method="before" pointcut-ref="myPointcut" />-->
<!--            <aop:after-returning method="afterReturnRuning" pointcut-ref="myPointcut1"></aop:after-returning>-->
            <aop:around method="around" pointcut-ref="myPointcut"></aop:around>
            <aop:after-throwing method="afterThrowing" pointcut-ref="myPointcut"></aop:after-throwing>
        </aop:aspect>
    </aop:config>

初始可先这么设置

<aop:before method="before" pointcut="execution(public void com.itheima.impl.Target.save())"></aop:before>

分拆为 访问修饰符(可省略) 返回类型 包名.类名.方法名(参数)

任意参数可用 ..? 表示 两个点

返回类型,包名,类名,方法名可用 * 表示任意

*..* 可表示包名下的任意子包名

运行测试类,如果用通配符,发现会多执行一次,打印一下

多执行了这个??execution(void org.springframework.beans.factory.SmartInitializingSingleton.afterSingletonsInstantiated())

时间有限,先到这里。

软件
前端设计
程序设计
Java相关