日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了如何使用Java定制注釋和Spring AOP設(shè)置屬性值?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我想使用定制的Java注釋在使用Spring AOP(和/或AspectJ)的私有類(lèi)屬性中插入值。快速示例:

MyAnnotation.java:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface MyAnnotation {
}

MyController.java:

public class MyControllerImpl implements MyController {

    ...
    
    @MyAnnotation
    private String var1;

    @Override
    public String getVarExample() {
       // imagine this is a REST API that gets called on @GET
       // request and returns a string

       System.out.println(this.var1); // <-- I'd like this to be "helloworld"
                                    // this is just for illustration
                                    // of course, I will want to do 
                                    // something more meaningful with
                                    // the 'var1' variable
       return "ok"; <- unimportant for this example
    }
    ...

MyAspect.java:

@Aspect
@Component
public class MyAspect {

    @Pointcut("@annotation(com.mypackage.annotation.MyAnnotation)")
    public void fieldAnnotatedWithMyAnnotation() {
        
    }

    @Around("fieldAnnotatedWithMyAnnotation()")
    public Object enrichVar1(ProceedingJoinPoint pjp) throws Throwable {
        
        // problem #1 - the program never enters here
        // problem #2 - I need to figure out how to set up the var1 here
        //              to "helloworld" , how?
        return pjp.proceed();
    }
    ...
}

我希望發(fā)生什么?

我將調(diào)用并進(jìn)入getVarExample(),在它返回后,我希望在控制臺(tái)或日志中看到&quot;HelloWorld&quot;。我想以某種方式使用AOP將var1設(shè)置為自定義值。將使用@MyAnnotation注釋的任何屬性變量都將設(shè)置為&quot;HelloWorld&quot;。我希望上面的例子是清楚的。

我嘗試了什么?

我確保包名稱(chēng)中沒(méi)有拼寫(xiě)錯(cuò)誤,還擺弄了不同的AOP建議注釋?zhuān)?code>@Around和@Before。我還嘗試了MyAnnotation中的不同目標(biāo),結(jié)果是ElementType.FIELD應(yīng)該是正確的。

您能幫助我使其正常工作嗎?

我知道這是可以做到的,但在網(wǎng)上找不到任何可用的示例。同樣,我希望看到兩個(gè)答案:

1.如何讓切入點(diǎn)在MyController入口觸發(fā)?我想在MyAspect類(lèi)的enrichVar1(..)方法內(nèi)捕獲斷點(diǎn)。

2.如何修改MyAspect類(lèi)的enrichVar1(..)方法中帶注釋的var1值?

我不知道我做錯(cuò)了什么。任何幫助都將不勝感激。謝謝!

在我的項(xiàng)目中正確設(shè)置了AOP。我之所以知道這一點(diǎn),是因?yàn)槲乙呀?jīng)將AOP用于不同的事情(例如日志記錄)。

更新#1:

請(qǐng)注意,var1私有變量沒(méi)有g(shù)etter或setter。該變量將僅在MyControllerImpl中使用。為了更好地說(shuō)明這一點(diǎn),我更改了getVarExample的返回值。

推薦答案

如我在評(píng)論中所說(shuō):

切入點(diǎn)指示符@annotation()攔截帶注釋的方法,而不是帶注釋的字段。為此,本機(jī)AspectJ有get()set()。也就是說(shuō),如果遷移到AspectJ,切入點(diǎn)也需要更改。但我同意,堅(jiān)持使用Spring AOP并注釋getter方法而不是字段在這里可能就足夠了。

但是因?yàn)槟鷪?jiān)持要保持控制器類(lèi)不變,所以這里是本機(jī)AspectJ解決方案。請(qǐng)閱讀Using AspectJ with Spring Applications一章,了解如何使用@EnableLoadTimeWeaving和JVM參數(shù)-javaagent:/path/to/aspectjweaver.jar進(jìn)行配置。

為了證明該解決方案確實(shí)獨(dú)立于Spring工作,我根本沒(méi)有使用Spring類(lèi)或注釋?zhuān)皇褂昧薖OJO和本機(jī)AspectJ。您只需在您的Spring應(yīng)用程序中執(zhí)行相同的操作。請(qǐng)注意,與Spring AOP方面相比,本機(jī)AspectJ方面不需要@Component注釋。

package de.scrum_master.app;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface MyAnnotation {}
package de.scrum_master.app;

public interface MyController {
  String getVarExample();
}
package de.scrum_master.app;

public class MyControllerImpl implements MyController {
  @MyAnnotation
  private String var1;

  @Override
  public String getVarExample() {
    System.out.println(this.var1);
    return "ok";
  }
}
package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    MyController myController = new MyControllerImpl();
    myController.getVarExample();
  }
}
package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

  @Pointcut("get(@de.scrum_master.app.MyAnnotation * *)")
  public void fieldAnnotatedWithMyAnnotation() {}

  @Around("fieldAnnotatedWithMyAnnotation()")
  public Object enrichVar1(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println(pjp);
    return "helloworld";
  }
}

運(yùn)行Application時(shí),控制臺(tái)日志為:

get(String de.scrum_master.app.MyControllerImpl.var1)
helloworld

AspectJ手冊(cè)解釋field get and set join point signatures和field patterns的語(yǔ)法。


注意:我認(rèn)為您的用例可能是黑客設(shè)計(jì),而不是有效的應(yīng)用程序設(shè)計(jì)。您應(yīng)該重構(gòu)而不是侵入這樣的應(yīng)用程序。

這篇關(guān)于如何使用Java定制注釋和Spring AOP設(shè)置屬性值?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:Java Spring 如何使用 定制 屬性 注釋 設(shè)置
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定