簡體   English   中英

Spring CGLib代理-類變量變為空

[英]Spring CGLib proxy - class variables become null

我有一個過濾器服務,其服務通過方面進行了分析。 例如,如果有問題,我將給您一段代碼

    @Service
    public class FilterService extends AbstractService {
        private static final Logger log = LoggerFactory.getLogger(FilterService.class);

        @Autowired
        //Proxy to profiling class
        private FilterService self;

        private final ItemsRepository itemsRepository;
        private final Map<String, EnumFilter> enumFilters;

        public FilterService(ReadWriteLock readWriteLock,
                             ItemsRepository itemsRepository,
                             CategoryRepository categoryRepository, ItemsMapper itemsMapper,
                             CharacteristicsRepository characteristicsRepository,
                             List<EnumFilter> enumFilters) {
            super(readWriteLock.readLock());
            this.itemsRepository = itemsRepository;
            this.enumFilters = enumFilters.stream().collect(Collectors.toMap(EnumFilter::getId, y -> y));
        }

        @Profileable
        public ItemsViewShared filterItems(@Nullable String categoryId,
                                           @NotNull Set<String> ids,
                                           @NotNull Lang lang,
                                           @NotNull SortType sortType,
                                           @NotNull FilterInfo filterInfo) {
            try {
                this.readLock.lock();
                final ItemsViewShared itemsViewResponse = new ItemsViewShared(); //in this line inspector show this = FilterService

                List<Filter> allFilters = self.initNonSpecificFilters(lang, filterInfo); //problem is here
      //some code...

    @Profileable
    private List<Filter> initNonSpecificFilters(@NotNull Lang lang, @NotNull FilterInfo filterInfo) {
        final List<NumericFilter> allNumericNonSpecific = NumericFilter.getAllNonSpecific(lang, filterInfo);

       //in this line enumFilters - null
        final List<EnumOptionFilter> allEnumNonSpecific = enumFilters.values().stream()
                .flatMap(x -> x.getAllOptions(lang, filterInfo).stream())
                .collect(Collectors.toList());

據我所知,默認情況下,如果該類沒有使用至少一種方法繼承接口,則將使用CGlib代理,而Cglib通過繼承進行工作。
問題是這樣的:當我打電話的filterItems方法從控制器,調試器顯示了這種方法, - FilterService。
進一步地,在該方法中,引起了該類的另一種方法,該方法也應該被剖析。 為了使代理工作,我需要自動接線。 從那以后,我通過self.initNonSpecificFilters並在調試,我已經看到, 這個叫我的方法- FilterService $$ EnhancerBySpringCGLIB和我所有的變量在我的課是空的,所以我得到空指針異常。

如果CGLIb似乎通過繼承起作用,為什么會這樣呢? 以及為什么在第一個方法(filterItems)中是一個沒有CGlib的類,但是當您從中調用另一個方法(filterItems-> initNotSpecificFilters)時,已經出現了cglib。

問題是動態代理,無論是JDK接口代理還是CGLIB類代理,都只能繼承

  • 公共方法(JDK,CGLIB)或
  • 受保護的和程序包作用域的方法(僅CGLIB)。

此外,代理不繼承任何實例變量值,因為這不是它們的目的,它們僅包裝方法並調用原始值,以及可能在方面建議或攔截器之前和之后。

現在您的情況如下:

  • 您的方法initNonSpecificFilters(..)是私有的。 即,如果您在self調用它,您實際上仍然會調用原始方法(因為它沒有包裝),但是代理的成員當然沒有值。

  • 順便說一句,該方法是私有的,這也是為什么如果您有針對它的切入點的話,Spring AOP方面也不會加入該方法的原因(與AspectJ會有所不同)。

Spring手冊中搜索“ 自我調用 ”一詞,該行為已得到很好的記錄。

解決您的問題的方法是將方法設為非私有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM