Spring Autowiring class vs. interface?

autowired, dependency-injection, java, spring

Solution

Normally, both will work, you can autowire interfaces or classes.

There's probably an autoproxy generator somewhere in your context, which is wrapping your `boo` bean in a generated proxy object. This proxy object will implement `TheInterface`, but will not be a `TheClass`. When using autoproxies, you need to program to the interface, not the implementation.

The likely candidate is transactional proxies - are you using Spring transactions, using AspectJ or `@Transactional`?

Problem

I have this Spring config: ``` <bean id="boo" class="com.x.TheClass"/> ``` The class `TheClass` implements `TheInterface`. Then I have this (hypothetical) Java code: ``` @Autowired TheInterface x; @Autowired TheClass y; ``` The autowiring of `TheInterface` works but the autowiring of `TheClass` fails. Spring gives me a `NoSuchBeanDefinitionException` for the class. Why can you wire the interface and not the class?

Original source