Tuesday, March 1, 2011

Spring – InitializingBean and DisposableBean


Spring – InitializingBean and DisposableBean 

In Spring, InitializingBean and DisposableBean are two interfaces, implementing these interfaces will make Spring calling afterPropertiesSet() for the former and destroy() for the latter to allow the bean to perform certain actions upon initialization and destruction.
Here’s an example to show how to use InitializingBean and DisposableBean.
in Spring, it’s encouraged to use init-method=”method name” and destroy-method=”method name” as attribute in bean configuration file for bean to perform certain actions upon initialization and destruction.

Spring – Properties dependency checking


Spring – Properties dependency checking

In Spring framework, you can make sure all the required properties have been set in bean by using properties dependency checking feature.

Dependency checking modes

In Spring, 4 dependency checking modes are supported:
  • none – No dependency checking.
  • simple – If any properties of primitive type (int, long,double…) and collection types (map, list..) have not been set, UnsatisfiedDependencyException will be thrown.
  • objects – If any properties of object type have not been set, UnsatisfiedDependencyException will be thrown.
  • all – If any properties of any type have not been set, an UnsatisfiedDependencyException
    will be thrown.

How to integrate your Struts application with Spring


How to integrate your Struts application with Spring
To integrate your Struts application with Spring, we have two options:
1.      Configure Spring to manage your Actions as beans, using the ContextLoaderPlugin, and set their dependencies in a Spring context file.
2.      Subclass Spring's ActionSupport classes and grab your Spring-managed beans explicitly using a getWebApplicationContext()method.

Procedure to integrate struts and spring according to case 1
1.      get and include the “struts2-spring-plugin-xxx.jar
2.      Configure the Spring listener “org.springframework.web.context.ContextLoaderListener” in web.xml file.
               <listener>
                        <listener-class>
                                       org.springframework.web.context.ContextLoaderListener
                         </listener-class>
            </listener>
3.      Register all the Spring’s Beans in the applicationContext.xml file; the Spring listener will locate this xml file automatically.
               <bean id="userBo" class="com.mkyong.user.bo.impl.UserBoImpl" />
            <bean id="userSpringAction" class="com.mkyong.user.action.UserSpringAction">
                        <property name="userBo" ref="userBo" />            
            </bean>
4.      Declared all the relationship in struts.xml
               <action name="userSpringAction"  class="userSpringAction" >
                        <result name="success">pages/user.jsp</result>
            </action>
  This will pass the Spring’s “userBo” bean into the UserAction via setUserBo() automatically.
            UserBo userBo; 
            public void setUserBo(UserBo userBo) {
                        this.userBo = userBo;
Alternatively, you can use the Spring’s generic WebApplicationContextUtils class to get the Spring’s bean directly.
WebApplicationContext context =
                                     WebApplicationContextUtils.getRequiredWebApplicationContext(
                                    ServletActionContext.getServletContext()
                        );
                        UserBo userBo1 = (UserBo)context.getBean("userBo");
                        userBo1.printUser ();

How to integrate Spring and Hibernate using HibernateDaoSupport


What are the ways to access Hibernate using Spring
There are two approaches to spring’s Hibernate integration:
1.      Inversion of Control with a HibernateTemplate and Callback
2.      Extending HibernateDaoSupport and Applying an AOP Interceptor

How to integrate Spring and Hibernate using HibernateDaoSupport case 2
Spring and Hibernate can integrate using Spring’s SessionFactory called LocalSessionFactory. The integration process is of 3 steps.
  • Configure the Hibernate SessionFactory
  • Extend your DAO Implementation from HibernateDaoSupport
  • Wire in Transaction Support with AOP
1. mapping with the table in the .hbm.xml file
2. <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://localhost:3306/ims"/>
              <property name="username" value="root"/>
              <property name="password" value="root"/>                  
     </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
                               <value>/po/users.hbm.xml</value>
            <value>/po/messages.hbm.xml</value>
            <value>/po/keywords.hbm.xml</value>
            <value>/po/pastsessioninfo.hbm.xml</value>
                  </list>
             </property>
            <property name="hibernateProperties" value="hibernate.dialect=org.hibernate.dialect.MySQLDialect"/>
     </bean>
3. the dao class should implement HibernateDaoSupport 

What do you mean by Auto Wiring


What do you mean by Auto Wiring
The Spring container is able to auto wire relationships between collaborating beans. This means that it is possible to automatically let Spring collaborate your beans by inspecting the contents of the BeanFactory. The auto wiring functionality has five modes.
  • no – No auto-wiring. This is the default mode; you have to wire your bean explicitly by using the ‘ref’ attribute.
  • byName – Auto-wire a bean whose name is same as the property.
  • byType – Auto-wire a bean whose data type is compatible with the property. The problem is sometimes there will be more than one beans are match with ‘byType’ criteria. In this case, Spring will throw an UnsatisfiedDependencyException exception.
  • constructor – Auto-wire a bean whose date type is compatible with the property constructor argument. The ‘constructor’ mode is facing the same problem with ‘byType’ auto-wire mode
  • autodetect – If a default constructor with no argument is found, it will auto-wire by data type. Otherwise, it will auto-wire by constructor. It has the same problem with ‘byType’ and ‘constructor’,
It’s always good to combine the ‘auto-wire’ and ‘dependency-check’ feature together to make sure the property is auto-wire successfully.
e.g.      <bean id="CustomerBean" class="com.mkyong.common.Customer" 
                                    autowire="autodetect" dependency-check="objects">
                    <property name="action" value="buy" />
                    <property name="type" value="1" />
           </bean>
           <bean id="PersonBean" class="com.mkyong.common.Person">
                    <property name="name" value="mkyong" />
                    <property name="address" value="address 123" />
                    <property name="age" value="28" />
            </bean>

What is the typical Bean life cycle in Spring Bean Factory Container


What is the typical Bean life cycle in Spring Bean Factory Container
Bean life cycle in Spring Bean Factory Container is as follows:
·   The spring container finds the bean’s definition from the XML file and instantiates the bean.
·   Using the dependency injection, spring populates all of the properties as specified in the bean definition.
·   If the bean implements the BeanNameAware interface, the factory calls setBeanName(String name) ,It sets the name of the bean in the bean factory that created this bean.
·   If the bean implements the BeanFactoryAware interface, the factory calls setBeanFactory(BeanFactory beanFactory), passing an instance of itself. Invoked after the population of normal bean properties but before an initialization callback such as InitializingBean.afterPropertiesSet() or a custom init-method.
·   If the bean implements the BeanPostProcessors interface, their postProcessBeforeInitialization(Object bean, String beanname) methods will be called.
·   If an init-method is specified for the bean, it will be called.
·   If the bean implements the BeanPostProcessors interface, their postProcessAfterInitialization (Object bean, String beanname) methods will be called.