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

广州城乡建设部网站首页中国开发网站的公司

广州城乡建设部网站首页,中国开发网站的公司,网页美工设计的要点分别是什么,宣传片设计制作公司目录 一、AOP 简介 1、什么是 AOP 二、AOP 底层原理 1、动态代理原理 2、基于接口的 JDK 动态代理 3、基于继承的 CGLib 动态代理 三、底层原理实现—— JDK 动态代理 1、使用 Proxy 类的方法创建代理对象 2、JDK 动态代理示例 四、AOP 操作术语 1、连接点 2、切入…目录 一、AOP 简介 1、什么是 AOP 二、AOP 底层原理 1、动态代理原理 2、基于接口的 JDK 动态代理  3、基于继承的 CGLib 动态代理 三、底层原理实现—— JDK 动态代理 1、使用 Proxy 类的方法创建代理对象 2、JDK 动态代理示例 四、AOP 操作术语 1、连接点 2、切入点 3、通知增强 4、切面 五、基于 AspectJ 实现 AOP 操作注解 1、准备工作 2、基于 AspectJ 注解方式 3、其他通知 4、公共切入点提取 5、多个 Proxy 类增强同一个方法 6、完全注解开发 六、基于 AspectJ 实现 AOP 操作配置文件方式 1、示例 一、AOP 简介 1、什么是 AOP 1AOP 就是面向切面编程 利用 AOP 可以对业务逻辑的各个部分进行隔离从而使得业务逻辑各部分之间的耦合度降低提高程序的可重用性同时提高了开发的效率。 2简单来说就是不需要修改源代码但依然可以为原来的代码添加新功能 比如在登录功能的基础上添加一个权限检查的模块。通过某些配置将这个模块或部分实现代码添加到登录功能上。 二、AOP 底层原理 1、动态代理原理 利用Java的反射技术(Java Reflection)在运行时创建一个实现某些给定接口的新类也称“动态代理类”及其实例对象。代理的是接口(Interfaces)不是类(Class)也不是抽象类。 AOP 底层是通过动态代理实现的而动态代理是基于反射来设计的。动态代理有两种情况 有接口则使用基于接口的 JDK 动态代理没有接口则使用基于继承的 CGLib 动态代理  2、基于接口的 JDK 动态代理  创建接口实现类的代理Proxy对象使用这个对象的 invoke 方法来增强接口实现类的方法无论调用哪个方法都会增强。 3、基于继承的 CGLib 动态代理 创建子类的代理对象增强类的方法。 三、底层原理实现—— JDK 动态代理 1、使用 Proxy 类的方法创建代理对象 使用 newProxyInstance() 返回指定接口的代理类的实例将该接口实例的方法调用分配给指定的调用处理程序。 经此步骤在原本的方法的基础上就会添加上增强的部分。 1newProxyInstance 方法的三个参数 ClassLoader类加载器interfaces需要增强的方法所在的接口类支持多个接口数组形式InvocationHandler调用处理器程序 2对第一个参数的理解 上文提到动态代理的原理而这个类加载器其实就是基于这个原理将增强部分与原部分得到的结果赋予这个新类那么我们调用这个新类的方法就可以得到我们想要的增强效果。 3对第二个参数特别是多个接口的情况的理解 newProxyInstance 是为一个实现类的实例来添加增强部分的因为明确了具体哪一个实现类也就明确了具体的方法。 又因为一个实现类很可能是多个接口的实现类那么在这种情况下就需要把所有接口都传入。 4对第三个参数的理解 调用处理器它其实是一个接口。 我们实现这个接口比如叫做 A将实现类的实例传递给 A在 invoke 方法中进行具体操作。 2、JDK 动态代理示例 目的增强 UserDao 里的方法。先编写好基本的接口和实现类然后给实现类增加新的方法。 1代码 1-1创建接口定义方法 package com.demo.dao;public interface UserDao {public int add(int a,int b);public String update(String id); }1-2创建接口实现类实现方法 package com.demo.dao.impl;import com.demo.dao.UserDao;public class UserDaoImpl implements UserDao {Overridepublic int add(int a, int b) {return a b;}Overridepublic String update(String id) {return id;} }1-3使用 Proxy 类创建接口代理对象 package com.demo.proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;// 创建代理对象的代码 public class JDKProxy implements InvocationHandler {// 创建的是谁的代理对象就把谁传递过来一般用有参构造private Object obj;public JDKProxy(Object obj) {this.obj obj;}Override // invoke 放在在代理对象创建后马上调用public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 增强之前System.out.println(method.getName() 增强之前);Object res method.invoke(obj, args);// 增强之后System.out.println(method.getName() 增强之后);return res;}}1-4测试代码 import com.demo.dao.UserDao; import com.demo.dao.impl.UserDaoImpl; import com.demo.proxy.JDKProxy; import org.junit.Test;import java.lang.reflect.Proxy;public class ProxyTest {Testpublic void test() {Class[] interfaces {UserDao.class};UserDao userDao new UserDaoImpl();UserDao userDaoProxy (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), interfaces, new JDKProxy(userDao));System.out.println(res userDaoProxy.add(2, 3));System.out.println(res userDaoProxy.update(114514));} }2输出结果 四、AOP 操作术语 1、连接点 可以被增强的类方法就称为连接点。 2、切入点 实际被增强的类方法称为切入点通过切入点表达式确定后面会讲。 3、通知增强 实际被增强的逻辑部分代码就称为通知。 通知有 5 种类型 前置通知原方法之前执行后置通知原方法之后执行环绕通知原方法之前和之后都执行异常通知原方法异常时执行最终通知类似 finally 4、切面 切面是一个动作是一个把通知增强应用到切入点的过程。比如把权限判断加入到登录这一过程就是切面 五、基于 AspectJ 实现 AOP 操作注解 前面所讲的 JDK 动态代理是为了说明 AOP 是如何实现的。在实际应用中不会使用这种方式实现 AOP 操作而是通过 AspectJ 注解莱实现对象的获取还是通过 IOC 来实现。 1、准备工作 1Spring 框架一般都是基于 AspectJ 实现 AOP 操作 AspectJ 不是 Spring 组成部分而是一个独立的 AOP 框架一般把 AspectJ 和 Spirng 框架一起使用进行 AOP 操作。 2基于 AspectJ 实现 AOP 操作的两种方式 基于 xml 配置文件实现基于注解方式实现常用 3引入相关依赖仅写出了 AOP 部分所需依赖 dependencies!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --dependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.3.22/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.3.22/version/dependencydependencygroupIdnet.sourceforge.cglib/groupIdartifactIdcom.springsource.net.sf.cglib/artifactIdversion2.2.0/version/dependencydependencygroupIdaopalliance/groupIdartifactIdaopalliance/artifactIdversion1.0/version/dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.6.8/version/dependency/dependencies 4切入点表达式 4-1切入点表达式的作用 知道对哪个类里面的哪个方法进行增强。 4-2语法结构 execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表])) 权限修饰符private、public、……返回类型void、int、省略、……参数列表..两个点表示方法中的参数*表示任意权限修饰符、类、方法 4-3例子 注意 * 后的空格是不能省略的它代表了返回类型。 对 com.demo.dao.BookDao 类里面的 add() 进行增强 execution(* com.demo.dao.BookDao.add(..))对 com.demo.dao.BookDao 类里面的所有的方法进行增强 execution(* com.demo.dao.BookDao.*(..)) 对 com.demo.dao 包里面所有类类里面所有方法进行增强 execution(* com.atguigu.dao.*.*(..))2、基于 AspectJ 注解方式 1开启注解扫描以及生成代理对象 可以使用配置类也可以使用配置文件。两个标签的作用类似就是寻找给定范围内的类是否包含对应标签。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!-- 注解扫描 --context:component-scan base-packagecom.demo/context:component-scan!-- 开启Aspect生成代理对象 --aop:aspectj-autoproxy/aop:aspectj-autoproxy /beans 2创建类定义方法 package com.demo.dao.impl;import com.demo.dao.UserDao; import org.springframework.stereotype.Component;Component public class UserDaoImpl implements UserDao {Overridepublic void add() {System.out.println(add()......);} }3创建 Proxy 类编写增强逻辑并添加注解 Aspect 创建不同通知类型的方法添加对应的注解注解是 aspect 包中的注解并使用切入点表达式确定目标方法。 package com.demo.proxy;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component;Component Aspect public class UserDaoProxy {Before(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void before() { // 前置通知System.out.println(before()......);} }4测试代码 import com.demo.dao.UserDao; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AspectBeanTest {Testpublic void test() {ApplicationContext context new ClassPathXmlApplicationContext(AspectBean.xml);UserDao userDao context.getBean(userDaoImpl, UserDao.class);userDao.add();} }5输出结果 3、其他通知 1代码  package com.demo.proxy;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;Component Aspect public class UserDaoProxy {Before(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void before() { // 前置通知System.out.println(前置通知......);}After(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void after() { // finally 通知System.out.println(finally 通知......);}AfterReturning(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void afterReturning() { // 后置通知System.out.println(后置通知......);}AfterThrowing(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void afterThrowing() { // 异常通知System.out.println(异常通知......);}Around(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 环绕通知System.out.println(环绕通知之前......);proceedingJoinPoint.proceed();System.out.println(环绕通知之后......);} }2输出结果 3出现异常的输出结果 4、公共切入点提取 上面的示例代码中的切入点的 value 值都一样可以将他们提取出来。 Pointcut(value execution(* com.demo.dao.impl.UserDaoImpl.add(..))) public void AddPoint() {}Before(value AddPoint()) public void before() { // 前置通知System.out.println(前置通知......); } 5、多个 Proxy 类增强同一个方法 如果出现多个 Proxy 增强类都含有多同一个方法的增强那么可以通过设置优先级来确定它们的执行增强顺序。 1在 Proxy 增强类上添加注解 Order Order(整数值)其中整数值越小该增强类的优先级越大。 2代码 package com.demo.proxy;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;Component Aspect Order(1) public class UserDaoProxy {Before(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void before() { // 前置通知System.out.println(前置通知......);} }Component Aspect Order(0) class Person {Before(value execution(* com.demo.dao.impl.UserDaoImpl.add(..)))public void before() {System.out.println(person 的前置通知);} }3输出结果 6、完全注解开发 1创建配置类不需要创建 xml 配置文件 package com.demo.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy;Configuration ComponentScan(basePackages {com.demo}) EnableAspectJAutoProxy(proxyTargetClass true) public class Config {} 2测试代码 import com.demo.config.Config; import com.demo.dao.UserDao; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AspectBeanTest {Testpublic void test() {ApplicationContext context new AnnotationConfigApplicationContext(Config.class);UserDao userDao context.getBean(userDaoImpl, UserDao.class);userDao.add();} }3输出结果 六、基于 AspectJ 实现 AOP 操作配置文件方式 Proxy类和目标增强类的对象的创建就是 IOC 里讲的操作重点在于 AOP 部分的配置。 1、示例 1代码 1-1Book 类和 BookProxy 类 package com.demo.pojo;public class Book {public void buy() {System.out.println(but()......);} }package com.demo.proxy;public class BookProxy {public void before() {System.out.println(before 前置通知);} }1-2配置文件 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!-- 创建 bean 对象 --bean idbook classcom.demo.pojo.Book/beanbean idbookProxy classcom.demo.proxy.BookProxy/bean!-- 配置 AOP 增强 --aop:config!-- 配置切入点 --aop:pointcut idpc expressionexecution(* com.demo.pojo.Book.buy(..))/!-- 配置切面 --aop:aspect refbookProxy!-- 配置增强作用的具体方法 --aop:before methodbefore pointcut-refpc/aop:before !-- 表示把 before() 作用到 pc 指向的方法上 --/aop:aspect/aop:config /beans 1-3测试代码 import com.demo.pojo.Book; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class XmlTest {Testpublic void test() {ApplicationContext context new ClassPathXmlApplicationContext(Bean01.xml);Book book context.getBean(book, Book.class);book.buy();} }2输出结果
http://www.dnsts.com.cn/news/197920.html

相关文章:

  • 网站空间域名能不能自己续费免费建站软件哪个最好
  • 网站备案是自己可以做吗厦门房产网
  • 专业信息门户网站定制apache wordpress 伪静态
  • wps文字可以做网站吗沈阳发布最新通告
  • 两个男生是怎么做的细写网络优化工程师简历
  • 河南省汝州文明建设门户网站在线制作图片头像
  • 沈阳网站建设哪里的公司比较好百度搜索排名规则
  • 做网站一般链接什么数据库asp门户网站源码
  • 做游戏CG分享的网站南海建设局网站
  • 磁盘阵列做网站北京到安阳高速费多少钱
  • 旅游网站网页设计短链接在线生成器免费版
  • 苗木网站开发需求wordpress无编辑器
  • 沈阳做网站在哪网站服务器租用资质
  • 公司建设网站费用会计分录wordpress招聘插件
  • 茂名免费网站建设国内设计好的网站案例
  • 门户网站建设研究东莞百度推广教程
  • 重庆网站制作工作室微信做网站推广赚钱吗
  • 没有域名怎么搭建网站品牌官网设计
  • 达州市建设局网站做网站游戏都需要什么
  • 炫彩发光字制作免费网站广告传媒公司名字取名
  • 成年做羞羞的视频网站天津小型企业网站设计方案
  • 网站的基本布局做网站待遇
  • 电子商务网站建设目标分析东莞网络推广外包公司
  • wordpress 整站 数据跑腿公司怎么做网站
  • 下载网站的表格要钱如何做个人网页设计与制作教程
  • 网站前台设计软件广州网站推广制作
  • 基层建设期刊上什么网站查询文章怎样创建自己的网站
  • 关于做书的网站专业网站建设的软件
  • 网站的发布与推广方式wordpress on.7主题
  • 如何做一个个人网站网站该怎么做链接