springAOP

发布时间 2023-06-03 15:19:57作者: liangkuan

一,AOP
1,面向切面编程 Aspect Oriented Programming
2,编程思想的发展路程
① Logic java: java 逻辑编程
② OOP : 面向对象编程
③ OIP : interface 面向接口编程
④ 面向配置文件编程
以上的思想, 都是逐步升级的概念
⑤ AOP 在OOP的基础上,增强了OOP的功能
3, 实现方式
① 基于配置(xml)
② 基于注解
4、代码案例
(1)配置版

创建第一个类
package com.bh.dao;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.springframework.stereotype.Repository;


public class EmpDAO {
  public int save(){
      System.out.println("保存了一条 emp 数据");
      return 1;
  }
}

创建第二个类
package com.bh.dao;

import org.springframework.stereotype.Repository;

public class DeptDAO {
    public int save(){
        System.out.println("保存了一条 dept 数据");

        return 1;
    }
    public int remove(){
        System.out.println("删除了 dept 的数据");
        return 1;
    }
}

创建增强类
package com.bh.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

import java.util.Date;

public class LogAdvice {
    public int around(JoinPoint joinPoint) throws Throwable{
        System.out.println("start=========" + new Date());

       Integer signature = joinPoint.getSignature().getModifiers();

        System.out.println("end=========" + new Date());
        return signature;
    }
}

配置applicationContext.xml文件
<?xml version="1.0" encoding="utf-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		">
	<bean id="dept" class="com.bh.dao.DeptDAO"></bean>
	<bean id="emp" class="com.bh.dao.EmpDAO"></bean>

	<bean id="logadvice" class="com.bh.aop.LogAdvice"></bean>

	<!--配置增强类-->
	<aop:config>
		<aop:aspect ref="logadvice">
			<!--<aop:around method="around" pointcut="execution(* com.bh.dao.*.*(..))"></aop:around>-->
			<!--execution(* com.bh.dao.*.*(..))为切入点表达式:表示要增强的方法-->
			<aop:before method="around" pointcut="execution(* com.bh.dao.*.*(..))"></aop:before><!--before为前置增强-->
		</aop:aspect>
	</aop:config>


</beans>
测试类
package com.bh.test;

import com.bh.dao.DeptDAO;
import com.bh.dao.EmpDAO;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        DeptDAO dept = (DeptDAO) ac.getBean("dept");
        //dept.save();
        //dept.remove();

        EmpDAO emp = (EmpDAO) ac.getBean("emp");
        emp.save();
    }
}

结果
start=========Sat Jun 03 15:01:30 CST 2023
end=========Sat Jun 03 15:01:30 CST 2023
保存了一条 emp 数据
**(2)注解版**
创建带注解的类
package com.bh.dao;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.springframework.stereotype.Repository;

@Repository
public class EmpDAO {
  public int save(){
      System.out.println("保存了一条 emp 数据");
      return 1;
  }
}

创建带注解的类
package com.bh.dao;

import org.springframework.stereotype.Repository;

@Repository
public class DeptDAO {
    public int save(){
        System.out.println("保存了一条 dept 数据");

        return 1;
    }
    public int remove(){
        System.out.println("删除了 dept 的数据");
        return 1;
    }
}

创建带注解的切面增强类
package com.bh.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.util.Date;
@Component
@Aspect//这个注解说明此类为切面类
public class LogAdvice1 {
    //前置通知
  /*  @Before("execution(* com.bh.dao.*.*(..))")
    public void before1(JoinPoint jp) {
        System.out.println("method start =========" + new Date());
    }*/
    @Around("execution(* com.bh.dao.*.*(..))")//@Around表示环绕增强(其他同理)、execution(* com.bh.dao.*.*(..))切入点表达式
    public int around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("start=========" + new Date());

        Integer proceed = (Integer) proceedingJoinPoint.proceed();

        System.out.println("end=========" + new Date());
        return proceed;
    }
}

配置applicationAutoContext.xml文件
<?xml version="1.0" encoding="utf-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		">
	<!--基于注解AOP:有效-->
	<aop:aspectj-autoproxy/>

	<!--开启spring扫描注解-->
	<context:annotation-config></context:annotation-config>
	<context:component-scan base-package="com.bh"></context:component-scan>



</beans>
测试类
package com.bh.test;

import com.bh.dao.DeptDAO;
import com.bh.dao.EmpDAO;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    public static void main(String[] args) {
        //读取配置文件
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationAutoContext.xml");
     //调用方法获得类实例
        DeptDAO bean = ac.getBean(DeptDAO.class);
        bean.save();
    }
}

结果
start=========Sat Jun 03 15:10:16 CST 2023
保存了一条 dept 数据
end=========Sat Jun 03 15:10:16 CST 2023