Spring lookup-method injection to inject prototype scoped bean into a singleton bean
This post extends Tutorial to understand Spring scopes -- singleton Vs prototype.
Step 0: You need asm and cgilib libraries in addition to Spring libraries.
Step 1: define the Dao (Data Access Object) interface.
package com.mycompany.understanding.spring;
public interface MyDao {
abstract void printData();
}
Step 2: Define the Dao implementation.
package com.mycompany.understanding.spring;
public class MyDaoImpl implements MyDao {
@Override
public void printData() {
System.out.println("printing data");
System.out.println(this);
}
}
Step 3: Define the service interface.
package com.mycompany.understanding.spring;
public interface MyService {
abstract void performTask();
}
Step 4: Define the service implementation. Note that the class is abstract as Spring will decorate this class with cgilib.
package com.mycompany.understanding.spring;
public abstract class MyServiceImpl implements MyService {
protected abstract MyDao createMyDao();
@Override
public void performTask() {
System.out.println("Performing tasks .............");
createMyDao().printData();
}
}
Step 5: The spring context file applicationContext.xml that wires up dao and service. Take note of the "lookup-method".
<?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="myDaoDef" class="com.mycompany.understanding.spring.MyDaoImpl" scope="prototype"/>
<bean id="myServiceDef" class="com.mycompany.understanding.spring.MyServiceImpl" scope="singleton">
<lookup-method name="createMyDao" bean="myDaoDef" />
</bean>
</beans>
Step 6: Executable main class.
package com.mycompany.understanding.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyMainApp {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
for (int i = 0; i <3; i++) {
MyService service = (MyService) applicationContext.getBean("myServiceDef");
System.out.println(service);
service.performTask();
}
}
}
Output if you run the above class
com.mycompany.understanding.spring.MyServiceImpl$$EnhancerByCGLIB$$35dfd4bb@750efc01 Performing tasks ............. printing data com.mycompany.understanding.spring.MyDaoImpl@2ac2e1b1 com.mycompany.understanding.spring.MyServiceImpl$$EnhancerByCGLIB$$35dfd4bb@750efc01 Performing tasks ............. printing data com.mycompany.understanding.spring.MyDaoImpl@606f4165 com.mycompany.understanding.spring.MyServiceImpl$$EnhancerByCGLIB$$35dfd4bb@750efc01 Performing tasks ............. printing data com.mycompany.understanding.spring.MyDaoImpl@282e7f59
Single instance of service has 3 separate instances of Dao.
Labels: Spring, Spring core


0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home