当前位置:首页 > CN2资讯 > 正文内容

Spring代理

2天前CN2资讯


文章目录

  • ​​手动代理​​
  • ​​JDK动态代理​​
  • ​​目标类​​
  • ​​切面类​​
  • ​​工厂类​​
  • ​​测试​​
  • ​​cglib增强字节码​​
  • ​​目标类​​
  • ​​工厂类​​
  • ​​测试​​
  • ​​Spring半自动代理​​
  • ​​maven中配置相应jar包​​
  • ​​编写目标类和切面类​​
  • ​​Spring xml文件配置​​
  • ​​测试​​
  • ​​Spring AOP全自动编程​​
  • ​​maven中配置相应jar包​​
  • ​​编写目标类和切面类​​
  • ​​Spring xml文件配置​​
  • ​​测试​​

手动代理

JDK动态代理

目标类

package .service;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 11:58
**/
public interface IUserService {
public void addUser();
public void updateUser();
public void deleteUser();
}package .service;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 11:59
**/
public class UserServiceImpl implements IUserService {

@Override
public void addUser() {
System.out.println("添加用户");
}

@Override
public void updateUser() {
System.out.println("更新用户");
}

@Override
public void deleteUser() {
System.out.println("删除用户");
}
}

切面类

package .aspect;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 12:08
**/
public class MyAspect {
public void before(){
System.out.println("开启事务");
}
public void after(){
System.out.println("提交事务");
}
}

工厂类

package .service;

import .aspect.MyAspect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 12:13
**/
public class UserServiceBeanFactory {
public static IUserService createUserService(){
//目标类
final IUserService userService=new UserServiceImpl();
//切面类
final MyAspect aspect=new MyAspect();
//代理类 将目标类和切面类结合
/*
* public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
* 参数1,类加载器 一般写当前类
* 参数2,代理类所需要实现的接口
* 参数3,处理类 一般写匿名类*/
IUserService proxyService=(IUserService) Proxy.newProxyInstance(UserServiceBeanFactory.class.getClassLoader(), userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
aspect.before();
//放行
Object obj = method.invoke(userService, args);
aspect.after();
return obj;
}
});
return proxyService;
}
}

测试

@Test
public void test01(){
//jdk
IUserService userService = MyBeanFactory.createUserService();
userService.addUser();
}

cglib增强字节码

有接口无接口都可使用

目标类

public class StudentService {

public void addStudent() {
System.out.println("添加学生");
}


public void updateStudent() {
System.out.println("更新学生");
}


public void deleteStudent() {
System.out.println("删除用户");
}
}



### 切面类

```java
public class MyAspect {
public void before(){
System.out.println("开启事务");
}
public void after(){
System.out.println("提交事务");
}
}

工厂类

/**
* @Description: cglib实现代理(创建目标类的子类 通过继承的方式对目标类进行增强)
* @params: []
* @return: .service.IUserService
* @Author: LIANG
* @Date: 2021/4/26 21:18
*/
public static StudentService createStudentService(){
//目标类
StudentService studentService = new StudentService();
//切面类
MyAspect aspect = new MyAspect();
//创建增强对象
Enhancer enhancer = new Enhancer();
//设置父类 目标类
enhancer.setSuperclass(studentService.getClass());
//设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
aspect.before();
//放行
Object retObj = method.invoke(studentService, objects);
//methodProxy.invokeSuper(o,objects);
aspect.after();
return retObj;
}
});
StudentService serviceProxy= (StudentService) enhancer.create();
return serviceProxy;
}

测试

@Test
public void test02(){
//cglib
StudentService studentService = MyBeanFactory.createStudentService();
studentService.addStudent();
}

Spring半自动代理

maven中配置相应jar包

<!-- aop联盟-->
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
<!-- aop实现-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>

编写目标类和切面类

package .service;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 11:59
**/
public class UserServiceImpl implements IUserService {

@Override
public void addUser() {
System.out.println("添加用户");
}

@Override
public void updateUser() {
System.out.println("更新用户");
}

@Override
public void deleteUser() {
System.out.println("删除用户");
}
}package .aspect;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.stereotype.Component;

/**
* @program: Spring02
* @description
* @author: LIANG
* @create: 2021-04-26 12:08
**/
public class MyAspect01 implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
/**
* @Description: 拦截方法
* @params: [invocation]
* @return: java.lang.Object
* @Author: LIANG
* @Date: 2021/4/29 7:38
*/
System.out.println("开启事务");
//放行
Object retObj = invocation.proceed();
System.out.println("拦截");
System.out.println("结束事务");
return retObj;
}
}

Spring 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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<bean id="userService" ></bean>
<bean id="myAspect" ></bean>
<!-- 代理工厂-->
<bean id="serviceProxy" >
<!-- 配置接口 目标对象 切面类 -->

<!-- 如股只是一个接口 就写value 如果是多个接口就写list-->
<property name="interfaces" value=".service.IUserService"></property>
<property name="target" ref="userService"></property>
<property name="interceptorNames" value="myAspect"></property>
<!-- 默认情况下 Spring 的AOP生成的代理是jdk的Proxy实现的-->
<!-- 配置使用cglib生成代理 optimize 优化-->
<property name="optimize" value="true"></property>
</bean>

</beans>

测试

@Test
public void method01(){
//获取Spring容器中代理对象
ApplicationContext context = new ClassPathXmlApplicationContext("bean01.xml");
IUserService userService = (IUserService)context.getBean("serviceProxy");
userService.deleteUser();
}

Spring AOP全自动编程

maven中配置相应jar包

<!-- AOP全自动编程需要导入的aspectj.weaver-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>

编写目标类和切面类

同半自动编程

Spring xml文件配置

<!-- 全自动代理实现
添加aop约束
将切入点和通知结合

-->
<!-- proxy-target-class: true默认使用cglib实现代理-->
<aop:config proxy-target->
<!-- 切入点 事务配置和日志记录 -->
<!--expression: 表达式 每个servise方法前后都开启事务和关闭事务
execution(* .service.*.*(..)) 代表包内所有类(业务类)所有方法 (..)表示不同参数
-->
<aop:pointcut id="myPointcut" expression="execution(* .service.*.*(..))"/>
<!--通知关联切入点 通知可以理解为切面类-->
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointcut"></aop:advisor>

</aop:config>

测试

直接从容器中获取对象

@Test
public void method01(){
//获取Spring容器中代理对象
ApplicationContext context = new ClassPathXmlApplicationContext("bean01.xml");
IUserService userService = (IUserService)context.getBean("userService");
userService.deleteUser();
}


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24133.html

    分享给朋友:

    “Spring代理” 的相关文章

    IP地址可以是255吗?详解IP地址的定义、结构与未来发展趋势

    IP地址的定义与作用 IP地址是互联网协议(IP)中用于标识网络上设备的逻辑地址。它就像是互联网世界的“门牌号”,帮助数据包准确地找到目的地。没有IP地址,设备之间就无法相互识别和通信。无论是电脑、手机还是服务器,只要连接到网络,都会分配一个唯一的IP地址。它的存在让互联网的运作变得有序且高效。 I...

    如何在VPS上轻松部署和管理Telegram机器人 | 详细指南

    1.1 创建Telegram机器人 在Telegram上创建一个机器人非常简单。我们只需要与@BotFather进行对话。@BotFather是Telegram官方提供的机器人管理工具,专门用于创建和管理机器人。通过发送/newbot命令,我们可以开始创建自己的机器人。@BotFather会引导我们...

    搬瓦工最新优惠码分享,让你享受更多折扣

    在寻找优质VPS时,搬瓦工(BandwagonHost)绝对是一个热门的选择。为了让用户在购买过程中享受到更多优惠,现在分享一下搬瓦工最新的优惠码。 最新优惠码是BWHCGLUKKB,通过这个优惠码用户可以享受6.78%的循环优惠,这一优惠适用于搬瓦工全场的商品,无论是新购、续费还是升级服务,都能获...

    深入了解服务器的基本概念、分类、性能评估与优化策略

    1. 服务器的基本概念与功能 在现代计算环境中,服务器的角色不可或缺。我将服务器看作是一种高性能计算机,专门为客户机提供服务。它们是构建云计算和数据中心的核心设备。通过提供各种服务,如文件存储、数据处理和应用托管,服务器帮助企业高效运营,满足日益增长的技术需求。 服务器的特点非常明显,具有高性能、高...

    DC2:动画创作、网络安全与汽车文化的多重魅力探索

    DC2 可谓是一个充满魔力的词汇,它在不同的领域中有着不同的意义。这种多样性让它成为了动画爱好者、汽车迷,甚至网络安全专家的共同话题。我对这些含义的探索,给我带来了许多启发和乐趣,让我对这个小小的组合字母有了更深刻的理解。 首先,提到 DC2,许多人可能会想到 DC2 动画软件。这款软件不仅在手机动...

    全面解读SFTP教程:安全文件传输的最佳实践

    什么是SFTP? 在计算机网络世界里,SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议。它的主要用途是通过安全的方式在网络中传输数据。与传统的FTP(File Transfer Protocol)相比,SFTP引入了数据加密机制,这样一来,用户在传输文件...