By Peter Bell

An Example of the Benefits of a Programmatic Config File for Dependency Injection

I'm giving a presentation at 2pm EST today on LightWire. As part of that I decided to finally take a few minutes to mock up what a small part of my config file would actually look like if I did it in XML rather than programmatically . . .

Here is a simple programmatic config file. It is only a subset of my real config file, but basically loops through a set of business objects and creates and wires up the Controller, Service, DAO, IBO and Metadata beans for each.

<cfcomponent name="LightBaseBeanConfigBean" extends="lightbase.lightwire.BaseConfigObject" hint="A LightWire configuration bean.">

<cffunction name="init" output="false" returntype="any" hint="I initialize the config bean.">
   <cfscript>
      var BusinessObjectList = "";
      var BusinessObjectName = "";
      Super.init();
      setLazyLoad("false");
      Project = CreateObject("component","lightbase.applications.#Application.name#.config.ApplicationConfig").init();

      // BUSINESS OBJECTS       // controller, service, DAO, IBO and metadata beans       BusinessObjectList = Project.get("ObjectList");
      // User, Category, Product, Page, Order, OrderItem, Cart, CartItem, ValueList, Notification, Article, AdminUser, Role, Permission, AuthenticationMethod, DiscountCode, ShippingMethod, ShippingRate, SalesTax, ProductAttribute, FAQ, Address, PaymentMethod       
      For (ConfigCount = 1; ConfigCount lte listlen(BusinessObjectList); ConfigCount = ConfigCount + 1)
       {
         // Get current object name          BusinessObjectName = ListGetAt(BusinessObjectList, ConfigCount);
      
         // Controller          addSingleton("lightbase.applications.#Application.Name#.com.controller.object.#BusinessObjectName#Controller");

         // Service          addSingleton("lightbase.applications.#Application.Name#.com.model.#BusinessObjectName#.#BusinessObjectName#Service");
         addConstructorDependency("#BusinessObjectName#Service","#BusinessObjectName#Metadata", "Metadata");
         addMixinDependency("#BusinessObjectName#Service","#BusinessObjectName#DAO");
         addMixinDependency("LightBase","#BusinessObjectName#Service");
   
         // DAO          addSingleton("lightbase.applications.#Application.Name#.com.model.#BusinessObjectName#.#BusinessObjectName#DAO");
         addConstructorDependency("#BusinessObjectName#DAO","#BusinessObjectName#Metadata", "Metadata");
      
         // Business Object (IBO)          addSingleton("lightbase.applications.#Application.Name#.com.model.#BusinessObjectName#.#BusinessObjectName#");
         addConstructorDependency("#BusinessObjectName#","#BusinessObjectName#Metadata", "Metadata");
         addMixinDependency("#BusinessObjectName#","DataType");
         addMixinDependency("#BusinessObjectName#","#BusinessObjectName#DAO");
      
         // Metadata          addSingleton("lightbase.applications.#Application.Name#.com.model.#BusinessObjectName#.#BusinessObjectName#Metadata");
         addConstructorDependency("#BusinessObjectName#Metadata","ApplicationConfig");
       };   

   </cfscript>
   <cfreturn THIS>
</cffunction>

</cfcomponent>

I then took what for me would be a typical simple e-commerce project with the following business objects: User, Category, Product, Page, Order, OrderItem, Cart, CartItem, ValueList, Notification, Article, AdminUser, Role, Permission, AuthenticationMethod, DiscountCode, ShippingMethod, ShippingRate, SalesTax, ProductAttribute, FAQ, Address, PaymentMethod and wrote the XML (I cut and pasted this from someone else so apologies if the syntax isn't valid - I *believe* it is correct) and got the following.

<beans>
   <bean id="UserController" class="lightbase.applications.#Application.Name#.com.controller.object.UserController">
   </bean>
   <bean id="UserService" class="lightbase.applications.#Application.Name#.com.model.User.UserService">
      <constructor-arg name="UserMetadata">
         <ref bean="UserMetadata"/>
      </constructor-arg>
      <property name="UserDAO">
         <ref bean="UserDAO" />
      </property>
   </bean>
   <bean id="UserDAO" class="lightbase.applications.#Application.Name#.com.model.User.UserDAO">
      <constructor-arg name="UserMetadata">
         <ref bean="UserMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="user" class="lightbase.applications.#Application.Name#.com.model.User.User">
      <constructor-arg name="UserMetadata">
         <ref bean="UserMetadata"/>
      </constructor-arg>
      <property name="UserDAO">
         <ref bean="UserDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="UserMetadata" class="lightbase.applications.#Application.Name#.config.UserMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>
   <bean id="ProductController" class="lightbase.applications.#Application.Name#.com.controller.object.ProductController">
   </bean>
   <bean id="ProductService" class="lightbase.applications.#Application.Name#.com.model.Product.ProductService">
      <constructor-arg name="ProductMetadata">
         <ref bean="ProductMetadata"/>
      </constructor-arg>
      <property name="ProductDAO">
         <ref bean="ProductDAO" />
      </property>
   </bean>
   <bean id="ProductDAO" class="lightbase.applications.#Application.Name#.com.model.Product.ProductDAO">
      <constructor-arg name="ProductMetadata">
         <ref bean="ProductMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Product" class="lightbase.applications.#Application.Name#.com.model.Product.Product">
      <constructor-arg name="ProductMetadata">
         <ref bean="ProductMetadata"/>
      </constructor-arg>
      <property name="ProductDAO">
         <ref bean="ProductDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ProductMetadata" class="lightbase.applications.#Application.Name#.config.ProductMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="CategoryController" class="lightbase.applications.#Application.Name#.com.controller.object.CategoryController">
   </bean>
   <bean id="CategoryService" class="lightbase.applications.#Application.Name#.com.model.Category.CategoryService">
      <constructor-arg name="CategoryMetadata">
         <ref bean="CategoryMetadata"/>
      </constructor-arg>
      <property name="CategoryDAO">
         <ref bean="CategoryDAO" />
      </property>
   </bean>
   <bean id="CategoryDAO" class="lightbase.applications.#Application.Name#.com.model.Category.CategoryDAO">
      <constructor-arg name="CategoryMetadata">
         <ref bean="CategoryMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Category" class="lightbase.applications.#Application.Name#.com.model.Category.Category">
      <constructor-arg name="CategoryMetadata">
         <ref bean="CategoryMetadata"/>
      </constructor-arg>
      <property name="CategoryDAO">
         <ref bean="CategoryDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="CategoryMetadata" class="lightbase.applications.#Application.Name#.config.CategoryMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="PageController" class="lightbase.applications.#Application.Name#.com.controller.object.PageController">
   </bean>
   <bean id="PageService" class="lightbase.applications.#Application.Name#.com.model.Page.PageService">
      <constructor-arg name="PageMetadata">
         <ref bean="PageMetadata"/>
      </constructor-arg>
      <property name="PageDAO">
         <ref bean="PageDAO" />
      </property>
   </bean>
   <bean id="PageDAO" class="lightbase.applications.#Application.Name#.com.model.Page.PageDAO">
      <constructor-arg name="PageMetadata">
         <ref bean="PageMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Page" class="lightbase.applications.#Application.Name#.com.model.Page.Page">
      <constructor-arg name="PageMetadata">
         <ref bean="PageMetadata"/>
      </constructor-arg>
      <property name="PageDAO">
         <ref bean="PageDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="PageMetadata" class="lightbase.applications.#Application.Name#.config.PageMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="OrderController" class="lightbase.applications.#Application.Name#.com.controller.object.OrderController">
   </bean>
   <bean id="OrderService" class="lightbase.applications.#Application.Name#.com.model.Order.OrderService">
      <constructor-arg name="OrderMetadata">
         <ref bean="OrderMetadata"/>
      </constructor-arg>
      <property name="OrderDAO">
         <ref bean="OrderDAO" />
      </property>
   </bean>
   <bean id="OrderDAO" class="lightbase.applications.#Application.Name#.com.model.Order.OrderDAO">
      <constructor-arg name="OrderMetadata">
         <ref bean="OrderMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Order" class="lightbase.applications.#Application.Name#.com.model.Order.Order">
      <constructor-arg name="OrderMetadata">
         <ref bean="OrderMetadata"/>
      </constructor-arg>
      <property name="OrderDAO">
         <ref bean="OrderDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="OrderMetadata" class="lightbase.applications.#Application.Name#.config.OrderMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="OrderItemController" class="lightbase.applications.#Application.Name#.com.controller.object.OrderItemController">
   </bean>
   <bean id="OrderItemService" class="lightbase.applications.#Application.Name#.com.model.OrderItem.OrderItemService">
      <constructor-arg name="OrderItemMetadata">
         <ref bean="OrderItemMetadata"/>
      </constructor-arg>
      <property name="OrderItemDAO">
         <ref bean="OrderItemDAO" />
      </property>
   </bean>
   <bean id="OrderItemDAO" class="lightbase.applications.#Application.Name#.com.model.OrderItem.OrderItemDAO">
      <constructor-arg name="OrderItemMetadata">
         <ref bean="OrderItemMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="OrderItem" class="lightbase.applications.#Application.Name#.com.model.OrderItem.OrderItem">
      <constructor-arg name="OrderItemMetadata">
         <ref bean="OrderItemMetadata"/>
      </constructor-arg>
      <property name="OrderItemDAO">
         <ref bean="OrderItemDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="OrderItemMetadata" class="lightbase.applications.#Application.Name#.config.OrderItemMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="CartController" class="lightbase.applications.#Application.Name#.com.controller.object.CartController">
   </bean>
   <bean id="CartService" class="lightbase.applications.#Application.Name#.com.model.Cart.CartService">
      <constructor-arg name="CartMetadata">
         <ref bean="CartMetadata"/>
      </constructor-arg>
      <property name="CartDAO">
         <ref bean="CartDAO" />
      </property>
   </bean>
   <bean id="CartDAO" class="lightbase.applications.#Application.Name#.com.model.Cart.CartDAO">
      <constructor-arg name="CartMetadata">
         <ref bean="CartMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Cart" class="lightbase.applications.#Application.Name#.com.model.Cart.Cart">
      <constructor-arg name="CartMetadata">
         <ref bean="CartMetadata"/>
      </constructor-arg>
      <property name="CartDAO">
         <ref bean="CartDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="CartMetadata" class="lightbase.applications.#Application.Name#.config.CartMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="CartItemController" class="lightbase.applications.#Application.Name#.com.controller.object.CartItemController">
   </bean>
   <bean id="CartItemService" class="lightbase.applications.#Application.Name#.com.model.CartItem.CartItemService">
      <constructor-arg name="CartItemMetadata">
         <ref bean="CartItemMetadata"/>
      </constructor-arg>
      <property name="CartItemDAO">
         <ref bean="CartItemDAO" />
      </property>
   </bean>
   <bean id="CartItemDAO" class="lightbase.applications.#Application.Name#.com.model.CartItem.CartItemDAO">
      <constructor-arg name="CartItemMetadata">
         <ref bean="CartItemMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="CartItem" class="lightbase.applications.#Application.Name#.com.model.CartItem.CartItem">
      <constructor-arg name="CartItemMetadata">
         <ref bean="CartItemMetadata"/>
      </constructor-arg>
      <property name="CartItemDAO">
         <ref bean="CartItemDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="CartItemMetadata" class="lightbase.applications.#Application.Name#.config.CartItemMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="ValueListController" class="lightbase.applications.#Application.Name#.com.controller.object.ValueListController">
   </bean>
   <bean id="ValueListService" class="lightbase.applications.#Application.Name#.com.model.ValueList.ValueListService">
      <constructor-arg name="ValueListMetadata">
         <ref bean="ValueListMetadata"/>
      </constructor-arg>
      <property name="ValueListDAO">
         <ref bean="ValueListDAO" />
      </property>
   </bean>
   <bean id="ValueListDAO" class="lightbase.applications.#Application.Name#.com.model.ValueList.ValueListDAO">
      <constructor-arg name="ValueListMetadata">
         <ref bean="ValueListMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="ValueList" class="lightbase.applications.#Application.Name#.com.model.ValueList.ValueList">
      <constructor-arg name="ValueListMetadata">
         <ref bean="ValueListMetadata"/>
      </constructor-arg>
      <property name="ValueListDAO">
         <ref bean="ValueListDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ValueListMetadata" class="lightbase.applications.#Application.Name#.config.ValueListMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="NotificationController" class="lightbase.applications.#Application.Name#.com.controller.object.NotificationController">
   </bean>
   <bean id="NotificationService" class="lightbase.applications.#Application.Name#.com.model.Notification.NotificationService">
      <constructor-arg name="NotificationMetadata">
         <ref bean="NotificationMetadata"/>
      </constructor-arg>
      <property name="NotificationDAO">
         <ref bean="NotificationDAO" />
      </property>
   </bean>
   <bean id="NotificationDAO" class="lightbase.applications.#Application.Name#.com.model.Notification.NotificationDAO">
      <constructor-arg name="NotificationMetadata">
         <ref bean="NotificationMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Notification" class="lightbase.applications.#Application.Name#.com.model.Notification.Notification">
      <constructor-arg name="NotificationMetadata">
         <ref bean="NotificationMetadata"/>
      </constructor-arg>
      <property name="NotificationDAO">
         <ref bean="NotificationDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="NotificationMetadata" class="lightbase.applications.#Application.Name#.config.NotificationMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="ArticleController" class="lightbase.applications.#Application.Name#.com.controller.object.ArticleController">
   </bean>
   <bean id="ArticleService" class="lightbase.applications.#Application.Name#.com.model.Article.ArticleService">
      <constructor-arg name="ArticleMetadata">
         <ref bean="ArticleMetadata"/>
      </constructor-arg>
      <property name="ArticleDAO">
         <ref bean="ArticleDAO" />
      </property>
   </bean>
   <bean id="ArticleDAO" class="lightbase.applications.#Application.Name#.com.model.Article.ArticleDAO">
      <constructor-arg name="ArticleMetadata">
         <ref bean="ArticleMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Article" class="lightbase.applications.#Application.Name#.com.model.Article.Article">
      <constructor-arg name="ArticleMetadata">
         <ref bean="ArticleMetadata"/>
      </constructor-arg>
      <property name="ArticleDAO">
         <ref bean="ArticleDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ArticleMetadata" class="lightbase.applications.#Application.Name#.config.ArticleMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="AdminUserController" class="lightbase.applications.#Application.Name#.com.controller.object.AdminUserController">
   </bean>
   <bean id="AdminUserService" class="lightbase.applications.#Application.Name#.com.model.AdminUser.AdminUserService">
      <constructor-arg name="AdminUserMetadata">
         <ref bean="AdminUserMetadata"/>
      </constructor-arg>
      <property name="AdminUserDAO">
         <ref bean="AdminUserDAO" />
      </property>
   </bean>
   <bean id="AdminUserDAO" class="lightbase.applications.#Application.Name#.com.model.AdminUser.AdminUserDAO">
      <constructor-arg name="AdminUserMetadata">
         <ref bean="AdminUserMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="AdminUser" class="lightbase.applications.#Application.Name#.com.model.AdminUser.AdminUser">
      <constructor-arg name="AdminUserMetadata">
         <ref bean="AdminUserMetadata"/>
      </constructor-arg>
      <property name="AdminUserDAO">
         <ref bean="AdminUserDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="AdminUserMetadata" class="lightbase.applications.#Application.Name#.config.AdminUserMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>
   <bean id="RoleController" class="lightbase.applications.#Application.Name#.com.controller.object.RoleController">
   </bean>
   <bean id="RoleService" class="lightbase.applications.#Application.Name#.com.model.Role.RoleService">
      <constructor-arg name="RoleMetadata">
         <ref bean="RoleMetadata"/>
      </constructor-arg>
      <property name="RoleDAO">
         <ref bean="RoleDAO" />
      </property>
   </bean>
   <bean id="RoleDAO" class="lightbase.applications.#Application.Name#.com.model.Role.RoleDAO">
      <constructor-arg name="RoleMetadata">
         <ref bean="RoleMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Role" class="lightbase.applications.#Application.Name#.com.model.Role.Role">
      <constructor-arg name="RoleMetadata">
         <ref bean="RoleMetadata"/>
      </constructor-arg>
      <property name="RoleDAO">
         <ref bean="RoleDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="RoleMetadata" class="lightbase.applications.#Application.Name#.config.RoleMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="PermissionController" class="lightbase.applications.#Application.Name#.com.controller.object.PermissionController">
   </bean>
   <bean id="PermissionService" class="lightbase.applications.#Application.Name#.com.model.Permission.PermissionService">
      <constructor-arg name="PermissionMetadata">
         <ref bean="PermissionMetadata"/>
      </constructor-arg>
      <property name="PermissionDAO">
         <ref bean="PermissionDAO" />
      </property>
   </bean>
   <bean id="PermissionDAO" class="lightbase.applications.#Application.Name#.com.model.Permission.PermissionDAO">
      <constructor-arg name="PermissionMetadata">
         <ref bean="PermissionMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Permission" class="lightbase.applications.#Application.Name#.com.model.Permission.Permission">
      <constructor-arg name="PermissionMetadata">
         <ref bean="PermissionMetadata"/>
      </constructor-arg>
      <property name="PermissionDAO">
         <ref bean="PermissionDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="PermissionMetadata" class="lightbase.applications.#Application.Name#.config.PermissionMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="AuthenticationMethodController" class="lightbase.applications.#Application.Name#.com.controller.object.AuthenticationMethodController">
   </bean>
   <bean id="AuthenticationMethodService" class="lightbase.applications.#Application.Name#.com.model.AuthenticationMethod.AuthenticationMethodService">
      <constructor-arg name="AuthenticationMethodMetadata">
         <ref bean="AuthenticationMethodMetadata"/>
      </constructor-arg>
      <property name="AuthenticationMethodDAO">
         <ref bean="AuthenticationMethodDAO" />
      </property>
   </bean>
   <bean id="AuthenticationMethodDAO" class="lightbase.applications.#Application.Name#.com.model.AuthenticationMethod.AuthenticationMethodDAO">
      <constructor-arg name="AuthenticationMethodMetadata">
         <ref bean="AuthenticationMethodMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="AuthenticationMethod" class="lightbase.applications.#Application.Name#.com.model.AuthenticationMethod.AuthenticationMethod">
      <constructor-arg name="AuthenticationMethodMetadata">
         <ref bean="AuthenticationMethodMetadata"/>
      </constructor-arg>
      <property name="AuthenticationMethodDAO">
         <ref bean="AuthenticationMethodDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="AuthenticationMethodMetadata" class="lightbase.applications.#Application.Name#.config.AuthenticationMethodMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="DiscountCodeController" class="lightbase.applications.#Application.Name#.com.controller.object.DiscountCodeController">
   </bean>
   <bean id="DiscountCodeService" class="lightbase.applications.#Application.Name#.com.model.DiscountCode.DiscountCodeService">
      <constructor-arg name="DiscountCodeMetadata">
         <ref bean="DiscountCodeMetadata"/>
      </constructor-arg>
      <property name="DiscountCodeDAO">
         <ref bean="DiscountCodeDAO" />
      </property>
   </bean>
   <bean id="DiscountCodeDAO" class="lightbase.applications.#Application.Name#.com.model.DiscountCode.DiscountCodeDAO">
      <constructor-arg name="DiscountCodeMetadata">
         <ref bean="DiscountCodeMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="DiscountCode" class="lightbase.applications.#Application.Name#.com.model.DiscountCode.DiscountCode">
      <constructor-arg name="DiscountCodeMetadata">
         <ref bean="DiscountCodeMetadata"/>
      </constructor-arg>
      <property name="DiscountCodeDAO">
         <ref bean="DiscountCodeDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="DiscountCodeMetadata" class="lightbase.applications.#Application.Name#.config.DiscountCodeMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="ShippingMethodController" class="lightbase.applications.#Application.Name#.com.controller.object.ShippingMethodController">
   </bean>
   <bean id="ShippingMethodService" class="lightbase.applications.#Application.Name#.com.model.ShippingMethod.ShippingMethodService">
      <constructor-arg name="ShippingMethodMetadata">
         <ref bean="ShippingMethodMetadata"/>
      </constructor-arg>
      <property name="ShippingMethodDAO">
         <ref bean="ShippingMethodDAO" />
      </property>
   </bean>
   <bean id="ShippingMethodDAO" class="lightbase.applications.#Application.Name#.com.model.ShippingMethod.ShippingMethodDAO">
      <constructor-arg name="ShippingMethodMetadata">
         <ref bean="ShippingMethodMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="ShippingMethod" class="lightbase.applications.#Application.Name#.com.model.ShippingMethod.ShippingMethod">
      <constructor-arg name="ShippingMethodMetadata">
         <ref bean="ShippingMethodMetadata"/>
      </constructor-arg>
      <property name="ShippingMethodDAO">
         <ref bean="ShippingMethodDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ShippingMethodMetadata" class="lightbase.applications.#Application.Name#.config.ShippingMethodMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="ShippingRateController" class="lightbase.applications.#Application.Name#.com.controller.object.ShippingRateController">
   </bean>
   <bean id="ShippingRateService" class="lightbase.applications.#Application.Name#.com.model.ShippingRate.ShippingRateService">
      <constructor-arg name="ShippingRateMetadata">
         <ref bean="ShippingRateMetadata"/>
      </constructor-arg>
      <property name="ShippingRateDAO">
         <ref bean="ShippingRateDAO" />
      </property>
   </bean>
   <bean id="ShippingRateDAO" class="lightbase.applications.#Application.Name#.com.model.ShippingRate.ShippingRateDAO">
      <constructor-arg name="ShippingRateMetadata">
         <ref bean="ShippingRateMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="ShippingRate" class="lightbase.applications.#Application.Name#.com.model.ShippingRate.ShippingRate">
      <constructor-arg name="ShippingRateMetadata">
         <ref bean="ShippingRateMetadata"/>
      </constructor-arg>
      <property name="ShippingRateDAO">
         <ref bean="ShippingRateDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ShippingRateMetadata" class="lightbase.applications.#Application.Name#.config.ShippingRateMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="SalesTaxController" class="lightbase.applications.#Application.Name#.com.controller.object.SalesTaxController">
   </bean>
   <bean id="SalesTaxService" class="lightbase.applications.#Application.Name#.com.model.SalesTax.SalesTaxService">
      <constructor-arg name="SalesTaxMetadata">
         <ref bean="SalesTaxMetadata"/>
      </constructor-arg>
      <property name="SalesTaxDAO">
         <ref bean="SalesTaxDAO" />
      </property>
   </bean>
   <bean id="SalesTaxDAO" class="lightbase.applications.#Application.Name#.com.model.SalesTax.SalesTaxDAO">
      <constructor-arg name="SalesTaxMetadata">
         <ref bean="SalesTaxMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="SalesTax" class="lightbase.applications.#Application.Name#.com.model.SalesTax.SalesTax">
      <constructor-arg name="SalesTaxMetadata">
         <ref bean="SalesTaxMetadata"/>
      </constructor-arg>
      <property name="SalesTaxDAO">
         <ref bean="SalesTaxDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="SalesTaxMetadata" class="lightbase.applications.#Application.Name#.config.SalesTaxMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="ProductAttributeController" class="lightbase.applications.#Application.Name#.com.controller.object.ProductAttributeController">
   </bean>
   <bean id="ProductAttributeService" class="lightbase.applications.#Application.Name#.com.model.ProductAttribute.ProductAttributeService">
      <constructor-arg name="ProductAttributeMetadata">
         <ref bean="ProductAttributeMetadata"/>
      </constructor-arg>
      <property name="ProductAttributeDAO">
         <ref bean="ProductAttributeDAO" />
      </property>
   </bean>
   <bean id="ProductAttributeDAO" class="lightbase.applications.#Application.Name#.com.model.ProductAttribute.ProductAttributeDAO">
      <constructor-arg name="ProductAttributeMetadata">
         <ref bean="ProductAttributeMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="ProductAttribute" class="lightbase.applications.#Application.Name#.com.model.ProductAttribute.ProductAttribute">
      <constructor-arg name="ProductAttributeMetadata">
         <ref bean="ProductAttributeMetadata"/>
      </constructor-arg>
      <property name="ProductAttributeDAO">
         <ref bean="ProductAttributeDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="ProductAttributeMetadata" class="lightbase.applications.#Application.Name#.config.ProductAttributeMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>
   <bean id="FAQController" class="lightbase.applications.#Application.Name#.com.controller.object.FAQController">
   </bean>
   <bean id="FAQService" class="lightbase.applications.#Application.Name#.com.model.FAQ.FAQService">
      <constructor-arg name="FAQMetadata">
         <ref bean="FAQMetadata"/>
      </constructor-arg>
      <property name="FAQDAO">
         <ref bean="FAQDAO" />
      </property>
   </bean>
   <bean id="FAQDAO" class="lightbase.applications.#Application.Name#.com.model.FAQ.FAQDAO">
      <constructor-arg name="FAQMetadata">
         <ref bean="FAQMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="FAQ" class="lightbase.applications.#Application.Name#.com.model.FAQ.FAQ">
      <constructor-arg name="FAQMetadata">
         <ref bean="FAQMetadata"/>
      </constructor-arg>
      <property name="FAQDAO">
         <ref bean="FAQDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="FAQMetadata" class="lightbase.applications.#Application.Name#.config.FAQMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

   <bean id="AddressController" class="lightbase.applications.#Application.Name#.com.controller.object.AddressController">
   </bean>
   <bean id="AddressService" class="lightbase.applications.#Application.Name#.com.model.Address.AddressService">
      <constructor-arg name="AddressMetadata">
         <ref bean="AddressMetadata"/>
      </constructor-arg>
      <property name="AddressDAO">
         <ref bean="AddressDAO" />
      </property>
   </bean>
   <bean id="AddressDAO" class="lightbase.applications.#Application.Name#.com.model.Address.AddressDAO">
      <constructor-arg name="AddressMetadata">
         <ref bean="AddressMetadata"/>
      </constructor-arg>
   </bean>
   <bean id="Address" class="lightbase.applications.#Application.Name#.com.model.Address.Address">
      <constructor-arg name="AddressMetadata">
         <ref bean="AddressMetadata"/>
      </constructor-arg>
      <property name="AddressDAO">
         <ref bean="AddressDAO" />
      </property>
      <property name="DataType">
         <ref bean="DataType" />
      </property>
   </bean>
   <bean id="AddressMetadata" class="lightbase.applications.#Application.Name#.config.AddressMetadata">
      <constructor-arg name="ApplicationConfig">
         <ref bean="ApplicationConfig"/>
      </constructor-arg>
   </bean>

</beans>
[UPDATE] That isn't the full XML - got truncated for some reason. I've attached the files so you can compare. If you think typing this is bad, imagine changing it to (say) inject Service beans into business beans. Sure you could generate the XML, but then you have a generator to keep in synch as well.

Comments
Good Lord! The programmatic config file said "Bring it on, XML!," took out his sword, and cut Mr. X to pieces.

(PS: I didn't bother reading the XML version. I'll just have to trust you on that one)
# Posted By Sam | 5/16/07 10:24 AM
Why, oh why, did this presentation have to happen exactly on the day I travel. No luck for me this time. Will there be a recording available?
# Posted By Thomas Messier | 5/16/07 4:28 PM
# Posted By Peter Bell | 5/16/07 6:24 PM