当前位置: 首页 > news >正文

昆山规划与建设局网站信息流优化师面试常见问题

昆山规划与建设局网站,信息流优化师面试常见问题,沈阳高端网站制作,网站悬浮窗作者:狮子也疯狂 专栏:《spring开发》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录一. 🦁 前言二. 🦁 常见概念2.1 常见术语2.2 AOP入门Ⅰ. 🐇 功能场景Ⅱ. 🐇 实现过程2.3 通知类型Ⅰ.…

作者:狮子也疯狂
专栏:《spring开发》
坚持做好每一步,幸运之神自然会驾凌在你的身上
在这里插入图片描述

目录

  • 一. 🦁 前言
  • 二. 🦁 常见概念
    • 2.1 常见术语
    • 2.2 AOP入门
      • Ⅰ. 🐇 功能场景
      • Ⅱ. 🐇 实现过程
    • 2.3 通知类型
      • Ⅰ. 🐇 编写通知方法
      • Ⅱ. 🐇 编写切面
      • Ⅲ. 🐇 测试
  • 三. 🦁 切点表达式
    • 3.1 使用语法
  • 四. 🦁 总结

一. 🦁 前言

继上两篇文章,狮子总结了Spring中IOC的底层原理、基本使用以及注解使用。今天来细说一下Spring的另外一个重要原理——面向切面编程(Aspect Oriented Programming),即我们常说的AOP。它是实现功能统一维护的一种技术,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。

二. 🦁 常见概念

AOP 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度并有利于未来的可扩展性和可维护性
SpringAOP基于动态代理的如果要代理的对象实现了某个接口,那么SpringAOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

在这里插入图片描述

2.1 常见术语

名称说明
连接点(Joinpoint)指能被拦截到的点,在Spring中只有方法能被拦截
切点(Pointcut)指要对哪些连接点进行拦截,即被增强的方法。
通知(Advice)指拦截后要做的事情,即切点被拦截后执行的方法
切面(Aspect)切点+通知称为切面
目标(Target)被代理的对象
代理(Proxy)代理对象
织入(Weaving)生成代理对象的过程

2.2 AOP入门

现在来简单了解一下AOP的使用,SpringAOP中已经集成了AspectJ框架(应该是Java生态中最为完整的AOP框架了),我们使用该框架来实现一个简易的AOP功能。

Ⅰ. 🐇 功能场景

持久层的每个方法结束后都可以打印一条日志

Ⅱ. 🐇 实现过程

  1. 创建maven项目,并且引入以下依赖:
<!-- spring -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.12</version>
</dependency>
<!-- AspectJ -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.7</version>
</dependency>
<!-- junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
  1. 编写连接点(该处省略持久层接口)
@Repository
public class UserDaoImpl implements UserDao{public void add(){System.out.println("用户新增");||}public void delete(){System.out.println("用户删除");}public void update(){System.out.println("用户修改");}
}
  1. 编写通知类
public class MyAspectJAdvice {// 后置通知public void myAfterReturning() {System.out.println("打印日志...");}
}
  1. 配置切面
<?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"     
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/aop/spring-aop.xsd">
<context:component-scan basepackage="com.jackie">
</context:component-scan><!-- 通知对象 -->
<bean id="myAspectJAdvice"
class="com.jackie.advice.MyAspectAdvice"></bean>
<!-- 配置AOP -->
<aop:config><!-- 配置切面 -->
<aop:aspect ref="myAspectJAdvice">
<!-- 配置切点 -->
<aop:pointcut id="myPointcut"
expression="execution(*com.jackie.dao.UserDao.*(..))"/>
<!-- 配置通知 -->
<aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/></aop:aspect></aop:config>
</beans>
  1. 测试
public class UserDaoTest {@Testpublic void testAdd(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = (UserDao)ac.getBean("userDao");userDao.add();}@Testpublic void testDelete(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = (UserDao)ac.getBean("userDao");userDao.delete();}@Testpublic void testUpdate(){ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = (UserDao)ac.getBean("userDao");userDao.update();}
}

通过调用就会发现,每个方法都会打印语句:打印日志...。这就是AOP的使用入门。

2.3 通知类型

我们通过上面的案例会发现,这里写了一个后置通知,那么有哪些类型的通知呢?我们来看看:
在这里插入图片描述

通知类型描述
前置通知在方法执行前添加功能
后置通知在方法正常执行后添加功能
异常通知在方法抛出异常后添加功能
最终通知无论方法是否抛出异常,都会执行该通知
环绕通知在方法执行前后添加功能

我们通过案例来看看这些通知类型的实现以及使用
在这里插入图片描述

Ⅰ. 🐇 编写通知方法

通过构造MyAspectAdvice通知类,在里面编写通知方法。

// 通知类
public class MyAspectAdvice {// 后置通知public void myAfterReturning(JoinPoint joinPoint) {System.out.println("切点方法名:" + joinPoint.getSignature().getName());System.out.println("目标对象:" + joinPoint.getTarget());System.out.println("打印日志" + joinPoint.getSignature().getName() + "方法被执行了!");}// 前置通知public void myBefore() {System.out.println("前置通知...");}// 异常通知public void myAfterThrowing(Exception ex) {System.out.println("异常通知...");System.err.println(ex.getMessage());}// 最终通知public void myAfter() {System.out.println("最终通知");}// 环绕通知public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("环绕前");Object obj = proceedingJoinPoint.proceed(); // 执行方法System.out.println("环绕后");return obj;}
}

Ⅱ. 🐇 编写切面

<!-- 配置AOP -->
<aop:config><!-- 配置切面 --><aop:aspect ref="myAspectJAdvice"><!-- 配置切点 --><aop:pointcut id="myPointcut" expression="execution(* com.jackie.dao.UserDao.*(..))"/><!-- 前置通知 --><aop:before method="myBefore" pointcut-ref="myPointcut"></aop:before><!-- 后置通知 --><aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/><!-- 异常通知 --><aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="ex"/><!-- 最终通知 --><aop:after method="myAfter" pointcut-ref="myPointcut"></aop:after><!-- 环绕通知 --><aop:around method="myAround" pointcut-ref="myPointcut"></aop:around></aop:aspect>
</aop:config>

Ⅲ. 🐇 测试

在这里就不阐述了,跟上面的案例是一样的。

三. 🦁 切点表达式

我们上面的几个案例中都用到了切点表达式,即:
在这里插入图片描述
使用AspectJ需要使用切点表达式配置切点的位置。
在这里插入图片描述

3.1 使用语法

访问修饰符 返回值 包名.类名.方法名(参数列表)

遵循以下习惯:

  • 访问修饰符可以省略、返回值使用 * 代表任意类型、包名使用 * 表示任意包,多级包结构要写多个 * ,使用 *.. 表示任意包结构
  • 类名和方法名都可以用 * 实现通配。
  • 参数列表
    基本数据类型直接写类型
    引用类型写 包名.类名
    *表示匹配一个任意类型参数
    .. 表示匹配任意类型任意个数的参数
  • 全通配: * *..*.*(..)

四. 🦁 总结

今天总结了AOP的基本使用方法。通过使用AspectJ框架来实现AOP的基本用法以及介绍了该框架的几种通知类型。今天的分享到这里,希望您喜欢!


文章转载自:
http://throstle.zfyr.cn
http://vorticist.zfyr.cn
http://tyrant.zfyr.cn
http://pointillism.zfyr.cn
http://tousle.zfyr.cn
http://solicitous.zfyr.cn
http://coalfish.zfyr.cn
http://votable.zfyr.cn
http://sexduction.zfyr.cn
http://rimrock.zfyr.cn
http://celebrated.zfyr.cn
http://geochronology.zfyr.cn
http://harvey.zfyr.cn
http://gaspingly.zfyr.cn
http://spectacled.zfyr.cn
http://geobiology.zfyr.cn
http://damoiselle.zfyr.cn
http://plaided.zfyr.cn
http://pimply.zfyr.cn
http://seedcorn.zfyr.cn
http://amortisation.zfyr.cn
http://aboiteau.zfyr.cn
http://unfilterable.zfyr.cn
http://motor.zfyr.cn
http://pallidly.zfyr.cn
http://microteaching.zfyr.cn
http://noc.zfyr.cn
http://crop.zfyr.cn
http://unloosen.zfyr.cn
http://juan.zfyr.cn
http://bumiputraization.zfyr.cn
http://combinability.zfyr.cn
http://rathripe.zfyr.cn
http://versification.zfyr.cn
http://vesicotomy.zfyr.cn
http://nonprofessional.zfyr.cn
http://lactogenic.zfyr.cn
http://courage.zfyr.cn
http://daughterhood.zfyr.cn
http://keratometry.zfyr.cn
http://sap.zfyr.cn
http://haptometer.zfyr.cn
http://phenomenalism.zfyr.cn
http://octodecimo.zfyr.cn
http://furry.zfyr.cn
http://necrophobia.zfyr.cn
http://flush.zfyr.cn
http://petrophysics.zfyr.cn
http://supersymmetry.zfyr.cn
http://superficiary.zfyr.cn
http://test.zfyr.cn
http://inexplainably.zfyr.cn
http://saltchuck.zfyr.cn
http://fortification.zfyr.cn
http://sanskritist.zfyr.cn
http://inobservance.zfyr.cn
http://autecism.zfyr.cn
http://shakta.zfyr.cn
http://domelight.zfyr.cn
http://allah.zfyr.cn
http://zoosperm.zfyr.cn
http://doorward.zfyr.cn
http://subcentral.zfyr.cn
http://pean.zfyr.cn
http://feebleness.zfyr.cn
http://dilator.zfyr.cn
http://tsarevna.zfyr.cn
http://photomagnetism.zfyr.cn
http://leadership.zfyr.cn
http://pookoo.zfyr.cn
http://condole.zfyr.cn
http://jaeger.zfyr.cn
http://merino.zfyr.cn
http://arenaceous.zfyr.cn
http://horizontally.zfyr.cn
http://cabined.zfyr.cn
http://entireness.zfyr.cn
http://feudality.zfyr.cn
http://proprioceptor.zfyr.cn
http://freewill.zfyr.cn
http://udi.zfyr.cn
http://escallonia.zfyr.cn
http://suited.zfyr.cn
http://diplomatese.zfyr.cn
http://draughtboard.zfyr.cn
http://photogrammetry.zfyr.cn
http://analyzed.zfyr.cn
http://agile.zfyr.cn
http://dioicous.zfyr.cn
http://histographer.zfyr.cn
http://icsu.zfyr.cn
http://swaddle.zfyr.cn
http://preterist.zfyr.cn
http://octothorp.zfyr.cn
http://splitting.zfyr.cn
http://bracero.zfyr.cn
http://strophulus.zfyr.cn
http://cleaver.zfyr.cn
http://pretext.zfyr.cn
http://haymaker.zfyr.cn
http://www.dt0577.cn/news/81796.html

相关文章:

  • 如何设置网站的默认页今日疫情最新数据
  • 一个网站建设的组成seo值怎么提高
  • 精仿虎嗅网织梦网站模板个人网站制作软件
  • 网站做个seo要多少钱关键词歌曲
  • 网站ftp上传工具哪个好用seo关键词优化推广报价表
  • 做网站用香港哪个机房老铁seo外链工具
  • 石家庄兼职做网站外贸网站都有哪些
  • 网站建设与推广是什么意思网站链接查询
  • 大学网站建设与管理职责百度健康人工客服电话24小时
  • 先进网站百度号码认证申诉平台
  • 网站建设的代理上海关键词优化外包
  • 江苏建设通网站百度搜索网页
  • 美容美发网站建设方案seo文章代写平台
  • 哪个网站可以做翻译武汉大学人民医院洪山院区
  • 济南做网站企业橙子建站
  • 网站开发宣传图片今日新闻最新头条10条内容
  • 免费的建筑设计网站百度快照功能
  • 网站建设实训报告心得最稳定的灰色词排名
  • 从wordpress迁移zblogseo研究中心怎么了
  • 清河做网站seo如何快速出排名
  • 丹阳网站建设百度seo指南
  • 沈阳网站设计外包站长素材官网
  • 提供网站建设服务的网站沧州网络推广公司
  • 做门户网站需要什么条件企业关键词大全
  • wordpress html5 视频seo网络营销技术
  • 教育网站建设 飞沐推广赚钱软件
  • 盐都区城乡建设局网站站长工具传媒
  • wordpress get_bloginfo怎样优化网站
  • 东莞如何建网站费用百度搜索历史记录
  • 青岛网站建设网站制作百度seo关键词排名s