Setter Dependency Injection
As we all know by this time that , there are 2 types of DI in Spring based on how we inject the dependent beans
They are as below
1) Constructor DI
2) Setter DI
We have already learned about Constructor DI, now we will see Setter DI.
Setter DI is the method of injecting dependent beans through Setters in the class
It means, we create setter for each dependent object and pass the dependent object as parameter to the corresponding setter and wire them accordingly in the spring configuration file.
We can also inject primitive values through setter.
Let us see below example
We have Person and Country classes where each person will have an associated country.
So Person is dependent on Country.
Create a Person class
It contains 3 primitive attributes and 1 dependent object reference to Country.
Person class has 4 setter methods one for each attribute and each setter method takes the corresponding parameter.
These parameters are injected in the spring configuration file.
There is also a toString() method which returns the values of Person
- package com.kb.di;
- public class Person {
- private int id;
- private String name;
- private int age;
- private Country country;
- public void showPerson(){
- System.out.println(toString());
- System.out.println(country.toString());
- }
- @Override
- public String toString() {
- return "Person details -> id "+id+" name "+name+" age "+age;
- }
- public void setId(int id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setCountry(Country country) {
- this.country = country;
- }
- }
package com.kb.di; public class Person { private int id; private String name; private int age; private Country country; public void showPerson(){ System.out.println(toString()); System.out.println(country.toString()); } @Override public String toString() { return "Person details -> id "+id+" name "+name+" age "+age; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setCountry(Country country) { this.country = country; } }
Create a Country class
It contains 2 primitive attributes
Country class has 2 setter methods one for each attribute and each setter takes the corresponding parameter and these parameters are injected in the spring configuration file.
There is also a toString() method which returns the values of Country
- package com.kb.di;
- public class Country {
- private int id;
- private String name;
- @Override
- public String toString() {
- return "Country details -> id "+id+" name "+name;
- }
- public void setId(int id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
package com.kb.di; public class Country { private int id; private String name; @Override public String toString() { return "Country details -> id "+id+" name "+name; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } }
Create a Spring configuration file, beans.xml
< property > tag is used to inject the values through setter
name attribute inside < property > tag is used to specify name of the attribute.
value attribute inside < property > tag is used to specify the value.
It should exactly match with the name defined in java class
ref is used to specify the reference to another bean with its id.
In this case, it is referring to country.
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
- <bean id="country" class="com.kb.di.Country">
- <property name="id" value="111"></property>
- <property name="name" value="India"></property>
- </bean>
- <bean id="person" class="com.kb.di.Person">
- <property name="id" value="1"></property>
- <property name="name" value="Raj"></property>
- <property name="age" value="22"></property>
- <property name="country" ref="country"></property>
- </bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="country" class="com.kb.di.Country"> <property name="id" value="111"></property> <property name="name" value="India"></property> </bean> <bean id="person" class="com.kb.di.Person"> <property name="id" value="1"></property> <property name="name" value="Raj"></property> <property name="age" value="22"></property> <property name="country" ref="country"></property> </bean> </beans>
Note : In setter injection, we don’t specify the data type of a property value unlike we do it in construction injection if it is non string primitive type.
create Pom.xml
Spring core related dependencies are specified in this pom.xml
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>Spring</groupId>
- <artifactId>SpringCore</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>SpringCore</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>4.2.4.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>4.2.4.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Spring</groupId> <artifactId>SpringCore</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringCore</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Create a SetterDI class
This class loads the spring beans using application context and calls the person class method showPerson() to display the person details.
- package com.kb.di;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class SetterDI {
- public static void main(String[] args) {
- ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
- Person person = (Person)applicationContext.getBean("person");
- person.showPerson();
- }
- }
package com.kb.di; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SetterDI { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person)applicationContext.getBean("person"); person.showPerson(); } }
Now right click on SetterDI class and run as java application
Output
the best website to learn spring java