In Springs latest version, we can autowire a bean using annotation as @Autowired
. This will autowire the bean using its type(or constructor, if applied on it).
I was using bean name proxy which was messing up autowiring by name. @Resource didn't have that issue since it doesn't care about type. So now I know one reason for this recommendation by Spring developers :-) Just FYI
You can use:
@Autowired
@Qualifier("beanname")
According to the @Qualifier javadoc
This annotation may be used on a field or parameter as a qualifier for candidate beans when autowiring
If you want to define name of the bean with which they will be registered in DI container, you can pass the name in annotation itself e.g. @Service (“employeeManager”).
Then using below code you can enable autowire by Name
@Autowired
@Qualifier("employeeManager")
private EmployeeManagerService employeeManagerService;
You can use JSR-250 @Resource
for by-name bean autowiring, unless you need constructor injection or multi-parameter method injection.
From the docs:
If you intend to express annotation-driven injection by name, do not primarily use @Autowired, even if is technically capable of referring to a bean name through @Qualifier values. Instead, use the JSR-250 @Resource annotation, which is semantically defined to identify a specific target component by its unique name, with the declared type being irrelevant for the matching process.
Use @Component("beanname") in the java class definition of your bean
Then while autowiring use JSR 330
@Inject @Named(Value="beanname")