SpringAOP - 静态代理实践(下)

说明

昨天进行了两个方法的静态代理(方法抽象),那么更多方法的静态代理会是怎样呢

现在我们在昨天实践的基础上再进行一次静态代理,昨日实践链接:

Spring AOP - 静态代理实践

今日对应目录,所有操作对应以下操作进行:

下面我们开始今天的实践~

一、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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启扫描 -->
    <context:component-scan base-package="com.nenu"/>

</beans>

二、UserService接口和UserServiceImpl类

1.UserService接口:

package com.nenu.service;

public interface UserService {
    public void add();
    public void other();
}

  

2.UserServiceImpl类:

package com.nenu.service.impl;

import com.nenu.service.UserService;
import org.springframework.stereotype.Component;

@Component
public class UserServiceImpl implements UserService {

    @Override
    public void add() {
        System.out.println("UserServiceImpl add……");
    }

    @Override
    public void other() {
        System.out.println("UserServiceImpl other.....");
    }

    public UserServiceImpl(){}

}

三、server包(配置非核心业务)

1.ServerManager接口

package com.nenu.server;

public interface ServerManager {
    public void before();
    public void after();
}

2.TransactionManager类:

package com.nenu.server;

public class TransactionManager implements ServerManager{
    public void before(){
        System.out.println("TransactionManager Before");
    }
    public void after(){
        System.out.println("TransactionManager After");
    }
}

  

3.OtherManager类:

package com.nenu.server;

public class OtherManager implements ServerManager{
    public void before(){
        System.out.println("OtherManager Before......");
    }
    public void after(){
        System.out.println("OtherManager After......");
    }
}

四、配置代理(核心业务)

UserServiceStaticProxy类:

package com.nenu.proxy;

import com.nenu.server.ServerManager;
import com.nenu.service.UserService;

public class UserServiceStaticProxy implements UserService {
    //目标对象 - 代理谁
    private UserService target;

    //要加入记录增强,比如事物时间,加入事务控制
    private ServerManager serverManager;

    //通过构造方法来传入具体要代理的对象
    public UserServiceStaticProxy(UserService target, ServerManager serverManager){
        this.target = target;
        this.serverManager = serverManager;
    }

    @Override
    public void add() {
        //非核心业务1
        serverManager.before();
        //核心活,目标对象来做
        target.add();
        //非核心业务2
        serverManager.after();
    }

    @Override
    public void other() {
        //非核心业务1
        serverManager.before();
        //核心活,目标对象来做
        target.other();
        //非核心业务2
        serverManager.after();
    }
}

五、测试

1.ProxyTest类:

package com.nenu;

import com.nenu.proxy.UserServiceStaticProxy;
import com.nenu.server.OtherManager;
import com.nenu.server.ServerManager;
import com.nenu.server.TransactionManager;
import com.nenu.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProxyTest {
    @Test
    public void UserTest(){
        //1.配置容器
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.取出容器中bean
        UserService target =
                (UserService) applicationContext.getBean("userServiceImpl");

        //3.创建一个代理对象
        //3-1 创建非核心业务增强对象
        ServerManager serverManager1 = new TransactionManager();
        ServerManager serverManager2 = new OtherManager();
        //3-2 创建代理对象
        UserServiceStaticProxy proxy = new UserServiceStaticProxy(target, serverManager1);
        proxy = new UserServiceStaticProxy(proxy, serverManager2);

        //4.调用
        proxy.add();
        proxy.other();
    }
}

2.测试

如上图,在昨天的基础上OtherManager类的方法代理就添加成功了

成功!!!

原文地址:https://www.cnblogs.com/yangf428/p/12319394.html

时间: 2024-10-13 18:03:18

SpringAOP - 静态代理实践(下)的相关文章

SpringAOP之静态代理

一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务.  ⒉目的: ⑴.把核心业务和非核心业务进行分离 ⑵.把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次.) ⒊要求:只有当核心类中有多个业务需要进行处理的时候使用AOP较为合理,如果只有一个业务需要被处理那么就没有必要使用AOP了. 二.静态代理: 1.需要知道核心类

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

侃侃静态代理和动态代理

前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一个标记

实践出真知——基于squid实现正向代理实践

实践出真知--基于squid实现正向代理实践 前言 ? 俗话说得好:时间是治愈一切伤口的良药,实践是检验真理的唯一标准!本文将结合代理服务器的基本原理,进行基于squid软件实现传统(标准)代理(正向代理)以及透明代理的实例演示. 先说说squid是个啥 ? 避(kai)免(ge)被(wan)喷(xiao),还是介绍一下什么是squid吧. squid的概念 ? squid是一种用来缓存Internet数据的软件.用于接受来自客户端需要下载对象(object)的请求并适当的处理这些请求.也就是说

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

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

静态代理和动态代理

所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题运行详细的业务操作.而代理主题负责其它相关业务的处理. 系统中常常有这样的需求:在某些操作前须要进行验证操作,比方:在加入/删除操作时,先进性用户信息验证,确认该用户是否拥有这些操作的权限.代码例如以下: //UserManager接口: public interface UserManager { public void addUser(String username, String password); public void del

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理: 代理模式,是常用的设计模式.特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类.以及事后处理消息. 代理类和委托类,存在着关联关系.代理类的对象本身并不真正实现服务,知识通过调用委托类的对象的相关方法. 代理类可以分为两种:静态代理和动态代理. 静态代理: 代理类是由程序员创建,或由工具生成的代码 编译成的.在程序运行前,代理类的 *.class文件已经存在了.直接就可以运行 . 动态代理: 动态代理的代理类.没有直接由

静态代理$动态代理

什么是静态代理? 静态代理就是代理模式,给真实类做了个增强的方法 比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉... 就要用到增强方法,就在代理类中给你的方法增强 //静态代理模式public class Progects {/* @Test public void dd() {//真实代理 Subject jk=new Real(); //代理对象 Proxy hj=new Proxy(); //调度代理对象(jk)方法增强 hj.setSub

spring静态代理和动态代理

本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能或相同特征的属性抽象到一个层次分明的类结构体系中.随着软件规范的不断扩大,专业化分工越来越系列,以及OOP应用实践的不断增多,随之也暴露了一些OOP无法很好解决的问题. 现在假设系统中有三段完全相似的代码,这些代码通常会采用"复制"."粘贴"方式来完成,通过这种方式开发