17_AOP入门准备_Salay案例(利用动态代理)

【案例分析】

查看Salary:

  1.启动日志

  2.启动安全性的框架

  3.检查权限:如果有查看工资的权限,则查看工资,否则提示"权限不足"

【工厂截图】

【SalaryManager.java】

package com.HigginCui.proxy.salary;

//目标接口
public interface SalaryManager {
    //查看工资
    public void showSalary();
}

【SalaryManagerImpl.java】

package com.HigginCui.proxy.salary;
//目标类
public class SalaryManagerImpl implements SalaryManager{
    @Override
    public void showSalary() {
        System.out.println("Show Salary...");
    }
}

【Logger.java】

package com.HigginCui.proxy.salary;
//日志类
public class Logger {
    public void logging(){
        System.out.println("logging ...");
    }
}

【Privilege.java】

package com.HigginCui.proxy.salary;
//权限类
public class Privilege {
    private String access;
    public String getAccess() {
        return access;
    }
    public void setAccess(String access) {
        this.access = access;
    }
}

【Security.java】

package com.HigginCui.proxy.salary;
//安全性框架类
public class Security {
    public void security(){
        System.out.println("security ...");
    }
}

【SalaryManagerInterceptor.java】

package com.HigginCui.proxy.salary;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//拦截器
public class SalaryManagerInterceptor implements InvocationHandler{
    private Object target;
    private Logger logger;
    private Security security;
    private Privilege privilege;

    public SalaryManagerInterceptor(Object target,Logger logger,Security security,Privilege privilege){
        this.target=target;
        this.logger=logger;
        this.security=security;
        this.privilege=privilege;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //1.开启日志
        this.logger.logging();
        //2.开启安全性框架类
        this.security.security();
        //3.检查权限,如果是"admin",则允许查看,否则提示"权限不足"
        if(this.privilege.getAccess().equals("admin")){
            //4.调用目标方法
            method.invoke(target, args);
        }else{
            System.out.println("权限不足...");
        }
        return null;
    }

}

【SalaryTest.java】

package com.HigginCui.test;

import java.lang.reflect.Proxy;

import org.junit.Test;

import com.HigginCui.proxy.salary.Logger;
import com.HigginCui.proxy.salary.Privilege;
import com.HigginCui.proxy.salary.SalaryManager;
import com.HigginCui.proxy.salary.SalaryManagerImpl;
import com.HigginCui.proxy.salary.SalaryManagerInterceptor;
import com.HigginCui.proxy.salary.Security;
//模拟客户端
public class SalaryTest {
    @Test
    public void testSalart(){
        Object target=new SalaryManagerImpl();
        Logger logger =new  Logger();
        Security security=new Security();
        Privilege privilege=new Privilege();
        /*
         * 如果是"admin",提示"Show Salary..."
         * 否则,提示"权限不足"
         */
        privilege.setAccess("admin");
        SalaryManagerInterceptor interceptor=new SalaryManagerInterceptor(target, logger, security, privilege);
        SalaryManager proxy=(SalaryManager) Proxy.newProxyInstance(
                                        target.getClass().getClassLoader(),
                                        target.getClass().getInterfaces(),
                                        interceptor);
        proxy.showSalary();
    }
}

【运行结果】

logging ...
security ...
Show Salary...
时间: 2024-10-24 21:47:47

17_AOP入门准备_Salay案例(利用动态代理)的相关文章

关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection

代码如下: final Connection conn=pool.remove(0); //利用动态代理改造close方法 Connection proxy= (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object pro

如何利用动态代理IP来做SEO(网络营销)

对动态代理IP大家都不陌生,今天我们来聊下如何利用动态代理ip来做SEO优化.其实除了SEO很多网络营销也都需要用到代理IP,因为很多网络营销的用户都知道,投票.注册帐号.发帖子等工作,都需要用到代理IP这个工具,才能毫无限制的操作. 动态代理IP对seo网站运营的影响: 我们在尝试运用动态代理IP之前,先说说咱们有什么常规化的seo优化方式去优化网站,其中要做好2点.第一点做好基本优化.第二点,深入认识搜索引擎: 1:做好基本优化:说的就是站内优化和站外优化.站内优化就是把网站优化的基础完善,

【Java入门提高篇】Day11 Java代理——JDK动态代理

今天来看看Java的另一种代理方式--JDK动态代理 我们之前所介绍的代理方式叫静态代理,也就是静态的生成代理对象,而动态代理则是在运行时创建代理对象.动态代理有更强大的拦截请求功能,因为可以获得类的运行时信息,可以根据运行时信息来获得更为强大的执(骚)行(操)力(作). 我们还是以上一个例子为例,这里的IStars接口和Stars类都不需要修改,只需要修改代理类. 创建JDK动态代理需要先实现InvocationHandler接口,并重写其中的invoke方法,具体步骤如下: 1. 创建一个类

【原创】JDK动态代理,此次之后,永生难忘。

动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不清楚来龙去脉,一两年是个坎,为什么是一两年,才入门的新人可能对这东西没什么感觉,没到这一步,做了很久开发的人显然是明白这其中原理的,而做了一两年的,知其然而不知其所以然,所以一两年工作经验的人很多是很茫然的. 那么,这里就相对比较比较深入一点的介绍JDK动态代理的原理.这样子介绍完,明白了其中的道理

动态代理在WEB与JDBC开发中的应用

WEB案例 目前有一个2005年开始,基于Struts1的Web项目A,其验证部分依赖于主站的SSO(单点登录).在请求站点A的时候,用户会被强制带去做SSO验证,通过身份验证后后,主站会自动地把请求转发至A站点,并在request header中添加了用于保存登录用户ID的新属性SM_USER,然后A站点根据用户ID提供相应的服务.由于该项目是一个既存项目,所以其中残余大量像下面一样的测试代码. [java] view plain copy String user_id = request.g

动态代理在WEB与JDBC开发中的应用(JDBC篇)

背景描述 如果之前看过<动态代理在WEB与JDBC开发中的应用(WEB篇)>,这篇的内容可以全当是另一种应用的进阶举例,而在实现上确实没有太多进步的地方.我们先看一下项目所面临问题以及期望解决方案.在作者所接触的这个项目中,直接使用原始JDBC技术,java.sql.PreparedStatement和java.sql.ResultSet几乎占领了数据访问层,没有半点OR Mapping的迹象,看起来是不是很悲催?命啊-在项目开发至一半的时候,突然发现要对日文字符进行支持,而在之前一直使用英文

java动态代理之CGLIB实现

动态代理(CGlib 与连接池的案例) Cglib代理: 针对类来实现代理,对指定目标 产生一个子类 通过方法拦截技术拦截所有父类方法的调用. 我们要使用cglib代理必须引入 cglib的jar包 <dependencies> <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency> <groupId>cglib</groupId> <artifactId&g

Java中动态代理技术生成的类与原始类的区别 (转)

用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等. 这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我

JDK,cglib动态代理-AOP学习

8.利用动态代理模式重构hibernate 动态代理模式: 1.产生的代理对象和目标对象实现了共同的接口 jdk动态代理 2.代理对象是目标对象的子类 hibernate: Person person = session.load(Person.class,1L);  javassisit spring:cglib动态代理 jdk的动态代理: 1.因为是用jdk的API做到的 2.代理对象是动态产生的 cglib产生的代理类是目标类的子类 注意事项: 1.拦截器中invoke方法体的内容就是代理