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

中国建设监理协会化工监理分会网站网站建设程序员做什么

中国建设监理协会化工监理分会网站,网站建设程序员做什么,佛山市企业网站seo联系方式,厦门网页建站申请比较好AOP AOP静态代理动态代理ProxyCGLIB AOP 面向切面编程 优点: 提高代码的可重用性业务代码编码更简洁业务代码维护更高效业务功能扩展更便捷 Joinpoint(连接点)就是方法Pointcut(切入点)就是挖掉共性功能的方法Advice(通知)就是共性功能#xff0c;最终以一个方法的形式呈现Asp… AOP AOP静态代理动态代理ProxyCGLIB AOP 面向切面编程 优点: 提高代码的可重用性业务代码编码更简洁业务代码维护更高效业务功能扩展更便捷 Joinpoint(连接点)就是方法Pointcut(切入点)就是挖掉共性功能的方法Advice(通知)就是共性功能最终以一个方法的形式呈现Aspect(切面)是共性功能与挖的位置的对应关系Target(目标对象)就是挖掉功能的方法对应的类产生的对象这种对象是无法直接完成最终工作的Weaving(织入)就是将挖掉的功能回填的动态过程Proxy(代理)目标对象无法直接完成工作需要对其进行功能回填通过创建原始对象的代理对象实现Introduction(引入/引介)是对原始对象无中生有的添加成员变量或成员方法 使用到的注解 定义切面 Aspect 定义再类的上方,设置当前类为切面类 Aspect public class AopAdvice { }切入点引用 Pointcut 作用在方法上使用当前的方法名称作为切入点引用名称 举例: Pointcut(execution(* *(..))) public void pt() { }五种通知 注解名称解释说明Before前置通知原始方法执行前执行如果通知中抛出异常阻止原始方法运行After后置通知原始方法执行后执行无论原始方法中是否出现异常都将执行通知AfterReturning当前方法作为返回后通知原始方法正常执行完毕并返回结果后执行如果原始方法中抛出异常无法执行AfterThrowing异常后通知原始方法抛出异常后执行如果原始方法没有抛出异常无法执行Around当前方法作为环绕通知在原始方法执行前后均有对应执行执行还可以阻止原始方法的执行 举例: Pointcut(execution(* *(..))) public void pt() { } Before(pt()) public void before(){ } After(pt()) public void after(){ } AfterReturning(valuept(),returning ret) public void afterReturning(Object ret) { } AfterThrowing(valuept(),throwing t) public void afterThrowing(Throwable t){ } Around(pt()) public Object around(ProceedingJoinPoint pjp) throws Throwable {Object ret pjp.proceed();return ret; }完整的举例: Component Aspect//设置切面 public class AnnotationAop {//设置切入点为有有注解LogAnnotation的方法Pointcut(annotation(com.springAop.annotation.LogAnnotation))public void pointCut() {}Around(pointCut())public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println(环绕前增强1);//获取方法签名MethodSignature signature (MethodSignature) pjp.getSignature();Method method1 signature.getMethod();//获取接口的方法Method method pjp.getTarget().getClass().getMethod(method1.getName(), method1.getParameterTypes());//获取实现类的方法System.out.println(实现类 method1);String name method.getName();//获取方法名System.out.println(获取方法名 name);Class? returnType method.getReturnType();//获取返回值类型String name1 returnType.getName();System.out.println(返回值类型 name1);Class?[] parameterTypes method.getParameterTypes();//获取参数类型for (int i 0; i parameterTypes.length; i) {String name2 parameterTypes[i].getName();//获取参数类型System.out.println(parameterTypes name2);}//获取参数的值Object[] args pjp.getArgs();for (int i 0; i args.length; i) {System.out.println(i args[i]);}Object proceed pjp.proceed();LogAnnotation annotation method.getAnnotation(LogAnnotation.class);//获取方法上的注解Annotation[] annotations method.getDeclaredAnnotations();//获取方法上的注解for (Annotation a : annotations) {String annotationName a.annotationType().getName();//获取注解名Class? extends Annotation aClass a.annotationType();if (a instanceof LogAnnotation) {System.out.println(我是注解LogAnnotation已经执行了 );}System.out.println(annotationName annotationName);// 在这里可以使用获取到的 annotationName 进行逻辑处理}System.out.println(环绕后增强1);return proceed;}//前置增强Before(pointCut())public void before() {System.out.println(前置增强1);}After(pointCut())public void after() {System.out.println(后置增强1);}AfterThrowing(pointCut())public void afterThrowing() {System.out.println(异常增强1);}AfterReturning(pointCut())public void afterReturning() {System.out.println(返回后通知1);} }/*** 自定义日志注解*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.TYPE}) public interface LogAnnotation {String value() default ;String name() default ;String type() default ; }Service(bookService) public class BookServiceImpl implements BookService {Autowiredprivate BookDao bookDao;Overridepublic void save(Book book) {bookDao.save(book);}Overridepublic void update(Book book) {bookDao.update(book);}Overridepublic void delete(Integer id) {bookDao.delete(id);}OverrideLogAnnotation1231(value 查询value1231,type 查询type1231,name 查询name1231)LogAnnotation(value 查询value,type 查询type,name 查询name)public Book findById(Integer id) {System.out.println(id id);return bookDao.findById(id);}Overridepublic ListBook findAll() {System.out.println( );return bookDao.findAll();} } 静态代理 装饰者模式Decorator Pattern在不惊动原始设计的基础上为其添加功能 举例: public class UserServiceDecorator implements UserService{private UserService userService;public UserServiceDecorator(UserService userService) {this.userService userService;}public void save() {//原始调用userService.save();//增强功能后置System.out.println(刮大白);} }动态代理 Proxy JDKProxy动态代理是针对对象做代理要求原始对象具有接口实现并对接口方法进行增强 举例: public class UserServiceJDKProxy {public UserService createUserServiceJDKProxy(final UserService userService){//获取被代理对象的类加载器ClassLoader classLoader userService.getClass().getClassLoader();//获取被代理对象实现的接口Class[] classes userService.getClass().getInterfaces();//对原始方法执行进行拦截并增强InvocationHandler ih new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//前置增强内容Object ret method.invoke(userService, args);//后置增强内容System.out.println(刮大白2);return ret;}};//使用原始被代理对象创建新的代理对象UserService proxy (UserService) Proxy.newProxyInstance(classLoader,classes,ih);return proxy;} }CGLIB CGLIB(Code Generation Library)Code生成类库CGLIB动态代理不限定是否具有接口可以对任意操作进行增强CGLIB动态代理无需要原始被代理对象动态创建出新的代理对象 举例 public class UserServiceImplCglibProxy {public static UserServiceImpl createUserServiceCglibProxy(Class clazz){//创建Enhancer对象可以理解为内存中动态创建了一个类的字节码Enhancer enhancer new Enhancer();//设置Enhancer对象的父类是指定类型UserServerImplenhancer.setSuperclass(clazz);Callback cb new MethodInterceptor() {public Object intercept(Object o, Method m, Object[] a, MethodProxy mp) throws Throwable {Object ret mp.invokeSuper(o, a);if(m.getName().equals(save)) {System.out.println(刮大白);}return ret;}};//设置回调方法enhancer.setCallback(cb);//使用Enhancer对象创建对应的对象return (UserServiceImpl)enhancer.create();} }总结 静态代理通常只代理一个类动态代理是代理一个接口下的多个实现类。 静态代理事先知道要代理的是什么而动态代理不知道要代理什么东西只有在运行时才知道。 动态代理是实现 JDK 里的 InvocationHandler 接口的 invoke 方法但注意的是代理的是接口也就是你的业务类必须要实现接口通过 Proxy 里的 newProxyInstance 得到代理对象 还有一种动态代理 CGLIB代理的是类不需要业务类继承接口通过派生的子类来实现代理。通过在运行时动态修改字节码达到修改类的目的 在面向对象编程oop思想中我们将事物纵向抽成一个个的对象。而在面向切面编程 中我们将一个个的对象某些类似的方面横向抽成一个切面对这个切面进行一些如权限控制、事物管理记录日志等 公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理如果是接口采用 JDK 动态代理如果是类采用 CGLIB 方式实现动态代理。 Java 动态代理是利用反射机制生成一个实现代理接口的匿名类在调用具体方法前调用InvokeHandler 来处理。 而 cglib 动态代理是利用 asm 开源包对代理对象类的 class 文件加载进来通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口默认情况下会采用 JDK 的动态代理实现 AOP 2、如果目标对象实现了接口可以强制使用 CGLIB 实现 AOP 3、如果目标对象没有实现了接口必须采用 CGLIB 库spring 会自动在 JDK 动态代理和 CGLIB 之间转换
http://www.w-s-a.com/news/220733/

相关文章:

  • 书店网站怎么做网站点击快速排名
  • 太阳镜商城网站建设公司做网站
  • 如何制作个人作品网站宣传片拍摄合同
  • 关于微网站策划ppt怎么做做插画的网站
  • 做设计网上揽活哪个网站最好中企动力算大厂吗
  • 电子商务网站开发常用工具牡丹江吧
  • 四川成都网站制作公司wordpress 获取某个分类的文章
  • wordpress 编辑器推动门户网站建设不断优化升级
  • 做游戏网站的前景温江区建设局网站
  • 济南做微网站推广做网站seo优化总结
  • 巢湖网站建设电话长沙大型互联网公司
  • wordpress站群主机海南人
  • 云南网站建设维护商业网站建设教程
  • 云南省滇中引水工程建设管理局网站jsp个人网站设计
  • 网站建设 域名业务 邮箱互联网装饰网站
  • 建设厅技工在哪个网站上查询有了网站模板 还要怎样做
  • 城市联盟网站怎么做百度云网站建设视频教程
  • 织梦cms 官方网站网页视频如何下载到电脑
  • 查询建设公司业绩网站国外外链平台
  • 搭建直播网站需要怎么做做石材网站步骤
  • 移动网站如何做权重wordpress 统计字数 插件
  • 编写网站的软件百度指数教程
  • 网站改版建议策划书做设计什么兼职网站
  • 北京做兼职网站文创产品设计流程
  • 南阳做玉器网站wordpress 图片被缩小
  • 自己做网站卖衣服cms做网站容易不
  • 安徽安搜做的网站怎么样手机网站商城建设答辩问题
  • 分析不同网站的优缺点房产网站定制
  • 深圳工业设计大展2021论坛与网站做优化哪个更好
  • 什么网站做招聘比较好网络营销渠道管理