首页 > 其他分享 >springAOP

springAOP

时间:2023-06-03 15:22:39浏览次数:43  
标签:dao bh org springAOP import com public

一,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

标签:dao,bh,org,springAOP,import,com,public
From: https://www.cnblogs.com/liangkuan/p/17454030.html

相关文章

  • 对SpringIOC和SpringAOP的理解
    SpringIOC和SpringAOP是Spring的两个核心组件。SpringIOC:SpringIOC是一个管理bean的容器,能够帮我们管理bean的整个生命周期,在没有SpringIOC的时候,我们需要自己手动的管理bean以及bean的依赖关系,这样会增加耦合,而有了SpringIOC,它能帮我们管理bean以及bean的依赖关系,使得代码解耦。......
  • SpringAOP精简版
    AOP简介概念:AOP是一种编程范式作用:做无入侵式增强程序功能Spring是如何实现AOP的?1.导坐标2.在Spring核心配置类上添加开启SpringAOP驱动注解3.定义通知类,@Component,@Aspect4.添加切入点,@PointCut5.制作通知,@Before等SpringAOP执行流程1.启动Spring容器2.读取切......
  • SpringAOP【Web后端开发进阶】
    AOP(思想):面向切面编程思想的实现:动态代理 动态代理的2种实现方式:1、基于接口的JDK动态代理2、基于子类的CGLIB动态代理 AOP思想的作用:1、在不改变原程序代码的前提下,对方法功能增强2、像添加插件一样,任意插拔。(程序更加灵活)......
  • SpringIOC和SpringAOP
    作为一个Spring使用者条件:拥有深入的Spring框架知识和开发经验,能够熟练地运用Spring框架来构建复杂的应用程序。了解Spring框架的核心概念和设计思想,如控制反转(IoC)、依赖注入(DI)、面向切面编程(AOP)等,并能灵活运用这些概念来解决实际问题。熟悉Spring框架中各个模块的功能和用法,如......
  • 14.SpringAOP 编程
    SpringAOP编程课程目标代理设计模式Spring的环境搭建SpringIOC与AOPSpring事物与传播行为一、代理模式1.1概述代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理访问目标对象。这样好处:可以在目标对象实现的基础上,增强额外的功能操作。(扩......
  • 开发日志02-解决`response`和SpringAop层相关冲突报错问题
    解决一个Bug在昨晚的开发中遇到了一个非常令人头疼的Bugjava.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse报错信息如下......
  • 浅谈SpringAOP功能源码执行逻辑
    如题,该篇博文主要是对Spring初始化后AOP部分代码执行流程的分析,仅仅只是粗略的讲解整个执行流程,喜欢细的小伙伴请结合其他资料进行学习。在看本文之前请一定要有动态代理的......
  • SpringAop是使用JDK代理还是使用CGLIB代理实现
    先说结论:在spring-aop的默认逻辑中,aop默认优先使用JDK代理,前提是目标对象是基于接口的实现类。源码如下:入口在AbstractAdvisingBeanPostProcessor.postProcessAfterInitia......
  • 【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合
    承接前文针对于上一篇【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」的功能开发指南之后,相信你对于Sl4fj以及Log4j整个生态体系的功......
  • springAop的实现方式
    AOP的三种实现方式AOP是Spring中继IOC(面向切面编程)后又一十分重要的概念。AOP,即面向切面编程。使用AOP可以实现在不改变原有的业务逻辑的代码的情况下,在系统上增加一些特殊......