【Spring学习笔记】8.第一个AOP程序

Spring AOP

  • Spring AOP - Aspect Oriented Programming 面向切面编程
  • AOP的做法是将通用、与业务无关的功能抽象封装为切面类
  • 切面可配置在目标方法的执行前、后运行,真正做到即插即用

PS:在不修改源码的情况下对程序行为进行扩展

第一个AOP程序

maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
<!-- aspectweaver是Spring AOP的底层依赖 -->
<dependency>
    <groupId>ort.aspectj</groupId>
    <artifactId>aspectweaver</artifactId>
    <version>1.9.5</version>
</dependency>

在resource目录下新建applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/sop/spring-aop.xsd">
    <!-- 在全局里新建bean对象 userDao -->
    <bean id="userDao" class="com.imooc.spring.aop.dao.UserDao"/>
    <!-- 在全局里新建bean对象employeeDao -->
    <bean id="employeeDao" class="com.imooc.spring.aop.dao.EmployeeDao"/>
    <!-- 在全局里新建bean对象 userService  并持有userDao的句柄 -->
    <bean id="userService" class="com.imooc.spring.aop.service.UserService">
        <property name="userDao" ref="userDao" />
    </bean>
    <!-- 在拳距离新建bean对象 employService 并持有employeeDao的句柄 -->
    <bean id="employeeService" class="com.imooc.spring.aop.service.EmployeeService">
        <property name="employeeDao" ref="employeeDao" />
    </bean>
</beans>

新建入口类

public class SpringApplication{
    public static void main(String[] args){
        ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserService userService = context.getBean("userService",UserService.class);
        userService.createUser();  
    }
}

新建切面类

public class MethodAspect{
    //切面方法, 用于扩展额外功能
    //JoinPoint 连接点, 通过连接点可以获取目标类/方法的信息
    public void printExecutionTime(JoinPoint joinPoint){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        String now=sdf.format(new Date());
        String className =joinPoint.getTarget().getClass().getName();//获取目标类的名称
        String methodName=joinPoint.getSignature().getName();//获取目标方法名称
    }
}

在applicationContext中进行切面的配置

<!-- AOP配置 -->
<bean id="methodAspect" class="com.imooc.spring.aop.aspect.MethodAspect"></bean>
<aop:config>
    <!-- PointCut 切点, 使用execution表达式描述切面的作用范围 -->
    <!-- execution(public * com.imooc..*.*(..)) 说明切面作用在com.imooc包下的所有类的所有方法上 -->
    <aop:pointcut id="pointcut" expression="execution(public * com.imooc..*.*(..))"></aop:pointcut>
    
    <!-- 切面配置 -->
    <aop:aspect ref="methodAspect">
        <!-- before通知, 代表在目标方法运行前先执行methodAspect.printExecutionTime() -->
        <aop:before method="printExecutionTime" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值