"Welcome To Ashok IT" "Spring Boot and MicroServices" Topic : Spring Core Annotations Date : 03/09/2024 (Session - 15) _____________________________________________________________________________________________________________________________ Last Session ============ * We have completed the Java based configuration in Spring Application Development * We have used to some annotation in Java Based Configurations 1. @Configuration 2. @Bean 3. @Import Today Session ============== * @Configuration is used to mark the Java class as Configuration class. * If any Java Class marked as @Configuration such Java class will becomes automatically as spring bean. * @Bean is used to mark the Java Method as Spring Bean Definition. * @Import annotation is used to import configuration classes. Ex: @Import({DatabaseConfig.class,EmailConfig.class}) * @ImportResource annotation is used to importing the spring configuration file into Java based Configuration class. * @PropertySource is used to load the properties file into Spring container. * @Value is used to extract the value from properties file based on supplied key. Example Application on above annotations ========================================= User.java ========== package com.ashokit.spring.beans; public class User { private String username; private String password; //Defining the Constructors public User() { System.out.println("User Class public Non-Parameterized Constructor......"); } public User(String username,String password) { System.out.println("User class public Parameterized constructor...."); this.username = username; this.password = password; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } } Role.java ========= package com.ashokit.spring.beans; public class Role { private String roleName; private boolean permission; //Defining the constructor public Role() { System.out.println("Role Class Public Non-Parameterized Constructor....."); } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public boolean isPermission() { return permission; } public void setPermission(boolean permission) { this.permission = permission; } @Override public String toString() { return "Role [roleName=" + roleName + ", permission=" + permission + "]"; } } Address.java ============ package com.ashokit.spring.beans; public class Role { private String roleName; private boolean permission; //Defining the constructor public Role() { System.out.println("Role Class Public Non-Parameterized Constructor....."); } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public boolean isPermission() { return permission; } public void setPermission(boolean permission) { this.permission = permission; } @Override public String toString() { return "Role [roleName=" + roleName + ", permission=" + permission + "]"; } } ApplicationConfig.java ====================== package com.ashokit.spring.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.PropertySource; @Configuration //We are informing to container to recognize the property file @PropertySource(value = "configuration.properties") //Importing the Database Configuration class bean definition @Import({DatabaseConfig.class,EmailConfig.class}) //Importing the Spring configuration file into Java Based Configuration @ImportResource(locations = "spring.xml") public class ApplicationConfig { //The below annotation helpful for extracting the value from properties file @Value("${username}") private String username; @Value("${password}") private String password; //public non-parameterized constructor public ApplicationConfig() { System.out.println("ApplicationCOnfig::::::public constructor...."); } //The below method represents the one spring bean definition using constructor injection in spring configuration file /*@Bean public User userBean() { //using constructor of an User class User user = new User(username,password); //returning user object return user; } //The below method represents the one spring bean definition using setter injection in spring configuration file @Bean public Address addressBean() { //creating address object and setting the data using setter method Address add = new Address(); add.setCityName("Hyderabad"); add.setDoorNo("1-2-3"); add.setStreetName("Ameerpet"); //returning the address object return add; } @Bean public Role roleBean() { Role role = new Role(); role.setRoleName("HRADMIN"); role.setPermission(true); return role; }*/ } App.java ======== package com.ashokit; import java.util.Arrays; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.ashokit.spring.beans.Address; import com.ashokit.spring.beans.Role; import com.ashokit.spring.beans.User; import com.ashokit.spring.config.ApplicationConfig; public class App { public static void main( String[] args ){ //Activating the AnntationConfigApplicationContext container ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class); //Request the Spring Bean User userBean = context.getBean(User.class); User userBean1 = (User)context.getBean("user"); System.out.println("UserBean::::" + userBean); System.out.println("UserBean:::" + userBean.hashCode()); System.out.println("UserBean-1:::" + userBean1.hashCode()); Address addressBean = context.getBean(Address.class); System.out.println("AddressBean::::" + addressBean); Role roleBean = context.getBean(Role.class); System.out.println("RoleBean::::" + roleBean); String[] beanDefinitionNames = context.getBeanDefinitionNames(); Arrays.stream(beanDefinitionNames).forEach(System.out::println); } } configuration.properties ======================== #UserBean username & Password Configuration username=mahesh password=mahesh@123 dbUsername=system dbPassword=manager databaseUrl=jdbc:oracle:thin:@localhost:1521:xe driverUrl=oracle.jdbc.driver.OracleDriver DatabaseConfig.java =================== package com.ashokit.spring.config; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; //This configuration class is used to configure the Database configuration @Configuration public class DatabaseConfig { @Value("${dbUsername}") private String dbUsername; @Value("${dbPasssword}") private String dbPassword; @Value("${databaseUrl}") private String databaseUrl; @Value("${driverUrl}") private String driverUrl; @Bean public DataSource getConnection() { DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName(driverUrl); ds.setUrl(databaseUrl); ds.setUsername(dbUsername); ds.setPassword(dbPassword); return ds; } } spring.xml ========== EmailConfig.java ================ package com.ashokit.spring.config; import org.springframework.context.annotation.Configuration; @Configuration public class EmailConfig { } pom.xml ======= org.springframework spring-jdbc 5.3.27 OUTPUT ====== ApplicationCOnfig::::::public constructor.... Address Class public Non-Parameterized constructor.... Role Class Public Non-Parameterized Constructor..... User Class public Non-Parameterized Constructor...... User Class public Non-Parameterized Constructor...... UserBean::::User [username=Mahesh, password=Mahesh121] UserBean:::1336777650 UserBean-1:::1367165453 AddressBean::::Address [doorNo=1-2-3, streetName=XYZ, cityName=Hyderabad] RoleBean::::Role [roleName=HRADMIN, permission=true] org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory applicationConfig com.ashokit.spring.config.DatabaseConfig getConnection com.ashokit.spring.config.EmailConfig user myAddress myRole1 Autowiring through Annotation ============================= * Autowiring >> Reducing the XML Configuration in Spring Application Injecting the dependencies implictly with out any XML configuration It can be applicable only for "Dependency in the form of objects" properties Autowiring strategies are no,byName,byType,Constructor We can achieve autowiring concept using xml Approach and Annotation Approach We already completed xml approach now we are going to explore on Annotation Approach * If we need to work with Autowiring using Annotations the spring provided @Autowired annotation @Autowired Annotation >> Field level, Setter method, Constructor * Most in the project development we are always prefer to use @Autowired annotation on top of Fields only. * If we add the @Autowired Annotation on top of Field means it will apply either byName/byType Strategy. byName/byType strategy container will use Setter Injection internally. Case-1 ======= @Autowired private User user; // Field Spring.xml =========== Observation :: Property Name and bean definition id value is matched then container will apply byName strategy Case-2 ====== @Autowired private User userObj; // Field Spring.xml =========== Observation :: Property Name and bean definition id value is not matched then container will apply byType strategy Activating the IOC Container to Read and execute @Autowired Annotation =======================================================================