首页 > 其他分享 >Spring AOP demo

Spring AOP demo

时间:2023-04-16 12:57:11浏览次数:47  
标签:Spring return demo org aop springframework Pointcut AOP import

动态代理模式实现,

比如可以在Bean的生命周期创建阶段,根据Pointcut判断当前bean是否满足切入条件,如果满足,再根据织入器ProxyFactory织入到JoinPoint,再根据bean创建代理对象

名词

  • JoinPoint: 可以理解成系统中每一个可以应用aop的点,一般是指方法。spring中只支持方法,
  • Pointcut: 根据Pointcut的描述,可以定位到一批或者一个具体的JoinPoint
  • Advice:对JoinPoint要干的事情,before,afterreturning,afterthrowing,around
  • aspect: 整合了PointCut和Advice。

spring的advisor其实就是一个aspect,一个切面的两个关键点,Pointcut和Advice。

package aopdemo;

import org.springframework.aop.Advisor;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;

/**
 * @author wenxiangmin
 * @ClassName AppConfig.java
 * @Description TODO
 * @createTime 2023年04月15日 14:53:00
 */
@Configuration
@ComponentScan(value = {"aopdemo"})
public class AppConfig {

	/**
	 * 切入点
	 * @return
	 */
	@Bean
	public Pointcut nameMatchMethodPointcut() {
		NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
		pointcut.setMappedName("insert*"); //方法名匹配
		return pointcut;
	}

	@Bean
	public BeforeAdvice beforeAdvice() {
		return new TestBeforeMethodAdvice();
	}

	/**
	 * advisor,设置切入点和通知
	 * @return
	 */
	@Bean
	public Advisor defaultAdvosor() {
		DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();
		defaultPointcutAdvisor.setPointcut(nameMatchMethodPointcut());
		defaultPointcutAdvisor.setAdvice(beforeAdvice());
		return defaultPointcutAdvisor;

	}

	/**
	 * 前置通知
	 */
	class TestBeforeMethodAdvice implements MethodBeforeAdvice{
		@Override
		public void before(Method method, Object[] args, Object target) throws Throwable {
			System.out.println("before方法执行。methodName="+method.getName());
		}
	}

	/**
	 * 织入器
	 * 一个factoryBean,实际的对象类型是getObject方法返回的类型,也就是在getObject方法中生成的代理对象
	 * @return
	 */
	@Bean
	public ProxyFactoryBean taskService() {
		ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
		proxyFactoryBean.addAdvisor(defaultAdvosor());
		proxyFactoryBean.setInterceptorNames("insert*");
		proxyFactoryBean.setTargetName("taskServiceImpl");
		return proxyFactoryBean;
	}
}


		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
		TaskServiceImpl taskService = (TaskServiceImpl)ctx.getBean("taskService");
		taskService.insert();

//输出
before方法执行。methodName=insert
insert exec...

标签:Spring,return,demo,org,aop,springframework,Pointcut,AOP,import
From: https://www.cnblogs.com/wxmin2/p/17323106.html

相关文章

  • Spring事务学习
    spring将事务管理的逻辑和数据访问的逻辑分开管理,但是每一个数据访问dao都需要同一个Connection对象,这时,spring会在事务开始的时候将connection设置到一个ThreadLocal中,在dao中,就从这个ThreadLocal中拿到Connection。/***声明式事务demo*/publicvoidtranfer(){......
  • 【Spring Cloud】SpringBoot、Spring Cloud、Spring Cloud Alibaba版本对应
    官方通告SpringBoot1.5.x及以下版本官方不再提供维护了,建议开发者选择使用SpringBoot2.0.x以上的版本,相对应的SpringCloud版本也最好不要使用。简单的查看版本信息:https://start.spring.io/actuator/infoSpringCloud对应的SpringBoot版本访问SpringCloud官网:https://spring......
  • googleTest demo
    googletest的目录在的官方目录在https://github.com/google/googletest.git。作为用户,googleTest的库可以认为提供了两个东西:各种宏,如TEST,TEST_F,通过#include"gtest/gtest.h",即可使用。gtest_main的库libgtest_main.a,即提供了一个主函数,可以和一个测试套的“容器”。静态库......
  • dockerfile的使用,使用dockerfile部署springboot项目
    文章目录一、dockerfile概述1、dockerfile基础2、Docker执行Dockerfile的大致流程3、镜像、容器、dockerfile的关系二、dockerfile常用保留字1、FROM2、MAINTAINER与LABEL3、RUN4、EXPOSE5、WORKDIR6、USER7、ENV8、ADD9、COPY10、VOLUME11、CMD12、ENTRYPOINT三、使用dockerfile构......
  • 【Spring Cloud】第二代Spring Cloud核心组件
    第一代SpringCloud(主要是 SpringCloudNetflix)很多组件已经进入停更维护模式。第二代SpringCloud核心组件主要以SpringCloudAlibaba为主,SpringCloudAlibaba是由一些阿里巴巴的开源组件和云产品组成的,2018年,SpringCloudAlibaba正式入住了SpringCloud官方孵化器......
  • springcloud或springboot项目服务启动多个实例
    如果没有service,可以快捷键Alt+8,service标签没有信息,则.idea目录下的workspace.xml下替换或添加融化信息内容<componentname="RunDashboard"><optionname="configurationTypes"><set><optionvalue="SpringBootApplicationConfigurationType"/>&......
  • java: 程序包org.springframework.web.bind.annotation不存在(已解决)
    今天在创建了一个新的SpringBoot模块后,和往常一样将文件从别的模块中复制过来,然后运行鑫模块就报错了:java:程序包org.springframework.web.bind.annotation不存在,第一反应是将文件所在的包Rebuild一下,但是这次并没有起到作用。然后就想着清除一下缓存,进行步骤:File-->Invalidat......
  • spring boot bean注册 多实例
    @Configuration3.1.@Configuration作用@Configuration底层是含有@Component,所以@Configuration具有和@Component的作用。@Configuration用于定义配置类,可理解为Spring的xml配置文件里面的<beans>标签。@Configration标注的类不能是final类型@Configration标注类中可以声明一......
  • spring boot配置文件 yml
     在SpringBoot项目中我们有着默认的配置文件application.properties或者是是application.yml,可以进行封装出来的属性进行配置。有的时候我们需要根据不同的环境进行不同的配置。这里SpringBoot也提供了Spring.profiles.active来进行我们不同环境配置的选择,如application-{profi......
  • 文字滚动demo
    1、主要采用css的@keyframes关键帧和animation动画<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="......