I have a bean:
First of all, the use of
or
enables Spring to scan your code for eligible beans to meet dependencies, which will greatly improve it's ability to wire them up correctly, so I suggest adding them to your context file.
Second, you should be aware that @Inject is a standard (meaning JSR-330 specification) annotation. It is okay to mix and match Spring annotations with standard ones, but behavior may vary when doing so. @Named is commonly paired with @Inject to match components with dependencies (both JSR-330). See this reference for details, and refer to Table 4.6 for usage comments.
But to directly answer your question, "why do I need a setter when not using component-scan", is because you are not using component-scan. You are asking Spring to inject a dependency "byType", but not allowing Spring to scan your code for components which are of that type. The reason the setter works is that the type of the setter argument being injected can be discovered by Spring in the compiled bytecode (i.e. meta-data), and so it successfully resolves your request.