Spring @Repository Annotation Example

In this quick article, we will discuss how to use the Spring or Spring Boot @Repository annotation with an example.

Spring @Repository Overview

DAO or Repository classes usually represent the database access layer in an application and should be annotated with @Repository annotation.

As of Spring 2.5, this annotation also serves as a specialization of @Component, allowing for implementation classes to be autodetected through classpath scanning.

@Repository annotation internally annotated with @Component annotation as shown in the below diagram:

Whenever we annotated a class with @Repository annotation then Spring Container will automatically create a Spring bean for that class.

@Repository Annotation Example

Let's create a simple Spring boot application to bootstrap quickly. Add the below dependencies to your pom.xml file.

                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                    </dependency>
                    
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-data-jpa</artifactId>
                    </dependency>
                    

Create User JPA Entity

Let's create a simple User JPA entity that maps with the users table in the database:

@Entity
                        @Table(name = "users")
                        class User {
                        
                            @Id
                            @GeneratedValue(strategy = GenerationType.AUTO)
                            private int id;
                            private String name;
                        
                            public User(int id, String name) {
                                super();
                                this.id = id;
                                this.name = name;
                            }
                        
                            public User() {}
                        
                            public int getId() {
                                return id;
                            }
                        
                            public void setId(int id) {
                                this.id = id;
                            }
                        
                            public String getName() {
                                return name;
                            }
                        
                            public void setName(String name) {
                                this.name = name;
                            }
                        }
                        

Create UserRepository

Next, create a UserRepository interface and annotate with @Repository annotation:

@Repository
                            interface UserRepository extends JpaRepository < User, Integer > {
                            
                            }

Note Spring Data JPA automatically provides an implementation for the above interface.

Create UserService and UserServiceImpl

interface UserService {
                                public void saveUser(User user);
                            }
                            
                            @Service
                            class UserServiceImpl implements UserService {
                            
                                @Autowired
                                private UserRepository userRepository;
                            
                                @Override
                                public void saveUser(User user) {
                                    userRepository.save(user);
                                }
                            }

Testing

Let's write a code to test UserRepository to save user objects into database table:

@SpringBootApplication
                                public class DemoApplication {
                                
                                    public static void main(String[] args) {
                                        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
                                        UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
                                        userService.saveUser(new User(10, "Ramesh"));
                                    }
                                }

Here is the complete code for your reference:

import jakarta.persistence.*;

                                    import org.springframework.beans.factory.annotation.Autowired;
                                    import org.springframework.boot.SpringApplication;
                                    import org.springframework.boot.autoconfigure.SpringBootApplication;
                                    import org.springframework.context.ConfigurableApplicationContext;
                                    import org.springframework.data.jpa.repository.JpaRepository;
                                    import org.springframework.stereotype.Repository;
                                    import org.springframework.stereotype.Service;
                                    
                                    @SpringBootApplication
                                    public class DemoApplication {
                                    
                                        public static void main(String[] args) {
                                            ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
                                            UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
                                            userService.saveUser(new User(10, "Ramesh"));
                                        }
                                    }
                                    
                                    @Entity
                                    @Table
                                    class User {
                                    
                                        @Id
                                        @GeneratedValue(strategy = GenerationType.AUTO)
                                        private int id;
                                        private String name;
                                    
                                        public User(int id, String name) {
                                            super();
                                            this.id = id;
                                            this.name = name;
                                        }
                                    
                                        public User() {}
                                    
                                        public int getId() {
                                            return id;
                                        }
                                    
                                        public void setId(int id) {
                                            this.id = id;
                                        }
                                    
                                        public String getName() {
                                            return name;
                                        }
                                    
                                        public void setName(String name) {
                                            this.name = name;
                                        }
                                    }
                                    
                                    @Repository
                                    interface UserRepository extends JpaRepository < User, Integer > {
                                    
                                    }
                                    
                                    interface UserService {
                                        public void saveUser(User user);
                                    }
                                    
                                    @Service
                                    class UserServiceImpl implements UserService {
                                    
                                        @Autowired
                                        private UserRepository userRepository;
                                    
                                        @Override
                                        public void saveUser(User user) {
                                            userRepository.save(user);
                                        }
                                    }

Note that we have created ApplicationContext and retrieved bean using the getBean() method:

ConfigurableApplicationContext  applicationContext =  SpringApplication.run(DemoApplication.class, args);
            UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
            userService.saveUser(new User(10, "Ramesh"));

Usage of @Repository annotation in Spring Data JPA Repository

@Repository
                interface UserRepository extends JpaRepository < User, Integer > {
                
                }