我有一个过滤器服务,其方法通过切面进行分析。我会给你一个代码片段作为例子,其中我遇到了一个问题。
@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方法时,在这个方法中调试器显示this-FilterService。在这个方法中,还会调用此类的另一个需要进行分析的方法。为了让代理工作,我需要进行自身自动装配。之后,我通过self.initNonSpecificFilters来调用我的方法,在调试器中我已经看到this-FilterService$$EnhancerBySpringCGLIB,而我类中的所有变量都是null,因此我得到空指针异常。
为什么如此,如果CGLib似乎通过继承工作?为什么第一个方法(filterItems)中的this是没有使用CGlib的类,但是当您从其中调用另一个方法(filterItems -> initNotSpecificFilters)时,cglib就出现了呢?