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

外贸仿牌网站建设在线营销推广

外贸仿牌网站建设,在线营销推广,白云区网站建设公司,现在还用dw做网站设计么文章目录前言一、AOP的底层实现原理二、AOP的两种开发模式1.使用xml配置文件1.1 添加AOP依赖1.2 创建UserService1.3创建UserServiceImpl1.4创建通知类1.5 创建applicationContext.xml(添加aop约束)1.6 测试2.使用注解开发2.1 创建bean.xml文件配置注解方…

文章目录

  • 前言
  • 一、AOP的底层实现原理
  • 二、AOP的两种开发模式
    • 1.使用xml配置文件
      • 1.1 添加AOP依赖
      • 1.2 创建UserService
      • 1.3创建UserServiceImpl
      • 1.4创建通知类
      • 1.5 创建applicationContext.xml(添加aop约束)
      • 1.6 测试
    • 2.使用注解开发
      • 2.1 创建bean.xml文件配置注解方式
      • 2.2 在通知类上使用相关注解
      • 2.3 测试
  • 总结


前言

spring的核心是IOC(控制反转)和AOP(面向切面编程)。AOP面向切面编程是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


一、AOP的底层实现原理

此处再解释,详情请看我这篇文章
静态代理和动态代理https://blog.csdn.net/l_zl2021/article/details/127095878

二、AOP的两种开发模式

关于AOP的案例,看我这边篇文章,本文只是记录两种AOP开发方式
AOP初识https://blog.csdn.net/l_zl2021/article/details/127113425

1.使用xml配置文件

1.1 添加AOP依赖

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.9.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>compile</scope></dependency></dependencies>

1.2 创建UserService

package com.wmj.service;//目标对象target
public interface UserService {//未增强的方法叫做连接点JoinPoint//已增强的方法叫做切入点PointCutpublic void add();public void delete();
}

1.3创建UserServiceImpl

代码如下(示例):

package com.wmj.service.impl;import com.wmj.service.UserService;public class UserServiceImpl implements UserService {@Overridepublic void add() {System.out.println("添加用户..");//int i = 1/0;}@Overridepublic void delete() {System.out.println("删除用户..");}
}

1.4创建通知类

前置通知(before):目标方法运行之前调用
后置通知(after-returning):在目标方法运行之后调用 (如果出现异常不会调用)
环绕通知(around):在目标方法之前和之后都调用(ProceedingJoinPoint对象 -->> 调用proceed方法)
异常拦截通知(after-throwing):如果出现异常,就会调用
最终通知(after):在目标方法运行之后调用 (无论是否出现 异常都会调用)

package com.wmj.advice;import org.aspectj.lang.ProceedingJoinPoint;//通知类,增强的代码(方法)Advice
public class MyAdvice {public void before(){System.out.println("前置通知,目标对象调用方法前执行");}public void after(){System.out.println("后置通知(最终通知),目标对象调用方法后执行,无论是否发生异常都执行");}public void after_returning(){System.out.println("后置通知,目标对象调用方法后执行,发生异常不执行");}public void after_throwing(){System.out.println("异常通知,发生异常执行");}public void around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕通知,目标对象调用方法之前");joinPoint.proceed();System.out.println("环绕通知,目标对象调用方法之后");}}

1.5 创建applicationContext.xml(添加aop约束)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here --><bean id="userService" class="com.wmj.service.impl.UserServiceImpl"></bean><!-- 通知 --><bean id="myAdvice" class="com.wmj.advice.MyAdvice"></bean><!-- aop --><!-- 默认使用JDK动态代理 --><!-- proxy-target-class="true" 使用cglib --><aop:config proxy-target-class="true"><!-- 配置切入点 切入点表达式的写法:execution(表达式)public void com.abyg.service.UserServiceImpl.save() void com.wmj.service.UserServiceImpl.save()  其他修饰符无返回值的save空参方法* com.wmj.service.UserServiceImpl.save()  有或者无返回值的save空参方法* com.wmj.service.UserServiceImpl.*()  有或者无返回值的所有空参方法* com.wmj.service.*ServiceImpl.*(..)  有或者无返回值的所有有参或者空参方法* com.wmj.service..*ServiceImpl.*(..)  一般不用,service包下的子包和孙包以ServiceImpl结尾的类中的方法
--><!-- 切入点 -->
<!--                <aop:pointcut id="pc" expression="execution(public void com.wmj.service.impl.UserServiceImpl.add())"/>--><aop:pointcut id="pc" expression="execution(* com.wmj.service.impl.*ServiceImpl.*(..))"/><!-- 切面 --><aop:aspect ref="myAdvice"><!-- 配置前置通知对应的方法 --><aop:before method="before" pointcut-ref="pc"></aop:before><!-- 配置后置通知(最终通知)对应的方法 --><aop:after method="after" pointcut-ref="pc"></aop:after><!-- 配置后置通知对应的方法,发生异常不执行 --><aop:after-returning method="after_returning" pointcut-ref="pc"></aop:after-returning><!-- 配置异常通知对应的方法,发生异常执行 --><aop:after-throwing method="after_throwing" pointcut-ref="pc"></aop:after-throwing><!-- 配置环绕通知对应的方法 --><aop:around method="around" pointcut-ref="pc"></aop:around></aop:aspect></aop:config></beans>

1.6 测试

package com.wmj.test;import com.wmj.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringTest {@Testpublic void testUserService(){ClassPathXmlApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService)applicationContext.getBean("userService");userService.add();userService.delete();}}

2.使用注解开发

2.1 创建bean.xml文件配置注解方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here --><!-- 准备工作: 导入aop(约束)命名空间 --><!-- 1.配置目标对象 --><bean id="userService" class="com.wmj.service.impl.UserServiceImpl"></bean><!-- 2.配置通知对象 --><bean id="myAdvice" class="com.wmj.advice.MyAdvice"></bean><!-- 3.开启使用注解完成织入 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

2.2 在通知类上使用相关注解

@Aspect
//表示该类是一个通知类
//通知类,增强的代码(方法)Advice
public class MyAdvice {//自己设置一个切点,管理重复代码@Pointcut("execution(* com.wmj.service.impl.*ServiceImpl.*(..))")public void pc(){}//前置通知//指定该方法是前置通知,并制定切入点@Before("MyAdvice.pc()")public void before(){System.out.println("前置通知,目标对象调用方法前执行");}//最终通知@After("execution(* com.wmj.service.impl.*ServiceImpl.*(..))")public void after(){System.out.println("后置通知(最终通知),目标对象调用方法后执行,无论是否发生异常都执行");}//后置通知@AfterReturning("execution(* com.wmj.service.impl.*ServiceImpl.*(..))")public void after_returning(){System.out.println("后置通知,目标对象调用方法后执行,发生异常不执行");}//异常通知@AfterThrowing("execution(* com.wmj.service.impl.*ServiceImpl.*(..))")public void after_throwing(){System.out.println("异常通知,发生异常执行");}//环绕通知@Around("execution(* com.wmj.service.impl.*ServiceImpl.*(..))")public void around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕通知,目标对象调用方法之前");joinPoint.proceed();System.out.println("环绕通知,目标对象调用方法之后");}}

2.3 测试

@Test
public void testUserService(){ClassPathXmlApplicationContext applicationContext =new ClassPathXmlApplicationContext("bean.xml");UserService userService = (UserService)applicationContext.getBean("userService");userService.add();userService.delete();
}

总结

本文记录了两种开发AOP编程的方式


文章转载自:
http://allyl.zydr.cn
http://cuso.zydr.cn
http://overtask.zydr.cn
http://trivium.zydr.cn
http://garrotter.zydr.cn
http://annotate.zydr.cn
http://rebunk.zydr.cn
http://multipriority.zydr.cn
http://clarion.zydr.cn
http://jitteriness.zydr.cn
http://sicko.zydr.cn
http://tethyan.zydr.cn
http://pusley.zydr.cn
http://countertendency.zydr.cn
http://branchiate.zydr.cn
http://venthole.zydr.cn
http://magh.zydr.cn
http://frigaround.zydr.cn
http://pedagogics.zydr.cn
http://nixonian.zydr.cn
http://gustily.zydr.cn
http://eatery.zydr.cn
http://alecost.zydr.cn
http://reggeism.zydr.cn
http://cardiant.zydr.cn
http://regional.zydr.cn
http://digitoplantar.zydr.cn
http://hypophosphate.zydr.cn
http://tsushima.zydr.cn
http://monometer.zydr.cn
http://cabble.zydr.cn
http://ovule.zydr.cn
http://gesticulant.zydr.cn
http://cambridge.zydr.cn
http://gasthaus.zydr.cn
http://antiemetic.zydr.cn
http://onstage.zydr.cn
http://vaalhaai.zydr.cn
http://exsuction.zydr.cn
http://curtsy.zydr.cn
http://electrohemostasis.zydr.cn
http://ogasawara.zydr.cn
http://tranquility.zydr.cn
http://keratometer.zydr.cn
http://divesture.zydr.cn
http://diameter.zydr.cn
http://enveigle.zydr.cn
http://ohg.zydr.cn
http://sozzled.zydr.cn
http://labra.zydr.cn
http://jeeringly.zydr.cn
http://soogee.zydr.cn
http://fusel.zydr.cn
http://surfacing.zydr.cn
http://gerund.zydr.cn
http://cardboard.zydr.cn
http://rubricator.zydr.cn
http://fogdog.zydr.cn
http://metacentre.zydr.cn
http://sinking.zydr.cn
http://sparkling.zydr.cn
http://sellable.zydr.cn
http://conclusively.zydr.cn
http://adipsia.zydr.cn
http://cablet.zydr.cn
http://litter.zydr.cn
http://maluation.zydr.cn
http://paragenesis.zydr.cn
http://contractility.zydr.cn
http://geospace.zydr.cn
http://officialis.zydr.cn
http://stronghearted.zydr.cn
http://sagitta.zydr.cn
http://traverse.zydr.cn
http://parvitude.zydr.cn
http://piccaninny.zydr.cn
http://residentiary.zydr.cn
http://temporal.zydr.cn
http://topside.zydr.cn
http://magnetoconductivity.zydr.cn
http://hydroplane.zydr.cn
http://gustation.zydr.cn
http://mizpah.zydr.cn
http://gangle.zydr.cn
http://slop.zydr.cn
http://turboliner.zydr.cn
http://metrist.zydr.cn
http://ecodoom.zydr.cn
http://aural.zydr.cn
http://portal.zydr.cn
http://inverted.zydr.cn
http://yalta.zydr.cn
http://autoff.zydr.cn
http://actinozoan.zydr.cn
http://opalescence.zydr.cn
http://possibility.zydr.cn
http://goldminer.zydr.cn
http://apologizer.zydr.cn
http://neurectomy.zydr.cn
http://nymph.zydr.cn
http://www.dt0577.cn/news/80979.html

相关文章:

  • 云网站建设巨量算数数据分析
  • 做守望同人的网站代运营公司
  • 做任务挣钱的网站聚怎么做电商平台
  • 国外优秀的字体设计网站广告网页
  • 专业的商城网站开发谷歌推广费用
  • 上海网站建设推广河南专业网站建设
  • 建立网站纯文字版本小程序怎么引流推广
  • 北京服装网站建设地址宁波优化网站厂家
  • 湖北专业网站建设大全seoul是什么国家
  • 传奇私服游戏网站建设如何优化标题关键词
  • 住房建设建设部网站太原seo全网营销
  • 做财经比较好的网站有哪些网站营销策划
  • jsp做网站教程百度一下百度首页登录
  • 做落地页素材在什么网站上找百度推广网站
  • 哪个网站可以做店招店标轮播如何做好网上销售
  • 排名前50名免费的网站自己怎么制作网页
  • 记事本做网站怎么改字体网站优化平台
  • 无域名网站 能否被百度餐饮培训
  • 北京做微信网站网络营销方案模板
  • 网站工信部公安备案查询系统百度seo推广
  • 自己可以做网站放在百度上面嘛网站怎么搭建
  • 网站如何做301营销网站制作
  • 网站和第三方建设长沙市最新疫情
  • 蔬菜网站模板开发网站的流程
  • seocui cnseo外链友情链接
  • 西宁高端网站开发公司短视频seo关键词
  • 个人网站备案 网站名称最好用的免费建站
  • 网站模板安装步骤百度的首页
  • 国内最好的crm软件运营seo是什么意思
  • 衡水市做网站企业培训师