热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

SpringAOP面向切面编程实现及配置详解

这篇文章主要介绍了SpringAOP面向切面编程实现及配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

动态代理

特点

字节码随用随创建,随用随加载

作用

不用修改源码对方法增强

分类

基于接口的动态代理

基于子类的动态代理

创建

使用Proxy类中的newProxyInstance方法

要求

被代理类最少实现一个接口,没有则不能使用

newProxyInstance方法参数

classLoader:类加载器

用于加载代理对象字节码的,和被代理对象使用相同的类加载器

class[ ]:字节码数组

用于让代理对象和被代理对象有相同方法,固定写法。

InvocationHandler:用于提供增强的代码

是让我们写如何代理。一般都是写一个该接口的实现类,通常情况下都是匿名内部类,不是必须的

此接口的实现类都是谁用谁写

IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
	producer.getClass().getInterfaces(),
	new InvocationHandler(){
	 作用:执行被代理对象的任何接口方法都会经过该方法
	 * proxy 代理对象的引用
	 * method 当前执行的方法
	 * args 执行当前方法所需的参数
	 * return 和被代理对象有相同的返回值
		@override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
			// 提供增强的代码
			Object returnValue = null
			1. 获取方法执行的参数
			Float mOney= (Float)args[0]
			2. 判断当前方法是否为指定方法
			if("saleProduct".equals(method.getName())){
				returnValue = method.invoke(producer,money*0.8)
			}
			return returnValue;
		}
	}
)
//代理方法调用的是上面invoke中的方法
proxyProducer.saleProduct(100000)

注意 如果代理的类没有接口,则代理不可用。

AOPxml配置

连接点Joinpoint:指那些被拦截的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。

切入点Pointcut:所谓切入点指的是要对哪些Joinpoint进行拦截的定义。方法会被增强。

所有的切入点都是连接点,但不是所有的连接点都是切入点。

通知Advice:指拦截到Joinpoint之后所要做的事情

在invoke方法里的,有前置通知,后置通知,异常通知,最终通知

引入Introduction

目标对象Target :即被代理的对象

织入Weaving:把增强应用到目标对象来创建新的代理对象的过程。Spring采用动态代理织入。

创建接口类,实现类

创建aop通知功能函数

xml配置



    
    

    

    
    

    
    
      
      
        
        
      
    
    
    // 通知类型
          
        

        
        
        
        
      
  

      
      

AOPxml注解

aop注解配置

/**
 * 记录日志的工具类,提供了公共的代码
 */
@Component("logger")
@Aspect // 表示当前类是一个切面
public class Logger {

		@Pointcut("execution()")
		private void pt1(){}
  /**
   * 用于打印日志:计划在其切入点方法执行前执行(切入点方法就是业务层方法)
   */
  @Before(pt1())
  public void beforePrintLog() {
    System.out.println("前置");
  }

  public void afterPrintLog() {
    System.out.println("后置");
  }

  public void afterThrowingPringLog() {
    System.out.println("异常");
  }

  public void finalPrintLog() {
    System.out.println("最终");
  }

  // 环绕通知为我们提供了ProceedingJoinPoint,有一个方法proceed(),此方法就明确了调用切入点方法
  // 为我们提供了一种可以在代码中手动控制增强方法合适执行的方式
  public Object aroundPrintLog(ProceedingJoinPoint pjp) {
    Object returnValue = null;
    try {
      Object[] args = pjp.getArgs(); // 得到方法执行所需参数

      System.out.println("前置");

      returnValue = pjp.proceed(args); // 明确调用业务层的方法

      System.out.println("后置");

    } catch (Throwable throwable) {
//      throwable.printStackTrace();
      System.out.println("异常");
    } finally {
      System.out.println("最终");
    }
    return returnValue;

//    System.out.println("环绕通知");
  }
}

xml:

配置spring创建容器要扫描的包



注意 如果用注解自带的调用顺序会出现问题,用环绕通知顺序正常

事务控制

导包



  org.springframework
  spring-tx
  5.2.4.RELEASE

事务管理器:org.springframework.orm.hibernate5.hibernate5.HibernateTransactionManager

在bean.xml中配置

1. 配置事物管理器




	

2.配置事物的通知


5.配置事物的属性

	
		
		
		
		isolation:指定事物的隔离级别,默认值是default,表示使用数据库的默认隔离级别
		propagation:用于指定事物的传播行为,默认是REQUIRED,表示一定会有事物,增删改的选择,查询可以使用support
		read-only:用于指定事物是否只读,查询才设置为true
		timeout:用于指定事物的超市时间,默认值是-1,表示不超时,如果指定了数值,以秒为单位
		rollback-for:用于指定一个异常,当产生该异常时事物回滚,产生其他异常时,事物不回滚。没有默认值,表示任何异常都回滚
		no-rollback-for:用于指定一个异常,当产生该异常,事务不会回滚,产生其他异常,事务回滚。没有默认值,表示任何异常都回滚。
		
	

3.配置aop切入点表达式



4. 建立切入点表达式喝事物通知的对应关系



基于注解的事务控制

1. 配置事物管理器

3. 配置spring创建容器时要扫描的包

4. 开启spring对注解事物的支持

6. 在需要事物支持的地方使用注解@Transactional

2.在实现类中

@Service(accountService)
@Transactional
public class 实现类 implements 接口类{
	@Autowired
	// 在持久层也要配置
	private IaccountDao accountDao
}

基于注解的配置类

1.创建一个配置总配置类

@Configuration
// 用于配置需要扫描的包
@ComponentScan("hjj.web")
@Import({HibernateConfig.class, TransactionConfig.class})
@PropertySource("hibernateConfig.properties")
@EnableTransactionManagement //开启注解的支持
public class SpringConfiguration{
	
}

2.另一个java类,连接数据库相关的类

publci class HibernateConfig{

	@Value("${hibernate.username}")
	private String username;
	@Value("${hibernate.password}")
	private String password

	// 注入进容器
	@Bean(name="HibernateTemplate")
	public Hibernate crateHibernateTemplate(DataSource datasource){
		return new HibernateTemplate(dataSource)
	}
	
	@Bean(name="dataSource")
	public DataSource crateDataSource(){
		配置数据库的用户名密码 创建数据源对象
	}
}

3. 新建一个properties,配置文件类

hibernate.username =
hibernate.password =

4. 创建和事物相关的配置类

public class TransactionConfig {
	//创建事务管理器对象
	@Bean(name="transactionManager")
	public PlatformTransactionManager createTransactionManager(DataSource dataSource){
		return new DataSourceTransactionManager(dataSource)
	}
}

5. main方法所在的类

@ContextConfiguration(classes=SpringConfiguration.class)
public class test{
	psvm{
		业务逻辑
	}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
author-avatar
鉴湖侠ph
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有