I looked deeply into the code, and realize why this is happening.
Code:
post_processors = [object for object in self.objects.values() if isinstance(object, ObjectPostProcessor)]
for obj_name, obj in self.objects.iteritems():
if not isinstance(obj, ObjectPostProcessor):
for post_processor in post_processors:
self.objects[obj_name] = post_processor.post_process_before_initialization(obj, obj_name)
for object in self.objects.values():
self._apply(object)
for obj_name, obj in self.objects.iteritems():
if not isinstance(obj, ObjectPostProcessor):
for post_processor in post_processors:
self.objects[obj_name] = post_processor.post_process_after_initialization(obj, obj_name)
If you'll notice, the post processors are fetched from self.objects, which are the instantiated objects. From there, they iterated over, and applied to all self.objects. Surprise, surprise: self.objects only contains cached objects, i.e. SINGLETON-scoped objects. PROTOTYPE-scoped objects never get stored in self.objects, but are instead created on the spot every time.
This isn't by design, except for this only working inside an ApplicationContext.