最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring6代理模式和AOP示例詳解

 更新時(shí)間:2026年02月10日 08:58:14   作者:NE_STOP  
本文主要介紹了Spring框架中的JdbcTemplate、代理模式和面向切面編程(AOP)的概念、原理和實(shí)現(xiàn)方式,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

jdbcTemplate

jdbcTemplate是spring提供的一個(gè)jdbc模板類,是對(duì)jdbc的封裝。

當(dāng)然你也可以使用其他框架融入MyBatis、Hibernate。

GoF之代理模式

代理模式的作用

  1. 當(dāng)一個(gè)對(duì)象需要受到保護(hù)的時(shí)候,可以使用代理對(duì)象去完成某個(gè)行為。
  2. 需要給某個(gè)對(duì)象進(jìn)行功能增強(qiáng)的時(shí)候,可以找一個(gè)代理進(jìn)行增強(qiáng)。
  3. A對(duì)象和B對(duì)象無(wú)法直接交互時(shí),也可以使用代理模式來(lái)完成。

代理模式中的三個(gè)角色:

  1. 目標(biāo)對(duì)象
  2. 代理對(duì)象
  3. 目標(biāo)對(duì)象和代理對(duì)象的公共接口

如果使用代理模式的話,客戶端程序是無(wú)法察覺(jué)的,客戶端在使用代理對(duì)象的時(shí)候就像在使用目標(biāo)對(duì)象。

代理模式分為靜態(tài)代理和動(dòng)態(tài)代理。

靜態(tài)代理

目標(biāo)對(duì)象類:

// 目標(biāo)對(duì)象
public class OrderServiceImpl implements OrderService{
    @Override
    public void generateOrder() {
        System.out.println("生成訂單");
    }
    @Override
    public void modifyOrder() {
        System.out.println("修改訂單");
    }
    @Override
    public void detailOrder() {
        System.out.println("查看訂單詳情");
    }
}

代理對(duì)象類:

// 代理對(duì)象
public class OrderServiceProxy implements OrderService{
    // 代理對(duì)象中含有目標(biāo)對(duì)象的引用
    // 這里使用OrderService類型,因?yàn)樗詈隙鹊?
    private OrderService orderService;
    // 構(gòu)造方法傳入目標(biāo)對(duì)象
    public OrderServiceProxy(OrderService orderService) {
        this.orderService = orderService;
    }
    @Override
    public void generateOrder() {
        // 功能增強(qiáng):統(tǒng)計(jì)方法執(zhí)行時(shí)間
        long begin = System.currentTimeMillis();
        orderService.generateOrder();
        long end = System.currentTimeMillis();
        System.out.println("生成訂單耗時(shí):" + (end - begin) + "ms");
    }
    @Override
    public void modifyOrder() {
        long begin = System.currentTimeMillis();
        orderService.modifyOrder();
        long end = System.currentTimeMillis();
        System.out.println("修改訂單耗時(shí):" + (end - begin) + "ms");
    }
    @Override
    public void detailOrder() {
        long begin = System.currentTimeMillis();
        orderService.detailOrder();
        long end = System.currentTimeMillis();
        System.out.println("查看訂單詳情耗時(shí):" + (end - begin) + "ms");
    }
}

公共接口:

// 訂單服務(wù)接口
// 目標(biāo)對(duì)象和代理對(duì)象的公共接口
public interface OrderService {
    // 生成訂單
    void generateOrder();
    // 修改訂單
    void modifyOrder();
    // 查看訂單詳情
    void detailOrder();
}

測(cè)試:

// 實(shí)現(xiàn)目標(biāo)對(duì)象方法執(zhí)行時(shí)間的統(tǒng)計(jì)
public static void main(String[] args) {
    // 創(chuàng)建目標(biāo)對(duì)象
    OrderService orderService = new OrderServiceImpl();
    // 創(chuàng)建代理對(duì)象,同時(shí)將目標(biāo)對(duì)象傳入代理對(duì)象中
    OrderServiceProxy orderServiceProxy = new OrderServiceProxy(orderService);
    // 通過(guò)代理對(duì)象調(diào)用目標(biāo)對(duì)象的方法
    orderServiceProxy.generateOrder();
    orderServiceProxy.modifyOrder();
    orderServiceProxy.detailOrder();
}

靜態(tài)代理優(yōu)點(diǎn):1.解決了ocp問(wèn)題 2.采用代理模式的has a。降低了耦合度。

靜態(tài)代理的缺點(diǎn):假設(shè)系統(tǒng)中有上千個(gè)接口,每個(gè)接口都需要寫代理類,這樣類的數(shù)量會(huì)急劇膨脹,不好維護(hù)。

那怎么解決類爆炸的問(wèn)題呢?

采用動(dòng)態(tài)代理。 動(dòng)態(tài)代理還是代理模式,只不過(guò)是在內(nèi)存中為我們動(dòng)態(tài)的生成一個(gè)class字節(jié)碼,這個(gè)字節(jié)碼就是代理類。

動(dòng)態(tài)代理

在程序運(yùn)行階段,在內(nèi)存中動(dòng)態(tài)生成代理類,成為動(dòng)態(tài)代理。目的是減少代理類的數(shù)量。

常見(jiàn)的動(dòng)態(tài)代理技術(shù)有:JDK動(dòng)態(tài)代理(只能代理接口)、CGLIB動(dòng)態(tài)代理、Javassist動(dòng)態(tài)代理。

JDK動(dòng)態(tài)代理

公共接口 和目標(biāo)對(duì)象類引用 上面的代碼。Jdk動(dòng)態(tài)代理不需要寫代理類,jdk會(huì)在內(nèi)存中自動(dòng)生成代理類,因此直接在客戶端代碼里直接調(diào)用:

客戶端代碼:

public class Client {
    public void main() {
        // 1. 創(chuàng)建目標(biāo)對(duì)象
        OrderService orderService = new OrderServiceImpl();
        // 2. 創(chuàng)建InvocationHandler對(duì)象

        // 3. 創(chuàng)建代理對(duì)象
        //    1. Proxy.newProxyInstance 的作用是創(chuàng)建代理對(duì)象。其實(shí)做了兩件事:
        //     1). 在內(nèi)存中動(dòng)態(tài)的構(gòu)建一個(gè)類,
        //     2). 這個(gè)類要實(shí)現(xiàn)接口, 這個(gè)接口就是目標(biāo)對(duì)象的接口,并且new了一個(gè)對(duì)象
        //  2. 這個(gè)方法的三個(gè)參數(shù):
        //    1). ClassLoader: 類加載器, 用于加載內(nèi)存中的代理對(duì)象類. 和目標(biāo)對(duì)象使用相同的類加載器
        //   2). Class[]: 字節(jié)碼數(shù)組, 代理對(duì)象和目標(biāo)對(duì)象實(shí)現(xiàn)相同的接口. 用于讓代理對(duì)象和目標(biāo)對(duì)象具有相同的方法
        //  3). InvocationHandler: 調(diào)用處理器對(duì)象,他是一個(gè)接口, 這個(gè)調(diào)用處理器用于編寫增強(qiáng)代碼
        OrderService o = (OrderService)Proxy.newProxyInstance(OrderService.class.getClassLoader(), 			                                                 orderService.getClass().getInterfaces(), 
                            new TimerInvocationHandler(orderService));
        // 4. 通過(guò)代理對(duì)象調(diào)用方法
        // 調(diào)用代理對(duì)象的代理方法時(shí),如果代理方法的作用是功能增強(qiáng),那目標(biāo)對(duì)象的目標(biāo)方法必須執(zhí)行。
        o.generateOrder();
    }
}

調(diào)用處理器類:

/**
 * 負(fù)責(zé)計(jì)時(shí)的一個(gè)調(diào)用處理器類
 * 在這個(gè)調(diào)用處理器中編寫增強(qiáng)代碼
 * 這個(gè)調(diào)用處理器只需要一個(gè)就好
 */
public class TimerInvocationHandler implements InvocationHandler {
    // 目標(biāo)對(duì)象,就是要被增強(qiáng)的對(duì)象
    private Object target;
	// 構(gòu)造方法傳入目標(biāo)對(duì)象
    public TimerInvocationHandler(Object target) {
            this.target = target;
    }
    // 這個(gè)方法必須是invoke()方法,因?yàn)閖dk在底層會(huì)調(diào)用這個(gè)方法
    // 這個(gè)方法什么時(shí)候調(diào)用?
    //    什么時(shí)候通過(guò)代理對(duì)象調(diào)用方法的時(shí)候就會(huì)調(diào)用這個(gè)invoke()方法
    // 這個(gè)方法的參數(shù):
    //    proxy: 代理對(duì)象,就是通過(guò)Proxy.newProxyInstance()方法創(chuàng)建的代理對(duì)象
    //    method: 目標(biāo)對(duì)象的目標(biāo)方法,這就是要執(zhí)行的目標(biāo)方法
    //    args: 目標(biāo)方法上的參數(shù)
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 功能增強(qiáng):
        Long begin = System.currentTimeMillis();
        Object invoke = method.invoke(target, args);
        Long end = System.currentTimeMillis();
        System.out.println("方法執(zhí)行耗時(shí):" + (end - begin) + "ms");
        return invoke;
    }
}

CGLIB動(dòng)態(tài)代理

既可以代理接口,也可以代理類。底層采用繼承的方式實(shí)現(xiàn),因此被代理的目標(biāo)類不能被final修飾

目標(biāo)類:

// 目標(biāo)類
public class UserService {
    public boolean login(String username, String password) {
        System.out.println("用戶登錄,用戶名:" + username + ",密碼:" + password);
        return "admin".equals(username) && "123456".equals(password);
    }
    public void logout(String username) {
        System.out.println("用戶退出登錄,用戶名:" + username);
    }
}

客戶端代碼:

public static void main(String[] args) {
    // 創(chuàng)建字節(jié)碼增強(qiáng)對(duì)象
    // 這個(gè)對(duì)象是cglib的核心對(duì)象,依靠它來(lái)生成代理類
    Enhancer enhancer = new Enhancer();
    // 設(shè)置父類,也就是目標(biāo)類
    enhancer.setSuperclass(UserService.class);
    // 設(shè)置回調(diào)函數(shù)(等同于jdk動(dòng)態(tài)代理的中的調(diào)用處理器)
    // 在cglib中是實(shí)現(xiàn)方法攔截器MethodInterceptor接口
    enhancer.setCallback(new TimerMethodInterceptor());
    UserService userServiceProxy = (UserService)enhancer.create();
    boolean login = userServiceProxy.login("admin", "123456");
    System.out.println(login?"登錄成功":"登錄失敗");
    userServiceProxy.logout("admin");
}

增強(qiáng)代碼寫在方法攔截器里面

public class TimerMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Long startTime = System.currentTimeMillis();
        Object o1 = methodProxy.invokeSuper(o, objects);
        Long endTime = System.currentTimeMillis();
        System.out.println("方法 " + method.getName() + " 執(zhí)行耗時(shí):" + (endTime - startTime) + "ms");
        return o1;
    }
}

注意:在jdk17環(huán)境下,cglib動(dòng)態(tài)代理功能啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),需要添加啟動(dòng)時(shí)參數(shù)設(shè)置:

vm 參數(shù):--add-opens java.base/java.lang=ALL-UNNAMED

program 參數(shù):--add-opens java.base/sun.net.util=ALL-UNNAMED

面向切面編程AOP

在一個(gè)系統(tǒng)中一般會(huì)有許多系統(tǒng)服務(wù),如:日志,事務(wù)管理、安全等。這些服務(wù)成為交叉業(yè)務(wù)。

這些交叉業(yè)務(wù)是通用的。

如果在每一個(gè)業(yè)務(wù)處理過(guò)程中,都摻雜這些交叉業(yè)務(wù)代碼會(huì)出現(xiàn)2個(gè)問(wèn)題:

  1. 交叉業(yè)務(wù)代碼在多個(gè)業(yè)務(wù)中反復(fù)出現(xiàn)。代碼沒(méi)有得到復(fù)用,修改這些代碼會(huì)非常困難。
  2. 開(kāi)發(fā)人員無(wú)法專業(yè)核心業(yè)務(wù)代碼,在編寫核心業(yè)務(wù)代碼時(shí)還要處理這些交叉業(yè)務(wù)代碼。

這就需要使用AOP來(lái)解決以上問(wèn)題。

總之,AOP就是將與核心業(yè)務(wù)無(wú)關(guān)的代碼獨(dú)立的抽取出來(lái)。形成一個(gè)獨(dú)立的組件,然后以橫向交叉的方式應(yīng)用到業(yè)務(wù)流程當(dāng)中的過(guò)程。

aop底層使用動(dòng)態(tài)代理技術(shù)實(shí)現(xiàn)。

spring AOP 使用的時(shí)jdk動(dòng)態(tài)代理+cglib動(dòng)態(tài)代理。spring 在這2種動(dòng)態(tài)代理種靈活切換。如果是代理接口,則使用jdk動(dòng)態(tài)代理,如果代理某個(gè)類,則使用cglib。當(dāng)然也可以手動(dòng)配置來(lái)強(qiáng)制使用cglib。

AOP的七大術(shù)語(yǔ)

連接點(diǎn)Joinpoint

在程序執(zhí)行流程中,可以織入切面的位置。方法的執(zhí)行前后,異常拋出之后等位置。

連接點(diǎn)描述的是位置。

切點(diǎn)Pointcut

在程序執(zhí)行流程中,真正織入切面的方法。(一個(gè)切點(diǎn)對(duì)應(yīng)多個(gè)連接點(diǎn))

切點(diǎn)描述的是方法。

通知Advice

通知又叫增強(qiáng),就是具體你要織入的的代碼。

通知包括:前置通知、后置通知、環(huán)繞通知、異常通知、最終通知。

通知描述的是代碼。

切面Aspect

切點(diǎn)+通知就是切面。

織入Weaving

把通知應(yīng)用到目標(biāo)對(duì)象上的過(guò)程。

代理對(duì)象Proxy

一個(gè)目標(biāo)對(duì)象被織入通知后產(chǎn)生的新對(duì)象。

目標(biāo)對(duì)象Target

被織入通知的對(duì)象。

public void main(String[] args) {
    try {
        // Joint point  連接點(diǎn)
        do1(); // Pointcut 切點(diǎn)
        // Joint point  連接點(diǎn)
        do2();// Pointcut 切點(diǎn)
        // Joint point  連接點(diǎn)
        do3();// Pointcut 切點(diǎn)
        // Joint point  連接點(diǎn)
        do4();// Pointcut 切點(diǎn)
        // Joint point  連接點(diǎn)
        do5();// Pointcut 切點(diǎn)
        // Joint point  連接點(diǎn)
    } catch (Exception e) {
        // Joint point  連接點(diǎn)
    }
}

切點(diǎn)表達(dá)式

切點(diǎn)表達(dá)式用來(lái)定義通知(Advice)往哪些方法上切入

使用Spring的AOP

Spring對(duì)AOP的實(shí)現(xiàn)包括三種方式:

  1. Spring結(jié)合AspectJ框架實(shí)現(xiàn)的AOP,基于注解方式
  2. Spring結(jié)合AspectJ框架實(shí)現(xiàn)的AOP,基于XML方式
  3. spring自己實(shí)現(xiàn)的AOP,基于xml配置方式

常用的是前2種方式。

準(zhǔn)備工作

? 引入依賴

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.0.4</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>6.0.4</version>
</dependency>

引入命名空間(context和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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" >
<!--    組件掃描-->
    <context:component-scan base-package="com.ali.service" />
<!--    開(kāi)啟aspectj自動(dòng)代理,spring容器在掃描類的時(shí)候,會(huì)查看類上是否有@Aspect注解
        如果有。就給這個(gè)類生成代理對(duì)象 。
        proxy-target-class="true" 表示強(qiáng)制使用cglib動(dòng)態(tài)代理
        proxy-target-class="false" 默認(rèn)值,表示接口使用jdk動(dòng)態(tài)代理,反之使用cglib動(dòng)態(tài)代理-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

編寫目標(biāo)類

// 目標(biāo)類
@Service
public class UserService {
    // 目標(biāo)方法
    public void login() {
        System.out.println("UserService login....");
    }
}

編寫切面類

// 切面類,需要@Aspect 標(biāo)注
@Aspect
@Component("logAspect")
public class LogAspect {
    // 切面 = 通知+切點(diǎn)
    // 通知就是增強(qiáng),就是具體要編寫的增強(qiáng)代碼
    // 這里通知以方法的形式出現(xiàn)。
    // @Before 標(biāo)注的方法就是一個(gè)前置通知
    @Before("execution(* com.ali.service.UserService.*(..))")
    public void advice( ) {
        System.out.println("這是一個(gè)前置通知,方法執(zhí)行前執(zhí)行....");
    }
    // 環(huán)繞通知是最大的通知,在前置通知之前,在后置通知之后
    @Around("execution(* com.ali.service.UserService.*(..))")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around start");
        // 執(zhí)行目標(biāo)方法
        joinPoint.proceed();
        System.out.println("around end");
    }
}

測(cè)試代碼:

@Test
public void test() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    UserService userService = context.getBean("userService", UserService.class);
    userService.login();
}

注意:當(dāng)有多個(gè)切面類時(shí),可以使用@Order()注解進(jìn)行優(yōu)先級(jí)排序,數(shù)字越小,優(yōu)先級(jí)越高,就先執(zhí)行。比如:@Order(2) 比@Order(3) 先執(zhí)行。

在每個(gè)方法上都寫一遍切點(diǎn)表達(dá)式很麻煩,可以定義一個(gè)通用的切點(diǎn)表達(dá)式,然后在方法上使用這個(gè)通用的表達(dá)式即可。

// 定義通用的切點(diǎn)表達(dá)式,后續(xù)通知直接使用方法名來(lái)引用切點(diǎn)表達(dá)式
// 切點(diǎn)就是一個(gè)表達(dá)式,定義了在哪些連接點(diǎn)上執(zhí)行通知
@Pointcut("execution(* com.ali.service.UserService.*(..))")
public void commmonPointcut() {
    // 這個(gè)方法只是一個(gè)標(biāo)識(shí),方法體不需要編寫任何代碼
}
@AfterReturning("commmonPointcut()")
public void afterAdvice( ) {
    System.out.println("這是一個(gè)前置通知,方法執(zhí)行前執(zhí)行....");
}

JoinPoint的使用

通知方法可以加入?yún)?shù)JoinPoint,這個(gè)是spring容器自動(dòng)傳入的。

@Before("execution(* com.ali.service.UserService.*(..))")
public void advice(JoinPoint joinPoint) {
    System.out.println("這是一個(gè)前置通知,方法執(zhí)行前執(zhí)行....");
    // 使用JoinPoint對(duì)象獲取連接點(diǎn)的信息
    // joinPoint.getSignature() 獲取連接點(diǎn)的方法簽名
    // 通過(guò)方法簽名可以獲取到這個(gè)方法的具體信息
    // 獲取方法名
    String methodName = joinPoint.getSignature().getName();
    System.out.println("正在執(zhí)行的方法是:" + methodName);
}

到此這篇關(guān)于spring6代理模式和AOP的文章就介紹到這了,更多相關(guān)spring6代理模式和AOP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA中JDK是1.8但Java版本只有21和17的解決辦法

    IDEA中JDK是1.8但Java版本只有21和17的解決辦法

    JDK 1.8(Java Development Kit 1.8)是Java平臺(tái)的一個(gè)版本,它包含了用于開(kāi)發(fā)和運(yùn)行Java應(yīng)用程序的工具和庫(kù),下面這篇文章主要給大家介紹了關(guān)于IDEA中JDK是1.8但Java版本只有21和17的解決辦法,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問(wèn)題

    關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問(wèn)題

    這篇文章主要介紹了關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Spring中filter過(guò)濾器的定義方法

    Spring中filter過(guò)濾器的定義方法

    這篇文章主要介紹了Spring中filter過(guò)濾器的定義方法,Filter 程序是一個(gè)實(shí)現(xiàn)了特殊接口的 Java 類,與 Servlet 類似,也是由 Servlet 容器進(jìn)行調(diào)用和執(zhí)行的,需要的朋友可以參考下
    2023-08-08
  • Intellij?IDEA創(chuàng)建web項(xiàng)目的超詳細(xì)步驟記錄

    Intellij?IDEA創(chuàng)建web項(xiàng)目的超詳細(xì)步驟記錄

    如果剛開(kāi)始接觸IDEA,或者之前使用的是eclipse/myEclipse的話,即使是創(chuàng)建一個(gè)JAVA WEB項(xiàng)目,估計(jì)也讓很多人費(fèi)了好幾個(gè)小時(shí),下面這篇文章主要給大家介紹了關(guān)于Intellij?IDEA創(chuàng)建web項(xiàng)目的超詳細(xì)步驟,需要的朋友可以參考下
    2022-08-08
  • Spring Boot Maven插件使用詳解

    Spring Boot Maven插件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Boot Maven插件使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • IDEA?code?template配置和參數(shù)方式

    IDEA?code?template配置和參數(shù)方式

    這篇文章主要介紹了IDEA?code?template配置和參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教<BR>
    2024-01-01
  • Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄功能

    Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄功能

    Keycloak新的發(fā)行版命名為Quarkus,專為GraalVM和OpenJDK HotSpot量身定制的一個(gè)Kurbernetes Native Java框架,計(jì)劃2019年底正式發(fā)布。這篇文章主要介紹了Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄,需要的朋友可以參考下
    2019-10-10
  • 詳細(xì)解讀Druid數(shù)據(jù)庫(kù)連接池的使用

    詳細(xì)解讀Druid數(shù)據(jù)庫(kù)連接池的使用

    這篇文章主要介紹了Druid數(shù)據(jù)庫(kù)連接池的使用,數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè),需要的朋友可以參考下
    2023-03-03
  • java動(dòng)態(tài)獲取實(shí)體類字段的8種方法實(shí)現(xiàn)

    java動(dòng)態(tài)獲取實(shí)體類字段的8種方法實(shí)現(xiàn)

    本文介紹了Java中動(dòng)態(tài)獲取實(shí)體類字段的多種方法,包括反射API、注解處理器、字節(jié)碼操作庫(kù)、ORM框架等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-07-07
  • Spring中注解方式的異步請(qǐng)求

    Spring中注解方式的異步請(qǐng)求

    今天給大家整理了Spring中注解方式的異步請(qǐng)求的知識(shí)點(diǎn),對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

临汾市| 伊通| 额尔古纳市| 汉川市| 东平县| 华坪县| 泗水县| 盐津县| 普定县| 彭山县| 麻栗坡县| 湖北省| 墨竹工卡县| 金平| 偃师市| 镇雄县| 普格县| 高安市| 兴城市| 无锡市| 阿鲁科尔沁旗| 禄劝| 陆河县| 石家庄市| 内黄县| 赣榆县| 驻马店市| 比如县| 菏泽市| 绥阳县| 卫辉市| 铅山县| 云梦县| 清远市| 辽阳市| 仁寿县| 新平| 清水河县| 华蓥市| 甘洛县| 临潭县|