Spring Stereotype Annotations with Examples

Learn about spring bean stereotype annotations i.e. @Controller, @Component, @Repository and @Service, their real-life usages and examples.

spring boot logo

In Spring framework, the @Component, @Repository, @Service, and @Controller annotations are called stereotype annotations or meta-annotations. With these annotations in place and automatic component scanning enabled, Spring will automatically import the annotated classes as beans into the application context and inject them into dependencies.

1. Spring Stereotype Annotations

Spring provides the following 4 annotations for marking the specific usages of beans. For each annotation, if we want to define the name of the bean with which they will be registered in the DI container, we can pass the name in the annotation attribute, e.g. @Service (“employeeService”).

1.1. @Component

The @Component annotation marks a Java class as a bean so the component-scanning mechanism can pick it up and pull it into the application context. To use this annotation, apply it over the class as below:

@Component
public class EmployeeDAOImpl implements EmployeeDAO {
    ...
}

1.2. @Repository

Although the above use of @Component is good enough but we can use a more suitable annotation that provides additional benefits specifically for DAOs i.e. @Repository annotation.

The @Repository annotation is a specialization of the @Component annotation with similar use and functionality. In addition to importing the DAOs into the DI container, it also makes the unchecked exceptions (thrown from DAO methods) eligible for translation into Spring DataAccessException.

@Repository
public class EmployeeDAOImpl implements EmployeeDAO {
    ...
}

1.3. @Service

The @Service annotation is also a specialization of component annotation. It doesn’t currently provide any additional behavior over the @Component annotation, but it’s a good idea to use @Service over @Component in service-layer classes because it specifies intent better.

Additionally, tool support and additional behavior might rely on it in the future.

@Service
public class EmployeeServiceImpl inplements EmployeeService {
   //... 
}

1.4. @Controller

@Controller annotation marks a class as a Spring Web MVC controller. It too is a @Component specialization, so beans marked with it are automatically imported into the DI container. When we add the @Controller annotation to a class, we can use another annotation i.e. @RequestMapping; to map URLs to instance methods of a class.

@Controller
public class UserMgmtController {

   //API handler methods
}

In realtime usages, we will face very rare situations where we will need to use @Component annotation. Most of the time, we will using @Repository@Service and @Controller annotations. @Component should be used when the class does not fall into either of three categories i.e. controller, manager and dao.

2. Component Scanning

The above four annotations will be scanned and configured only when they are scanned by DI container. To enable this scanning, we will need to use “context:component-scan” tag in our applicationContext.xml file.

<context:component-scan base-package="com.howtodoinjava.demo.service" />
<context:component-scan base-package="com.howtodoinjava.demo.dao" />
<context:component-scan base-package="com.howtodoinjava.demo.controller" />

The context:component-scan element requires a base-package attribute, which, as its name suggests, specifies a starting point for a recursive component search.

We may not want to give the top package for scanning to spring, so you should declare three component-scan elements, each with a base-package attribute pointing to a different package.

When component-scan is declared, you no longer need to declare context:annotation-config, because autowiring is implicitly enabled when component scanning is enabled.

3. Where to Place Stereotype Annotations?

As I already said that you use @Repository, @Service and @Controller annotations over DAO, manager and controller classes. But in real life, we often have separate classes and interfaces at DAO and manager layers. We use an Interface for defining the contract and classes for defining the implementations of contracts.

Where to use these annotations? Let’s find out.

Always use thespring streotype annotations over concrete classes; not over interfaces.

public interface EmployeeDAO
{
    //...
}
 
@Repository
public class EmployeeDAOImpl implements EmployeeDAO
{
    //...
}

Once you have these stereotype annotations on beans, you can directly use bean references defined inside other concrete classes. Note the references can be of type interfaces. Spring DI container is smart enough to inject the correct instance, in this case, using autowire by type.

An exception to this is to extend a Spring JPA-provided repository interface in which case we do not create the implementation class.

@Repository
public interface EmployeeRepository 
        extends PagingAndSortingRepository<EmployeeEntity, Long> {
 
}

4. Difference between @Component and @Bean Annotations

In Spring, @Component and @Bean. both annotations serve almost the same purpose still they are quite different.

  • @Component is used to auto-detect and auto-configure beans using classpath scanning. There’s an implicit one-to-one mapping between the annotated class and the bean (i.e. one bean per class).
  • @Bean is used to declare a single bean, rather than automatically letting Spring do it for us.

Another big difference is that @Component is a class-level annotation whereas @Bean is a method-level annotation and, by default, the name of the method serves as the bean name.

5. Conclusion

In this Spring tutorial, we learned what Spring stereotype annotations are. we learned these annotations are best used on concrete classes and not over the interface.

Happy Learning !!

Leave a Comment

  1. if we wont use these sterotype annotation then also i am getting the result, then how these stereotype annotation helpful for the java class?

    Reply
  2. what do you meant by unchecked exceptions (thrown from DAO methods) eligible for translation into Spring DataAccessException.

    What is the necessary to translate the unchecked exceptions to DataAccessException

    Reply
    • as long as the xml file is in the resources directory and its in your classpath you should not have nay issues. Hope that helps!

      Reply
  3. Hi Lokesh,

    Whenever i want to learn some concepts in simple way i search on google which opens lot of links and always search for your link to open.

    It’s due to the simplicity that you have maintained across all tutorials. Simply loved with these tutorial.

    Waiting for more tutorials.. Best luck.

    Thanks,
    Sunil

    Reply
  4. Hi,

    I have doubt with application-context.xml, if you are using annotations to wire then why we should use the context.getBean () to wire.

    Reply
  5. Can you explain the flow I mean how controller class autowire employeemanager class after that employeeDAO class.
    Is it autowired by type or what? I am little bit confuse here.
    kindly, expalin.

    Reply
  6. Thanks for the article.

    Can you guide me how to make it available service level classes to controller. In this example you simply declared @Autowired annotation for service bean in controller. But in real scenario(MVC) both the layers of service and controller are in two separate containers. How make service beans available to controller.

    Reply
  7. Why did You inject the interface , not concrete class ? e.g. EmployeeDAO dao is injected in EmployeeManager
    why don’t you inject the concrete class EmployeeDAOImpl ? it’s more reasonable and rational to do that
    i injected the concrete class and it gives me error

    Reply
    • Because there can be many implementations of EmployeeDAO when you have multiple datasources. You may inject any implementation to interface reference, but using concrete class would not allow you to change implementations. It’s just an example.

      Overall, it promotes “design by interface” which I also admire and use everywhere.

      Reply
      • If I have Two implementation of an interface, and I want a particular implementation to be autowired, how can I do that ?? Also the names that you passed in the annotation e.g. @Repository (“employeeDao”), has any relation with the interface name? or is it just a random string

        Reply
  8. A really good article. Something worth mentioning is that there is one exception to the interchangeability of these annotations. The Repository annotation confers special behavior to all beans it marks. The PersistenceExceptionTranslationPostProcessor automatically applies persistence exception translation to any bean marked with @Repository. I have post more about this here: https://readlearncode.com/spring-4/insights-from-stackoverflow-most-voted-for-spring-4-questions/#1.

    Reply
  9. Hi,

    Firstly, your blog is amazing! The articles are explained in such simple language with such detailed examples. I’ve been following your blog for a year now and it has definitely made me a better coder :) Keep up the good work!

    Coming to the point, I have a doubt here. What if for one EmployeeDao interface, there are 2 concrete classes implementing it (isn’t that the whole idea behind an interface?). How will the service layer understand which daoImpl to call?

    Reply
    • I can relate to above situation only when application interacts with two kind of data stores (e.g. excel and mysql), and the implementation classes have all together different logic for each method declared in interface. In that case – you will be selecting appropriate implementation based on some condition. You may take help of abstractroutingdatasource.

      Apart from above condition, I do not think why there will any other reason for two DAO implementations. I hope, I make sense.

      Reply
      • Hi Lokesh,
        I understand very easily.
        Thanks for providing online guide in simple manner.

        my suggestion is , can you please post the architecture of the project which you explained above.

        -Thank you

        Reply
  10. can I use @repository for a Service class??As all are @component type and just serve as marker to a class can we use these interchangeably?

    Reply
    • I will suggest to use @Repository for DAO classes and @Service for service class. Though they currently do not provide any major functionality benefit, but in future releases they may provide. In addition, they make code more readable and help identifying classes correctly – for their responsibilities.

      Reply
  11. Is there any use of EmployeeController class ?
    In the tutorial you are directly accessing bean of service level and calling dao, where does the controller come into picture ?

    Reply
  12. Shouldn’t EmployeeManager manager be marked with @Autowired in EmployeeController.class ?

    Great articles, love your teaching through simple examples way!

    Reply
  13. Perhaps @RestController annotation should also be mentioned for people using newer Spring versions. Awesome tutorial nevertheless!

    Reply
  14. howtodoinjava always gives simplified tutorials / explainations.
    Really helps & Easy to understand.
    Always thankful to Lokesh.

    Reply

Leave a Comment

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.