In most of the cases, one of the attributes of a class(A) is a
class(B) by itself. In such cases, setting values for class A would
involve setting values for Class B in turn. Then, reference to the bean
ID can be passed while setting the bean using Setter injection.
The basic working of spring framework is now clear. Now, we can keep doing modifications in the existing base project to further build on our understanding. Let us take up a practical scenario for the next step. One of the attributes of a class <Candidate> is another class<Address>. The value of the class Candidate depends on the value of the Class Address. i.e., there is a dependency here.
File : Candidate.java
File :Address.java
Step 2:
Create the main class.
File : MainClass.java
Make sure that all these xml files are loaded properly in your project classpath.
File : Beans.xml
A bean is created corresponding to both the classes(Candidate and Address).Make changes here to add multiple property tags corresponding to the various attributes present inside each of the classes. One major difference here is, the property Address under Candidate does not have a direct value for itself, but is rather a separate bean. Hence, instead of providing value, provide ref for this property. The value provided in ref will be nothing but the beanID of the Address class. We have used setter injection to set values for the properties. Hence, we use the tag property and give the value to be set (which is passed to the corresponding setter methods) as the value correspondingly.
The basic working of spring framework is now clear. Now, we can keep doing modifications in the existing base project to further build on our understanding. Let us take up a practical scenario for the next step. One of the attributes of a class <Candidate> is another class<Address>. The value of the class Candidate depends on the value of the Class Address. i.e., there is a dependency here.
Step 1:
Create a new classes Candidate, Address(POJOs) and define the attributes as above. For this example, simply create the setter and getter methods for each attributes, through which their values will be injectedFile : Candidate.java
package com.simpleCodeStuffs; public class Candidate { private String name; private int age; private Address addrs; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddrs() { return addrs; } public void setAddrs(Address addrs) { this.addrs = addrs; } }
File :Address.java
package com.simpleCodeStuffs; public class Address { private String doorNo; private String street; private String area; public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getDoorNo() { return doorNo; } public void setDoorNo(String doorNo) { this.doorNo = doorNo; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } }
Step 2:
Create the main class.
File : MainClass.java
package com.simpleCodeStuffs; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainClass { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "Beans.xml"); Candidate can = (Candidate) context.getBean("candidate"); Address add = (Address) context.getBean("address"); System.out.println("Name� : " + can.getName()); System.out.println("Age: " + can.getAge()); System.out.println("Address : " + can.getAddrs().getDoorNo()); System.out.println("t " + add.getStreet()); System.out.println("t " + add.getArea()); } }
In case multiple xml files need to be loaded by the main class as in some cases, the bean definitions are distributed over many xml files, then the same can be loaded in the MainClass as
ApplicationContext context =new ClassPathXmlApplicationContext(“Beans.xml”,”AnotherBeans.xml”,”OtherBeans.xml”);
Make sure that all these xml files are loaded properly in your project classpath.
In case the beanID mentioned by the ref is present in the same xml file, then it can ALSO be particularly specified as
<ref local=address/>
File : Beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="candidate" class="com.simpleCodeStuffs.Candidate"> <property name="name" value="Sandy" /> <property name="age" value="22" /> <property name="addrs" ref="address" /> </bean> <bean id="address" class="com.simpleCodeStuffs.Address"> <property name="doorNo" value="1-B/25" /> <property name="street" value="KLN Street" /> <property name="area" value="M.K Nagar, Ayapakkam" /> </bean> </beans>
Note : here, ‘property’ tag is used to inject values from the metadata file in case of setter injection
A bean is created corresponding to both the classes(Candidate and Address).Make changes here to add multiple property tags corresponding to the various attributes present inside each of the classes. One major difference here is, the property Address under Candidate does not have a direct value for itself, but is rather a separate bean. Hence, instead of providing value, provide ref for this property. The value provided in ref will be nothing but the beanID of the Address class. We have used setter injection to set values for the properties. Hence, we use the tag property and give the value to be set (which is passed to the corresponding setter methods) as the value correspondingly.