单例模式&CGLIB代理

面向大海,春暖花开

 来自网友的解析:

Enhancer可能是CGLIB中最常用的一个类,和Java1.3动态代理中引入的Proxy类差不多(如果对Proxy不懂,可以参考这里)。和Proxy不同的是,Enhancer既能够代理普通的class,也能够代理接口。Enhancer创建一个被代理对象的子类并且拦截所有的方法调用(包括从Object中继承的toString和hashCode方法)。Enhancer不能够拦截final方法,例如Object.getClass()方法,这是由于Java final方法语义决定的。基于同样的道理,Enhancer也不能对fianl类进行代理操作。这也是Hibernate为什么不能持久化final class的原因

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.apache.log4j.Logger;

import java.lang.reflect.Method;
import java.util.Map;

/**
 * 代理打印日志,并生检查登录,使用的原则是,name必须要放到第一个参数
 * @author Binglong
 * @date 2018-03-20
 */
public class RemoteServiceProxy{
    private static final Logger logger = Logger.getLogger(RemoteServiceProxy.class);

    private static class SingleInstance{
        private static final RemoteService INSTANCE = new RemoteServiceProxy().getProxy();
    }

    /**
     * 获取代理对象的单例
     * @return
     */
    public static RemoteService getProxyInstance(){
        return SingleInstance.INSTANCE;
    }

    /**
     * 获取代理对象
     * @return
     */
    public RemoteService getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RemoteService.class);
        enhancer.setCallback(getMethodInterceptor());
        return (RemoteService)enhancer.create();
    }

    /**
     * SmcName必须要放到第一个参数
     * @return
     */
    public MethodInterceptor getMethodInterceptor(){
        return new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                String smcName = (String) objects[0];
                boolean flag = checkLogin(method.getName(), smcName);
                if (flag){
                    //执行父类的方法,也就是RemoteService中的方法
                    return methodProxy.invokeSuper(o, objects);
                }
                return null;
            }
        };
    }

    /**
     * 检查登录状态
     * @param methodName
     * @param name
     * @return
     */
    private boolean checkLogin(String methodName, String name){
        String logMsg = ‘[‘ + name + "][RemoteServiceProxy." + methodName + ‘]‘;
        if (logger.isDebugEnabled()) {
            logger.debug(logMsg + " begin...");
        }
        boolean loginFlag = RemoteService.getInstance().isLogined(name);
        if (!loginFlag) {
            logger.info(logMsg + " not login, login first");
            Map<String, String> header = SmcService.getInstance().header;
            loginFlag = RemoteService.getInstance().login(header, name);
            if (!loginFlag){
                logger.warn(logMsg + " login failed");
                return false;
            }
        }
        return true;
    }
}

原文地址:https://www.cnblogs.com/nedhome/p/9508021.html

时间: 2024-10-20 01:19:27

单例模式&CGLIB代理的相关文章

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

谈谈java的代理模式认识 三————CGLIB代理

接着上篇博客的代理模式,我们继续,上篇博客介绍了JDK的动态代理,但是JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,这样就存在一定的局限性.对于这种情况,我们采用CGLIB来实现. 一.CGLIB动态代理 cglib是针对类来实现代理的,其实现原理:CGLIB的底层采用ASM字节码生成框架,使用字节码技术生成代理,比使用反射生成代理的效果要高,是对指定的目标类生成一个子类,并覆盖其中方法实现增强.但是也有一点点不足,因为采用的是继承,所以不能对fina

(转)Java动态代理与CGLib代理

本文通过spring aop的代理实现简述了java动态代理和cglib的区别,有助于理解java的代理模式 转载自:http://www.iteye.com/topic/182654 Java代码 <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        // TODO Auto-generated method stub <br>        Sys

spring 代理(静态代理&amp;动态代理&amp;cglib代理)

介绍spring AOP之前 先介绍三种常见的代理方式:静态代理,动态代理,cglib代理 代理概述: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象.这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 举例:明星(邓紫棋)<------经纪人<-------用户 目标        (代理) 一.静态代理 1)代理的对象要实现与目标对象一样的接口 2)举例:保存用户(模拟) Dao,直接保存 DaoProxy,给保存

Spring《八-一》CGLIB代理和自动代理

CGLIB代理 配置文档 1 <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 2 <property name="proxyTargetClass"> 3 <value>true</value> 4 </property> 5 <property name="t

jdk动态代理与cglib代理、spring aop代理实现原理解析

原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 动态代理实现主要有2种形式,主要分为: 1.jdk动态代理: 1)原理:是根据类加载器和接口创建代理类(此代理类是接口的实现类,所以必须使用接口 面向接口生成代理,位于java.lang.reflect包下) 2)实现方式: 1. 通过实现Invocati

Cglib代理

目标对象: package com.bj.daili; public class UserServiceImpl { public final void saveUser(String username, String password) { System.out.println("保存用户["+username+"],密码是["+password+"]"); } public void updateUser(String username, S

jdk动态代理和cglib代理总结

首先我们来谈谈jdk的动态代理,它允许开发者在运行期创建接口的代理实例,那么当我们在运行过程中调用某个实例的某个方法时,可以使用代理对象去具体实现它,从而达到aop的效果. (1)jdk的动态代理主要涉及两个类:proxy和invocacationHandler,invocationHandler里面包含了横切逻辑,并且可以使用反射调用目标类的方法(就是切点),proxy类主要是使用它的一个newinstance方法去创建一个代理实例. 下面我们来看代码: package com.yue.tes

cglib 代理

cglib 代理 什么是cglib?   一段介绍是这样的:       CGLIB(Code Generation Library)是一个开源项目!       是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.       CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.       Spring AOP和Hibernate同时使用JDK的动态代理和CGLIB包. cglib 代理特点: CGLIB 是针对