日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

輕松上手Spring AOP,掌握切面編程的核心技巧

來(lái)源: 責(zé)編: 時(shí)間:2024-04-11 09:06:07 182觀看
導(dǎo)讀Spring框架是我們使用比較多的一個(gè)框架,而AOP又是Spring的核心特性之一,本篇文章將介紹一下AOP的切點(diǎn)表達(dá)式、通知等特性及如何使用Spring AOP。AOP 是什么AOP(Aspect-Oriented Programming,面向切面編程) 是一種編程范式,

Spring框架是我們使用比較多的一個(gè)框架,而AOP又是Spring的核心特性之一,本篇文章將介紹一下AOP的切點(diǎn)表達(dá)式、通知等特性及如何使用Spring AOP。PWl28資訊網(wǎng)——每日最新資訊28at.com

AOP 是什么

AOP(Aspect-Oriented Programming,面向切面編程) 是一種編程范式,旨在將橫切關(guān)注點(diǎn)與核心業(yè)務(wù)邏輯相分離,以提高代碼的模塊化性、可維護(hù)性和復(fù)用性。PWl28資訊網(wǎng)——每日最新資訊28at.com

在傳統(tǒng)的面向?qū)ο缶幊讨校绦虻墓δ鼙荒K化為類和方法,但某些功能可能會(huì)跨越多個(gè)類和方法,如日志記錄、事務(wù)管理、安全控制等,這些功能不屬于核心業(yè)務(wù)邏輯,但又必須在多個(gè)地方重復(fù)使用,導(dǎo)致代碼重復(fù)和耦合性增加。PWl28資訊網(wǎng)——每日最新資訊28at.com

AOP提供了一種機(jī)制,可以將這些橫切關(guān)注點(diǎn)單獨(dú)定義,并在需要的地方插入到應(yīng)用程序中,而不必修改核心業(yè)務(wù)邏輯。PWl28資訊網(wǎng)——每日最新資訊28at.com

AspectJ

AspectJ是一個(gè)面向切面的框架,它擴(kuò)展了Java語(yǔ)言。AspectJ定義了AOP(面向切面編程) 語(yǔ)法,并擁有一個(gè)專門(mén)的編譯器,用于生成遵守Java字節(jié)編碼規(guī)范的Class文件。PWl28資訊網(wǎng)——每日最新資訊28at.com

AspectJ可以單獨(dú)使用,也可以整合到其他框架中。當(dāng)單獨(dú)使用AspectJ時(shí),需要使用專門(mén)的編譯器ajc。AspectJ屬于靜態(tài)織入,通過(guò)修改代碼來(lái)實(shí)現(xiàn),包括編譯期織入等多種織入時(shí)機(jī)。PWl28資訊網(wǎng)——每日最新資訊28at.com

Spring集成AspectJ,可以在Spring中方便的使用AOP。PWl28資訊網(wǎng)——每日最新資訊28at.com

Spring AOP

Spring AOP核心概念主要包括以下幾個(gè)方面:PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. 切面(Aspect):切面是模塊化橫切關(guān)注點(diǎn)的機(jī)制,由切入點(diǎn)和通知組成。在Spring AOP中,一個(gè)切面可以定義在什么時(shí)候、什么地方以及如何應(yīng)用某種特定的行為到目標(biāo)對(duì)象上。
  2. 連接點(diǎn)(Joinpoint):連接點(diǎn)是程序執(zhí)行過(guò)程中的一個(gè)點(diǎn),例如方法的調(diào)用、字段的訪問(wèn)等。在Spring AOP中,一個(gè)連接點(diǎn)總是代表一個(gè)方法的執(zhí)行。連接點(diǎn)是AOP框架可以在其上 “織入” 切面的點(diǎn)。
  3. 通知(Advice):通知定義了在切入點(diǎn)執(zhí)行時(shí)要執(zhí)行的代碼,它是增強(qiáng)應(yīng)用到連接點(diǎn)上的行為。通知有多種類型,包括前置通知(Before Advice)、后置通知(After Advice) 、環(huán)繞通知(Around Advice) 、異常通知(After Throwing Advice) 和  返回通知(After Returning Advice)  。這些通知類型決定了增強(qiáng)在連接點(diǎn)上的執(zhí)行順序和方式。
  4. 切點(diǎn)(Pointcut):切點(diǎn)用于定義通知應(yīng)該應(yīng)用到哪些連接點(diǎn)上。它是一組連接點(diǎn)的集合,這些連接點(diǎn)共享相同的特性。切點(diǎn)表達(dá)式用于匹配連接點(diǎn),從而確定哪些連接點(diǎn)應(yīng)該接收通知。
  5. 目標(biāo)對(duì)象(Target Object) :被一個(gè)或多個(gè)切面所通知的對(duì)象。也被稱為被通知(advised)對(duì)象。由于Spring AOP是通過(guò)代理模式實(shí)現(xiàn)的,因此在運(yùn)行時(shí),目標(biāo)對(duì)象總是被代理對(duì)象所包裹。
  6. 織入(Weaving):織入是將切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建代理對(duì)象的過(guò)程。這是AOP框架在運(yùn)行時(shí)或編譯時(shí)完成的核心任務(wù)。
  7. AOP代理(AOP Proxy):AOP框架創(chuàng)建的對(duì)象,用于實(shí)現(xiàn)切面編程。在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或CGLIB代理。
  8. 引入(Introduction):用于向現(xiàn)有的類添加新的接口和實(shí)現(xiàn),而不需要修改原始類的代碼。Introduction允許在不修改現(xiàn)有類結(jié)構(gòu)的情況下,向類引入新的功能和行為。在 AspectJ 社區(qū)中,引入稱為類型間聲明(inter-type declaration)。

這些核心概念共同構(gòu)成了AOP的基礎(chǔ),使得我們能夠模塊化地處理橫切關(guān)注點(diǎn),從而提高代碼的可維護(hù)性和可重用性。PWl28資訊網(wǎng)——每日最新資訊28at.com

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

Pointcut 表達(dá)式 是用來(lái)定義切入點(diǎn)的規(guī)則,它決定了哪些連接點(diǎn)(方法調(diào)用或方法執(zhí)行)將會(huì)被通知所影響。在 Spring AOP 中,Pointcut 表達(dá)式通常由以下幾種規(guī)則和通配符組成:PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. execution(): 用于匹配方法執(zhí)行的連接點(diǎn),它是最常用的切點(diǎn)指示器。它基于方法簽名進(jìn)行匹配,可以指定方法的返回類型、包名、類名、方法名以及參數(shù)列表等。比如: @Pointcut("execution(* com.example.myapp.service.*.*(..))") 表示匹配com.example.myapp.service包下所有類的所有方法執(zhí)行。
  2. within(): 匹配指定類型內(nèi)的方法執(zhí)行連接點(diǎn)。它通常用于匹配特定包或類中的所有方法。示例:@Pointcut("within(com.example.myapp.service.*)") 表示表示匹配com.example.myapp.service包下所有類的所有方法的執(zhí)行。
  3. this(): 匹配當(dāng)前代理對(duì)象為指定類型的連接點(diǎn)。這用于限制切點(diǎn)只匹配特定類型的代理對(duì)象。示例:@Pointcut("this(com.example.myapp.service.MyService)") 表示匹配當(dāng)前代理對(duì)象類型為com.example.myapp.service.MyService的所有方法的執(zhí)行。
  4. target(): 匹配目標(biāo)對(duì)象為制定類型的連接點(diǎn)。與this()不同,target()是基于目標(biāo)對(duì)象類型,而不是代理類型。示例:@Pointcut("target(com.example.myapp.service.MyServiceImpl)") 表示匹配目標(biāo)對(duì)象類型為com.example.myapp.service.MyServiceImpl的所有方法的執(zhí)行。
  5. args(): 匹配方法執(zhí)行時(shí)參數(shù)為特定類型的連接點(diǎn)。示例:@Pointcut("args(java.io.Serializable)") 表示匹配方法執(zhí)行時(shí)至少有一個(gè)參數(shù)是java.io.Serializable類型的連接點(diǎn)。
  6. @annotation(): 匹配執(zhí)行的方法上帶有指定注解的連接點(diǎn)。示例:@Pointcut("@annotation(com.example.myapp.annotation.MyAnnotation)") 表示匹配執(zhí)行的方法上帶有com.example.myapp.annotation.MyAnnotation注解的連接點(diǎn)。
  7. @target:用于匹配所有帶有特定注解的類或接口。 這個(gè)指示器通常與execution表達(dá)式結(jié)合使用,以進(jìn)一步細(xì)化匹配條件。示例:@Pointcut("@target(com.example.annotation.MyAnnotation)") 表示匹配目標(biāo)對(duì)象類型上帶有com.example.myapp.annotation.MyAnnotation注解的方法執(zhí)行。
  8. @within:匹配指定類型帶有指定注解的連接點(diǎn)。與within()類似,但它是基于注解而不是包或類。示例: @Pointcut("@within(com.example.myapp.annotation.MyAnnotation)") 表示匹配帶有MyAnnotation注解的類的方法執(zhí)行。
  9. bean():匹配Spring容器中特定名稱的bean的方法的執(zhí)行。示例: @Pointcut("bean(myServiceImpl)") 表示匹配Spring容器中名稱為myServiceImplbean的方法的執(zhí)行。
  10. @args():用于限制匹配的方法的參數(shù)必須有指定的注解。

帶有 @ 符的切點(diǎn)表達(dá)式都是需要指定注解的連接點(diǎn)。PWl28資訊網(wǎng)——每日最新資訊28at.com

這些規(guī)則可以通過(guò)邏輯運(yùn)算符(如 &&、||、! )進(jìn)行組合,以實(shí)現(xiàn)更復(fù)雜的 Pointcut 匹配規(guī)則。我們可以根據(jù)自己的需求,靈活地使用這些規(guī)則來(lái)定義切入點(diǎn)表達(dá)式,實(shí)現(xiàn)對(duì)目標(biāo)方法的精確匹配和監(jiān)控。PWl28資訊網(wǎng)——每日最新資訊28at.com

execution()

execution() 表達(dá)式使用的比較多,最復(fù)雜的一個(gè)表達(dá)式,這里重點(diǎn)介紹一下。PWl28資訊網(wǎng)——每日最新資訊28at.com

語(yǔ)法結(jié)構(gòu)

execution() 表達(dá)式的語(yǔ)法結(jié)構(gòu)如下:PWl28資訊網(wǎng)——每日最新資訊28at.com

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

其中,各部分的含義如下:PWl28資訊網(wǎng)——每日最新資訊28at.com

  • modifiers-pattern: 方法的訪問(wèn)修飾符,如 public、protected 等,可以省略。
  • ret-type-pattern: 方法的返回類型,如 void、int 等。
  • declaring-type-pattern: 方法所屬的類的類型模式,可以使用通配符 * 匹配任意字符。
  • name-pattern: 方法的名稱模式,可以使用通配符 * 匹配任意字符。
  • param-pattern: 方法的參數(shù)模式,包括參數(shù)類型和個(gè)數(shù)。
  • throws-pattern: 方法拋出的異常類型。

示例

  • 所有公共方法的執(zhí)行
execution(public * *(..))
  • 名稱以 set 開(kāi)頭的所有方法的執(zhí)行
execution(* set*(..))
  • AccountService 接口定義的任何方法的執(zhí)行
execution(* com.xyz.service.AccountService.*(..))
  • service 包中定義的任何方法的執(zhí)行
execution(* com.xyz.service.*.*(..))
  • service 包或其子包之一中定義的任何方法的執(zhí)行
execution(* com.xyz.service..*.*(..))
  • 執(zhí)行指定類型參數(shù)的方法
execution(* com.example.service.MyService.myMethod(String, int))

注意事項(xiàng)

  • 在 execution() 表達(dá)式中,通配符 * 可以用來(lái)匹配任意字符或任意個(gè)數(shù)的字符。
  • 使用 execution() 表達(dá)式時(shí),需要注意合理地組織表達(dá)式,以確保精準(zhǔn)地匹配目標(biāo)方法。
  • 可以通過(guò)組合多個(gè)條件來(lái)更加靈活地定義切點(diǎn),例如同時(shí)匹配方法的訪問(wèn)修飾符、返回類型、類名、方法名等。

總的來(lái)說(shuō),execution() 方法提供了一種靈活且強(qiáng)大的方式來(lái)定義切點(diǎn)表達(dá)式,從而精確定位需要添加通知的目標(biāo)方法。PWl28資訊網(wǎng)——每日最新資訊28at.com

通知(Advice)類型

圖片圖片PWl28資訊網(wǎng)——每日最新資訊28at.com

在 Spring AOP 中,通知(Advice)是在切入點(diǎn)(Pointcut)上執(zhí)行的代碼。Spring 提供了幾種類型的通知,每種類型都對(duì)應(yīng)著在連接點(diǎn)執(zhí)行前、執(zhí)行后或拋出異常時(shí)執(zhí)行的不同代碼邏輯。這些通知對(duì)應(yīng)著不同的注解,常用的通知注解包括:PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. @Before: 在方法執(zhí)行之前執(zhí)行的通知。它有以下屬性:

value:要綁定的切點(diǎn)或者切點(diǎn)表達(dá)式。PWl28資訊網(wǎng)——每日最新資訊28at.com

argNames: 用于指定連接點(diǎn)表達(dá)式中方法參數(shù)的名稱,以便在通知方法中通過(guò)參數(shù)名來(lái)獲取方法參數(shù)的值。這樣可以在前置通知中訪問(wèn)和處理方法參數(shù)的具體數(shù)值。該屬性即使不指定也能獲取參數(shù)。PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. @AfterReturning: 在方法執(zhí)行成功返回結(jié)果后執(zhí)行的通知。它比 @Before注解多了2個(gè)屬性:

pointcut:作用和value屬性一樣,當(dāng)指定pointcut時(shí),會(huì)覆蓋value屬性的值。PWl28資訊網(wǎng)——每日最新資訊28at.com

returning:方法返回的結(jié)果將被綁定到此參數(shù)名,可以在通知中訪問(wèn)方法的返回值。PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. PWl28資訊網(wǎng)——每日最新資訊28at.com

    @AfterThrowing: 在方法拋出異常后執(zhí)行的通知。它的屬性前3個(gè)和 @AfterReturning注解一樣,多了1個(gè)屬性:PWl28資訊網(wǎng)——每日最新資訊28at.com

    PWl28資訊網(wǎng)——每日最新資訊28at.com

throwing:指定方法拋出的異常將被綁定到此參數(shù)名,可以在通知中訪問(wèn)方法拋出的異常。PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. PWl28資訊網(wǎng)——每日最新資訊28at.com

    @After: 在方法執(zhí)行后(無(wú)論成功或失敗)執(zhí)行的通知。屬性同 @Before 注解。PWl28資訊網(wǎng)——每日最新資訊28at.com

    PWl28資訊網(wǎng)——每日最新資訊28at.com

  2. PWl28資訊網(wǎng)——每日最新資訊28at.com

    @Around: 環(huán)繞通知,能夠在方法執(zhí)行前后都可以進(jìn)行操作,具有最大的靈活性。屬性同  @Before 注解。PWl28資訊網(wǎng)——每日最新資訊28at.com

    PWl28資訊網(wǎng)——每日最新資訊28at.com

通知的執(zhí)行順序?yàn)椋?nbsp;@Around  ->  @Before ->  @AfterReturning(不拋異常情況) 或者  @AfterThrowing(拋異常情況)  -> @AfterPWl28資訊網(wǎng)——每日最新資訊28at.com

這些通知注解可以與 Pointcut 表達(dá)式結(jié)合使用,實(shí)現(xiàn)對(duì)目標(biāo)方法的攔截和處理。通過(guò)選擇合適的通知類型,開(kāi)發(fā)者可以根據(jù)需求在不同的時(shí)間點(diǎn)插入自定義的邏輯,實(shí)現(xiàn)對(duì)方法調(diào)用的控制和增強(qiáng)。PWl28資訊網(wǎng)——每日最新資訊28at.com

如何使用

講了那么多概念性的東西,下面來(lái)看怎么使用Spring AOP。PWl28資訊網(wǎng)——每日最新資訊28at.com

在Spring 中使用AOP也很簡(jiǎn)單,主要分3步:PWl28資訊網(wǎng)——每日最新資訊28at.com

  1. 定義切面
  2. 定義切點(diǎn)
  3. 在具體通知上使用切點(diǎn)

準(zhǔn)備階段

我這里使用的是Springboot 3.1.5、jdk 17,如果是Springboot低版本的可能需要引入 spring-boot-starter-aop 依賴,高版本的AOP已經(jīng)包含在spring-boot-starter-web依賴中了:PWl28資訊網(wǎng)——每日最新資訊28at.com

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId></dependency>

Spring官網(wǎng)中介紹,使用Spring AOP要在啟動(dòng)類或者配置類中加上 @EnableAspectJAutoProxy 注解開(kāi)啟 AspectJ 注解的支持,在我使用的這個(gè)版本中并不需要,如果你的項(xiàng)目中切面未生效可以嘗試使用該注解。PWl28資訊網(wǎng)——每日最新資訊28at.com

定義一個(gè)接口,下面用于對(duì)這個(gè)接口及其實(shí)現(xiàn)類進(jìn)行攔截:PWl28資訊網(wǎng)——每日最新資訊28at.com

public interface AopService {    /**     * 兩數(shù)除法     * @param a     * @param b     * @return     */    BigDecimal divide(BigDecimal a, BigDecimal b);    /**     * 兩數(shù)加法     * @param a     * @param b     * @return     */    BigDecimal add(BigDecimal a, BigDecimal b);}
@Servicepublic class MyAopServiceImpl implements AopService{    /**     * 兩數(shù)除法     *     * @param a     * @param b     * @return     */    @Override    public BigDecimal divide(BigDecimal a, BigDecimal b) {        return a.divide(b , RoundingMode.UP);    }    /**     * 兩數(shù)加法     *     * @param a     * @param b     * @return     */    @Override    public BigDecimal add(BigDecimal a, BigDecimal b) {        return a.add(b);    }}

定義切面

新建一個(gè)類,在類上加上@Aspect 注解,標(biāo)記該類為切面。PWl28資訊網(wǎng)——每日最新資訊28at.com

@Component@Aspectpublic class AspectComponent {}

定義并使用切點(diǎn)

在切面中使用@Pointcut注解定義切點(diǎn)表達(dá)式,然后在通知注解中使用定義好的切點(diǎn)。在該示例中主要對(duì)AopService#divide()方法進(jìn)行攔截。PWl28資訊網(wǎng)——每日最新資訊28at.com

@Component@Aspectpublic class AspectComponent { /**     * 匹配AopService接口的divide方法     */    @Pointcut("execution(* site.suncodernote.aop.AopService.divide(..))")    void dividePointCut(){    } /**     * 匹配AopService接口的divide方法     */    @Pointcut("within(site.suncodernote.aop.AopService+)")    void withinPointCut(){    } /**     * 匹配AopService接口的add方法 或者 divide方法     */    @Pointcut("execution(* site.suncodernote.aop.AopService.add(..)) || execution(* site.suncodernote.aop.AopService.divide(..))")    void addOrDividePointCut(){    } @Before("dividePointCut()")    public void beforeDivide(JoinPoint joinPoint){        System.out.println("---------------------@Before----------------");        printJoinPoint(joinPoint);    }    @After("dividePointCut()")    public void afterDivide(JoinPoint joinPoint){        System.out.println("---------------------@After----------------");        printJoinPoint(joinPoint);    }    @AfterReturning(pointcut = "dividePointCut()" , returning = "result")    public void afterReturningDivide(JoinPoint joinPoint , BigDecimal result){        System.out.println("---------------------@AfterReturning----------------");        System.out.println("返回結(jié)果="+result);        printJoinPoint(joinPoint);    }    @AfterThrowing(pointcut = "dividePointCut()" , throwing = "e")    public void afterThrowingDivide(JoinPoint joinPoint ,Exception e){        System.out.println("---------------------@AfterThrowing----------------");        System.out.println("異常:"+e.getMessage());        printJoinPoint(joinPoint);    }    @Around("dividePointCut()")    public Object aroundDivide(ProceedingJoinPoint joinPoint) throws Throwable {        System.out.println("---------------------@Around----------------");        printJoinPoint(joinPoint);        Object[] args = joinPoint.getArgs();        Object result = null;        try {            //執(zhí)行方法            result = joinPoint.proceed(args);        } catch (Throwable throwable) {            throwable.printStackTrace();        }        System.out.println("返回值:"+result);        return result;    }    private void printJoinPoint(JoinPoint joinPoint){        Object[] args = joinPoint.getArgs();        Signature signature = joinPoint.getSignature();        System.out.println("方法名:"+signature.getName());        System.out.println("方法參數(shù):"+ Arrays.toString(args));        System.out.println();    }}

測(cè)試

寫(xiě)個(gè)簡(jiǎn)單的單元測(cè)試,調(diào)用AopService#divide()方法,然后看一下輸出結(jié)果。PWl28資訊網(wǎng)——每日最新資訊28at.com

@SpringBootTestpublic class AOPTest {    @Resource    private AopService aopService;    @Test    public void testAOP() {        BigDecimal a = new BigDecimal(1);        BigDecimal b = new BigDecimal(2);//        aopService.add(a, b);        aopService.divide(a, b);    }}

測(cè)試結(jié)果:PWl28資訊網(wǎng)——每日最新資訊28at.com

---------------------@Around----------------方法名:divide方法參數(shù):[1, 2]---------------------@Before----------------方法名:divide方法參數(shù):[1, 2]---------------------@AfterReturning----------------返回結(jié)果=1方法名:divide方法參數(shù):[1, 2]---------------------@After----------------方法名:divide方法參數(shù):[1, 2]返回值:1

從測(cè)試結(jié)果中通知執(zhí)行的順序是按照我們上面所說(shuō)的執(zhí)行順序執(zhí)行的。PWl28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

本文介紹了Spring AOP的常用的切點(diǎn)表達(dá)式、通知注解等,我們可以利用AOP對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高開(kāi)發(fā)的效率。PWl28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-82760-0.html輕松上手Spring AOP,掌握切面編程的核心技巧

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python新手必讀:掌握Bytearray對(duì)象的使用技巧

下一篇: Vue 3高級(jí)響應(yīng)式數(shù)據(jù)探秘:原理、用法詳解與實(shí)戰(zhàn)示例!

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來(lái)預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • 消息稱迪士尼要拍真人版《魔發(fā)奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實(shí)有點(diǎn)忙,忙著將不少動(dòng)畫(huà)改成真人版,繼《美人魚(yú)》后,真人版《白雪公主》、《魔發(fā)奇緣》也在路上了。據(jù)外媒消息稱,迪士尼將打造真人版
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時(shí)35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢(shì)領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過(guò)14.
  • 十個(gè)簡(jiǎn)單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)或類作為參數(shù),并返回一個(gè)新的函數(shù)或類。它們通常用
  • 一條抖音4億人圍觀 ! 這家MCN比無(wú)憂傳媒還野

    作者:Hiu 來(lái)源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽(yù)為&ldquo;純欲天花板&rdquo;的女網(wǎng)紅井川里予,近期因?yàn)橐唤M哥特風(fēng)照片登上熱搜,引發(fā)了一場(chǎng)互聯(lián)網(wǎng)世界關(guān)于
  • 當(dāng)家的盒馬,加速謀生

    來(lái)源 | 價(jià)值星球Planet作者 | 歸去來(lái)自己&ldquo;當(dāng)家&rdquo;的盒馬,開(kāi)始加速謀生了。據(jù)盒馬官微消息,盒馬計(jì)劃今年開(kāi)放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 年輕人的“職場(chǎng)羞恥感”,無(wú)處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來(lái)源:燃次元&ldquo;人在職場(chǎng),應(yīng)該選擇什么樣的著裝?&rdquo;近日,在網(wǎng)絡(luò)上,一個(gè)與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級(jí)寫(xiě)字樓亞洲金
  • 華為和江淮汽車合作開(kāi)發(fā)百萬(wàn)元問(wèn)界MPV?雙方回應(yīng)來(lái)了

    8月1日消息,郭明錤今天在社交平臺(tái)發(fā)文稱,華為正在和江淮汽車合作,開(kāi)發(fā)售價(jià)在100萬(wàn)元的問(wèn)界MPV,預(yù)計(jì)在2024年第2季度量產(chǎn),銷量目標(biāo)為上市首年交付5萬(wàn)輛。
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
Top 主站蜘蛛池模板: 蓬莱市| 出国| 承德县| 乃东县| 高邮市| 安仁县| 梓潼县| 襄樊市| 五原县| 沐川县| 杭锦旗| 罗甸县| 奉化市| 太谷县| 新乡市| 循化| 呼伦贝尔市| 高雄市| 平潭县| 镇雄县| 石家庄市| 来凤县| 仁化县| 德昌县| 滦南县| 阳原县| 鹤岗市| 和龙市| 常山县| 长丰县| 景宁| 长白| 驻马店市| 麻城市| 蓬莱市| 怀来县| 宜春市| 明光市| 陆丰市| 汾阳市| 福清市|