"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
=======================================================================