While using Spring XML configuration for wiring beans you would have used <constructor-arg> element several times for providing, property values and/or providing reference for beans, as a constructor injection. If you are looking for any shorter alternative, just as p-namesapce is used in place of nested <property> element, you can use c-namespace in Spring.
The c-namespace in Spring enables you to use the bean element’s attributes for configuring the constructor arguments rather than nested constructor-arg elements.
As example–
If you have an XML configuration for bean employee which has a constructor that refers to the bean of type address with constructor-arg you will write it like this -
<bean id="employee" class="org.netjs.model.Employee"> <constructor-arg ref="address"/> </bean>
You can use c-namespace to shorten it like this -
<bean id="employee" class="org.netjs.model.Employee" c:officeAddress-ref="address"> <!-- <constructor-arg ref="address"/> --> </bean>
You can see here that instead of using nested <constructor-arg> element you can use bean element’s attribute itself.
In this way of using c-namespace for injection of bean reference c:officeAddress-ref="address", c: denotes the use of c-namespace, officeAddress is the constructor argument name with in the employee class where value is injected, -ref indicates injection of bean reference.
Using c-namespace with literals
Same way c-namespace can be used for injecting literal values.
As example
If you have an XML configuration for bean employee which has a constructor argument empName then you can provide a literal value to empName property like this –
<bean id="employee" class="org.netjs.model.Employee"> <constructor-arg value="Ram"/> </bean>
Using c-namespace you can shorten it like this –
<bean id="employee" class="org.netjs.model.Employee" c:empName="Ram"> <!-- <constructor-arg value="Ram"/> --> </bean>
Spring c-namespace example
As we have already seen there are two classes Address and Employee and Address class bean is referred in Employee.
Employee class
public class Employee { private int empId; private String empName; private int age; private Address officeAddress; public Employee(int empId, String empName, int age, Address officeAddress){ this.empId = empId; this.empName = empName; this.age = age; this.officeAddress = officeAddress; } public Address getOfficeAddress() { return officeAddress; } public int getEmpId() { return empId; } public String getEmpName() { return empName; } public int getAge() { return age; } }
Here it can be seen that Employee class has constructor that has some literal values as argument and one argument of type Address.
Address Class
public class Address { private String number; private String street; private String city; private String state; private String pinCode; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getPinCode() { return pinCode; } public void setPinCode(String pinCode) { this.pinCode = pinCode; } }
XML Configuration
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="address" class="org.netjs.model.Address" p:number="101" p:street="M I Road" p:city="Jaipur" p:state="Rajasthan" p:pinCode="302001"> </bean> <bean id="employee" class="org.netjs.model.Employee" c:empId="1001" c:age="25" c:empName="Ram" c:officeAddress-ref="address" /> </beans>Here notice the inclusion of xmlns:c="http://www.springframework.org/schema/c” and xmlns:p="http://www.springframework.org/schema/p” in XML configuration for c-namespace and p-namespace respectively.
In bean definition for address p-namespace is used for providing values. In bean definition for Employee c-namespace is used to provide values for constructor arguments.
Test Class
You can run this code using the following code -
import org.netjs.model.Address; import org.netjs.model.Employee; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext ("appcontext.xml"); Employee emp = (Employee)context.getBean("employee"); Address addr = emp.getOfficeAddress(); System.out.println("name " + emp.getEmpName()); System.out.println("City " + addr.getCity()); System.out.println("PinCode " + addr.getPinCode()); context.close(); } }
Output
name Ram City Jaipur PinCode 302001
That's all for this topic Using c-namespace in Spring. If you have any doubt or any suggestions to make please drop a comment. Thanks!
>>>Return to Spring Tutorial Page
Related Topics
You may also like-
No comments:
Post a Comment