<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.nofluffjuststuff.com/s/rss/">
    <title>No Fluff Just Stuff</title>
    <link>http://www.nofluffjuststuff.com</link>
    <dc:source resource="http://www.nofluffjuststuff.com" />
    <description>The best value in the Java/Open Source conferencing space hands down</description>
    <items>
      <rdf:Seq>
        <rdf:li resource="http://www.michaelnygard.com/blog/2007/05/itil_and_extreme_programming.html" />
        <rdf:li resource="http://jasonrudolph.com/blog/2007/05/19/gswg-source-code-now-updated-for-grails-05/" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=47615df9-fcfe-45db-8fe9-cc5714834699" />
        <rdf:li resource="http://javajeff.blogspot.com/2007/05/autism-visibility-continues-to-increase.html" />
        <rdf:li resource="http://javajeff.blogspot.com/2007/05/alternate-syntax-for-url-mapping-in.html" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=5151f62a-9503-4e70-b1f1-9c37778515e2" />
        <rdf:li resource="http://jroller.com/page/habuma?entry=xml_free_spring_with_spring" />
        <rdf:li resource="http://jroller.com/page/bsnyder?entry=google_calendar_in_thunderbird" />
        <rdf:li resource="http://blog.interface21.com/main/2007/05/18/spring-web-flow-java-one-2007-demo/" />
        <rdf:li resource="http://www.briangoetz.com/blog/?p=35" />
        <rdf:li resource="http://trailridgeconsulting.com/blog/?p=90" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=a9394f12-95de-4e92-aa54-2255d01d9558" />
        <rdf:li resource="http://tapestryjava.blogspot.com/2007/05/tapestry-at-javaone-2007.html" />
        <rdf:li resource="http://www.nofluffjuststuff.com/show_view.jsp?showId=102" />
        <rdf:li resource="http://tapestryjava.blogspot.com/2007/05/free-and-excellent-code-coverage-for.html" />
        <rdf:li resource="http://jroller.com/page/habuma?entry=reducing_xml_with_spring_2" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=baf62c91-6ff1-4b3b-bfce-c8fe01709710" />
        <rdf:li resource="http://www.nofluffjuststuff.com/show_view.jsp?showId=87" />
        <rdf:li resource="http://blog.interface21.com/main/2007/05/14/annotation-driven-dependency-injection-in-spring-21/" />
        <rdf:li resource="http://www.nofluffjuststuff.com/show_view.jsp?showId=89" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.michaelnygard.com/blog/2007/05/itil_and_extreme_programming.html">
    <title>Michael Nygard - ITIL and Extreme Programming</title>
    <link>http://www.michaelnygard.com/blog/2007/05/itil_and_extreme_programming.html</link>
    <dc:description>&lt;p&gt;Esther Schindler asked if I'd be willing to post my earlier article on &lt;a href="http://www.michaelnygard.com/blog/2007/05/itil_and_xp.html"&gt;staying agile in the face of ITIL&lt;/a&gt; at CIO.com.&amp;nbsp; How could I say no?&amp;nbsp; The piece is &lt;a target="_blank" href="http://advice.cio.com/mtnygard/itil_and_extreme_programming"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</dc:description>
    <dc:date>Mon, 21 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jasonrudolph.com/blog/2007/05/19/gswg-source-code-now-updated-for-grails-05/">
    <title>Jason Rudolph - GSwG Source Code Now Updated for Grails 0.5</title>
    <link>http://jasonrudolph.com/blog/2007/05/19/gswg-source-code-now-updated-for-grails-05/</link>
    <dc:description>Grails 0.5 was a huge release, and you&amp;#8217;re bound to come across some of its many enhancements in any app you build.  If you&amp;#8217;ve installed 0.5 and you&amp;#8217;re using it as you work through Getting Started with Grails (GSwG), there are a few new resources to assist you in that endeavor.  &#xD;
&lt;br&gt;&#xD;
&lt;br&gt;First up, [...]</dc:description>
    <dc:date>Sun, 20 May 2007 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=47615df9-fcfe-45db-8fe9-cc5714834699">
    <title>Venkat Subramaniam - It's not the languages, but their idioms that matter</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=47615df9-fcfe-45db-8fe9-cc5714834699</link>
    <dc:description>Some things that you can say eloquently in one (human) language, may not sound&lt;br&gt;
as nice when you translate to another language. Idioms add spice to conversations
in a language&lt;br&gt;
(and when overused they turn into cliches). Idioms don't take the aggregated meaning
of the&lt;br&gt;
words that make them. Their meaning's shaped by culture, tradition, and history.&lt;br&gt;
&lt;br&gt;
Idioms make learning a language interesting, tricky, and fun.&lt;br&gt;
One of the challenges of picking up a language is learning the idioms.&lt;br&gt;
&lt;br&gt;
The same applies to computer languages as well. Their "idioms" make them fun to learn.&lt;br&gt;
&lt;br&gt;
You may accomplish a task in a number of ways in a language. When you're new, you
may try out&lt;br&gt;
some ways you're used to in other languages. Learning that "language way" of doing
things is, however,&lt;br&gt;
exciting. We need to take the time to learn the idiomatic differences and there in
lies the fun.&lt;br&gt;
&lt;br&gt;
Here is a little swing code in Java (I can reduce this to one method and use anonymous
inner classes&lt;br&gt;
for the event handler, but Groovy would choke on that, so I decided to keep the code
like below for&lt;br&gt;
the purpose of this example).&lt;br&gt;
&lt;br&gt;
import javax.swing.*;&lt;br&gt;
import java.awt.event.*;&lt;br&gt;
import java.util.Date;&lt;br&gt;
&lt;br&gt;
public class SwingIt implements ActionListener&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; JLabel myLabel;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent ae)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel.setText(new Date().toString());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void showExample()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; JFrame frame = new JFrame();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setTitle("Swing It");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setLayout(new java.awt.FlowLayout());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setSize(300, 200);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel = new JLabel("Test");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; JButton myButton = new JButton("Click Me");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myButton.addActionListener(this);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.getContentPane().add(myLabel);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.getContentPane().add(myButton);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setVisible(true);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; new SwingIt().showExample();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
[&lt;br&gt;
Like I said above, I can eliminate the actionPerformed method in SwingIt class and
replace&lt;br&gt;
the event listener code as:&lt;br&gt;
&lt;br&gt;
myButton.addActionListener( new ActionListener()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent ae)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel.setText(new Date().toString());
// This will require myLabel to be declared final in showExample&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
)&lt;br&gt;
&lt;br&gt;
]&lt;br&gt;
&lt;br&gt;
The above code pops up a frame with a label and button.&lt;br&gt;
When you click on the button, it displays the current date and time in the label.&lt;br&gt;
&lt;br&gt;
Almost all Java code is Groovy code. So you can literally copy the above file to&lt;br&gt;
SwingIt.groovy and type groovy SwingIt.groovy to execute the code in Groovy. 
&lt;br&gt;
&lt;br&gt;
But, that's no fun. We've not really seen the Groovy way of doing that.&lt;br&gt;
So, let's start by stripping out code that's not needed, after all, Groovy is&lt;br&gt;
a light weight language with high signal-to-noise ratio. Also, we will make some&lt;br&gt;
slight changes to the way we will write the event handler addActionListener.&lt;br&gt;
So, here is the modified code SwingIt2.groovy:&lt;br&gt;
&lt;br&gt;
import javax.swing.*&lt;br&gt;
import java.awt.event.*&lt;br&gt;
&lt;br&gt;
JFrame frame = new JFrame()&lt;br&gt;
frame.setTitle("Swing It")&lt;br&gt;
frame.setLayout(new java.awt.FlowLayout())&lt;br&gt;
frame.setSize(300, 200)&lt;br&gt;
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)&lt;br&gt;
&lt;br&gt;
myLabel = new JLabel("Test")&lt;br&gt;
&lt;br&gt;
JButton myButton = new JButton("Click Me")&lt;br&gt;
myButton.addActionListener( { myLabel.setText(new Date().toString()) } as ActionListener
)&lt;br&gt;
&lt;br&gt;
frame.getContentPane().add(myLabel)&lt;br&gt;
frame.getContentPane().add(myButton)&lt;br&gt;
&lt;br&gt;
frame.setVisible(true)&lt;br&gt;
&lt;br&gt;
The code that catches my eyes is&lt;br&gt;
myButton.addActionListener( { myLabel.setText(new Date().toString()) } as ActionListener
)&lt;br&gt;
&lt;br&gt;
Here the code block within {} is treated to implement the ActionListener interface.&lt;br&gt;
&lt;br&gt;
Can we do better? Groovy provides markup builders and there's one for Swing (think
of this&lt;br&gt;
as DSL for Swing in Groovy). Here's SwingIt3.groovy:&lt;br&gt;
&lt;br&gt;
bldr = new groovy.swing.SwingBuilder()&lt;br&gt;
frame = bldr.frame(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; title: "Swing It",&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; layout: new java.awt.FlowLayout(),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; size: [300, 200],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; defaultCloseOperation: javax.swing.WindowConstants.EXIT_ON_CLOSE)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel = label(text: 'Test')&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myButton = button(text: 'Click Me', actionPerformed: { myLabel.setText(new
Date().toString()) } )&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
frame.setVisible(true)&lt;br&gt;
&lt;br&gt;
I was chatting with &lt;a href="http://memeagora.blogspot.com" target="_blank"&gt;Neal&lt;/a&gt; this
afternoon, and he mentioned &lt;a href="http://www.paulgraham.com/power.html" target="_blank"&gt; Paul
Graham's discussion on Language Succinctness&lt;/a&gt;.&lt;br&gt;
Groovy code is more succinct than Java code.&lt;br&gt;
&lt;br&gt;
How would the code look like in JavaScript (With Java 6 and JSR 223, you can write
Java-platform code in one of&lt;br&gt;
several different languages including JavaScript)? Let's take a look.&lt;br&gt;
&lt;br&gt;
var swingpkg = new JavaImporter(javax.swing, java.awt, java.io, java.lang)&lt;br&gt;
&lt;br&gt;
with(swingpkg)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var frame = new JFrame()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.title = "Swing It"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setLayout(new FlowLayout())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setSize(300, 200)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel = new JLabel("Test")&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.getContentPane().add(myLabel)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myButton = new JButton("Click Me")&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myButton.addActionListener(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function() { myLabel.text = new Date().toString()
}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.getContentPane().add(myButton)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; frame.setVisible(true)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(10000)&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
To run the above code, copy it into SwingIt.js and run jrunscript SwingIt.js (I'm
running Java 6 for this).&lt;br&gt;
&lt;br&gt;
The code that caught I eyes here is:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myButton.addActionListener( function() { myLabel.text = new Date().toString()
} )&lt;br&gt;
&lt;br&gt;
How about trying this same example in JRuby? Here is SwingIt.rb. To run it type jruby
SwingIt.rb:&lt;br&gt;
&lt;br&gt;
require 'java'&lt;br&gt;
&lt;br&gt;
module Java&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; include_package 'javax.swing'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; include_package 'java.awt'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; include_package 'java.awt.event'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; include_package 'java.util'&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
my_label = Java::JLabel.new('Test')&lt;br&gt;
my_button = Java::JButton.new('Click Me')&lt;br&gt;
&lt;br&gt;
my_button.addActionListener(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Java::ActionListener.impl { |name, *args| my_label.text = Java::Date.new.toString()
}&lt;br&gt;
)&lt;br&gt;
&lt;br&gt;
frame = Java::JFrame.new&lt;br&gt;
frame.setSize(300, 200)&lt;br&gt;
frame.setLayout(Java::FlowLayout.new)&lt;br&gt;
frame.getContentPane().add(my_label)&lt;br&gt;
frame.getContentPane().add(my_button)&lt;br&gt;
frame.setVisible(true)&lt;br&gt;
&lt;br&gt;
Here the code that caught my eyes is:&lt;br&gt;
&lt;br&gt;
my_button.addActionListener(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Java::ActionListener.impl { |name, *args| my_label.text = Java::Date.new.toString()
}&lt;br&gt;
)&lt;br&gt;
&lt;br&gt;
Let's take a look at the event handling code in these languages:&lt;br&gt;
&lt;br&gt;
Java:&lt;br&gt;
&lt;br&gt;
myButton.addActionListener( new ActionListener()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void actionPerformed(ActionEvent ae)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; myLabel.setText(new Date().toString());
// This will require myLabel to be declared final in showExample&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
)&lt;br&gt;
&lt;br&gt;
Groovy:&lt;br&gt;
&lt;br&gt;
myButton.addActionListener( { myLabel.setText(new Date().toString()) } as ActionListener
)&lt;br&gt;
&lt;br&gt;
or&lt;br&gt;
&lt;br&gt;
myButton = button(text: 'Click Me', actionPerformed: { myLabel.setText(new Date().toString())
} )&lt;br&gt;
&lt;br&gt;
JavaScript:&lt;br&gt;
&lt;br&gt;
myButton.addActionListener( function() { myLabel.text = new Date().toString() } )&lt;br&gt;
&lt;br&gt;
JRuby:&lt;br&gt;
&lt;br&gt;
my_button.addActionListener( Java::ActionListener.impl { |name, *args| my_label.text
= Java::Date.new.toString() } )&lt;br&gt;
&lt;br&gt;
All these code do the same thing. However, each of them is idiomatically different
(eloquent) in their own languages.&lt;br&gt;
Writing Java code in Groovy (or JRuby) is like me trying to translate an idiom from
my mother tongue Tamil to English.&lt;br&gt;
That generally sounds real awkward and loses the essence. To say it in English, I
would simply choose to use plain English&lt;br&gt;
or find a suitable English idiom. Like wise, we need to figure out the idiomatic way
in languages we choose. And that is&lt;br&gt;
what keeps me excited and I hope it does you as well.&lt;br&gt;
&lt;hints id="hah_hints"&gt;
&lt;/hints&gt;
&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=47615df9-fcfe-45db-8fe9-cc5714834699"&gt;</dc:description>
    <dc:date>Sun, 20 May 2007 13:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://javajeff.blogspot.com/2007/05/autism-visibility-continues-to-increase.html">
    <title>Jeff Brown - Autism Visibility Continues To Increase</title>
    <link>http://javajeff.blogspot.com/2007/05/autism-visibility-continues-to-increase.html</link>
    <dc:description>&lt;a href="http://www.doverspeedway.com/"&gt;Dover Speedway&lt;/a&gt; has announced that the &lt;a href="http://www.nascar.com/series/cup/"&gt;NEXTEL Cup&lt;/a&gt; race coming up there in June will be named  ?&lt;a href="http://tinyurl.com/yvts4v"&gt;The Autism Speaks 400 presented by Visa&lt;/a&gt;?.  NEXTEL Cup racing is huge here in North America and has a very large fan base.  &lt;a href="http://www.autismspeaks.org/"&gt;Autism Speaks&lt;/a&gt; is one of the largest foundations in the world that is dedicated to autism.  I am happy to see them get their name on the marquee of an event like this.  That can only help with awareness.&lt;br /&gt;&lt;br /&gt;This is not the first time that autism and automobile racing have crossed paths.  &lt;a href="http://www.jamiemcmurray.com/"&gt;Jamie McMurray&lt;/a&gt; has an autistic niece and partnered with &lt;a href="http://www.autism-society.org/"&gt;The Autism Society of American&lt;/a&gt; in 2004 when he drove the ?Drive For A Cure? car.  &lt;a href="http://en.wikipedia.org/wiki/Tony_Renna"&gt;Tony Renna&lt;/a&gt; drove the ?&lt;a href="http://www.cureautismnow.org/"&gt;Cure Autism Now&lt;/a&gt;? car in 2003.  There have been others.&lt;br /&gt;&lt;br /&gt;It has been almost exactly 5 years since my youngest son Jake was diagnosed autistic.  In those 5 years I have learned a number of things about autism and one of those things that I have learned is that there are not a lot of people who know much about autism.  Awareness is increasing.  That isn't because more people are reading medical journals in their free time.  Aside from a dramatic increase in the number of kids being diagnosed autistic, the biggest reason that awareness is increasing is that more and more autism is showing up in the mainstream media.  Recently some actors and other celebrities have been criticized for jumping on the ?autism bandwagon?.  These criticisms often refer to autism as the disease du jour.  I don't have much to say about that except to say that raising awareness is an important part of this fight and when I see people going out of their way to help with awareness, I am happy to see that.</dc:description>
    <dc:date>Sun, 20 May 2007 11:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://javajeff.blogspot.com/2007/05/alternate-syntax-for-url-mapping-in.html">
    <title>Jeff Brown - Alternate Syntax For URL Mapping In Grails</title>
    <link>http://javajeff.blogspot.com/2007/05/alternate-syntax-for-url-mapping-in.html</link>
    <dc:description>One of the cool new features that was introduced with &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.5 is &lt;a href="http://grails.org/URL+mapping"&gt;Custom URL Mapping&lt;/a&gt;.  The syntax for declaring the mapping looks something like this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyUrlMappings {&lt;br /&gt;  static mappings = {&lt;br /&gt;    "/product/$id" {&lt;br /&gt;       controller = "product"&lt;br /&gt;       action = "show"&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;     "/$blog/$year/$month/$id" {&lt;br /&gt;          controller = "blog"&lt;br /&gt;          action = "show"&lt;br /&gt;          constraints {&lt;br /&gt;               year(matches:/\d{4}/)&lt;br /&gt;               month(matches:/\d{2}/)&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since the release we have added support for an alternate syntax (which I happen to like) that looks like this...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyUrlMappings {&lt;br /&gt;  static mappings = {&lt;br /&gt;    "/product/$id" (controller:"product", action:"show")&lt;br /&gt;&lt;br /&gt;     "/$blog/$year/$month/$id" (controller:"blog", action:"show"){&lt;br /&gt;          constraints {&lt;br /&gt;               year(matches:/\d{4}/)&lt;br /&gt;               month(matches:/\d{2}/)&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dynamic languages like Groovy make these sorts of things really easy to support.  Behind the scenes of this url mapping there there is no grammar file and no tangly parser to manage.  The configuration file is plain old groovy code.  Blurring the line between code and configuration files by using a DSL like this is so much easier in Groovy that it might be in a language like C++ or Java.  You have got to love it.  :)</dc:description>
    <dc:date>Sun, 20 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=5151f62a-9503-4e70-b1f1-9c37778515e2">
    <title>Venkat Subramaniam - What's that Unit to test?</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=5151f62a-9503-4e70-b1f1-9c37778515e2</link>
    <dc:description>Earlier this week I was in Canada teaching a Test Driven Development course. The team was great?very interactive and passionate.&lt;br&gt;
Unit Testing is very valuable, but I would be lying if I said it's easy. It takes
effort to get good unit test written.&lt;br&gt;
&lt;br&gt;
A Unit Test is written on a Unit of code (yes, duh!) But, what's a unit of code?&lt;br&gt;
&lt;br&gt;
A unit of code is smallest piece of code that does useful work.&lt;br&gt;
&lt;br&gt;
Getters and setters usually are smallest piece of code, but often don't do much useful
work (languages like&lt;br&gt;
Ruby and Groovy generate them for you automatically, but that is for another blog).
So, I would not&lt;br&gt;
care to get them unit tested separately (they may get called in other tests, and that's
OK).&lt;br&gt;
&lt;br&gt;
What about a method that has a long running task or that has to wait for an event
that may happen at any time?&lt;br&gt;
Sure it's doing useful work, but it may not be "small." Chances are you can break
it into smaller methods, 
&lt;br&gt;
where the method then may wait for an event, but when the event is received, can then
call another (small)&lt;br&gt;
method that does useful work. In this case, I am quite happy unit testing this small
method that does the useful&lt;br&gt;
work first and not worry about the event part yet.&lt;br&gt;
&lt;br&gt;
Don't we need to unit test the event receiving? We would separate the part that's
waiting for the event into may be&lt;br&gt;
another small method, put in a mock for the event source if needed and have the event
receipt unit tested. But,&lt;br&gt;
I would take that as the second or third test, not the first.&lt;br&gt;
&lt;br&gt;
When writing unit testing, some times we want to start testing everything we can think
of. Sure, we are eager to have&lt;br&gt;
the functionality tested, in its entirety. But, that leads to two problems. We will
find it very hard to comprehend&lt;br&gt;
the testing. We may write a large test. We may also overly complicating the solution
in the process.&lt;br&gt;
&lt;br&gt;
Keep it small, keep it focused, fast, and automated. That is easier to say, but on
a real project, can it get hard?&lt;br&gt;
Yes it does. When that happens, take a short break. Stepping away from the code helps
us think. Ask for help?find a 
&lt;br&gt;
colleague and bounce some ideas. While you are trying to explain the problem, you
go though logical steps in your mind&lt;br&gt;
and this often helps you to figure out an approach.&lt;br&gt;
&lt;br&gt;
And once you think you've figured it out, ask your coworker to do a quick code review,
not just the code, but the test&lt;br&gt;
also. You only stand to improve you code this way. Any who does not want to improve?
:)&lt;hints id="hah_hints"&gt;
&lt;/hints&gt;
&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=5151f62a-9503-4e70-b1f1-9c37778515e2"&gt;</dc:description>
    <dc:date>Sat, 19 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jroller.com/page/habuma?entry=xml_free_spring_with_spring">
    <title>Craig Walls - XML-free Spring with Spring 2.1 and annotations</title>
    <link>http://jroller.com/page/habuma?entry=xml_free_spring_with_spring</link>
    <dc:description>&lt;p&gt;As a followup to &lt;a href="http://jroller.com/page/habuma?entry=reducing_xml_with_spring_2"&gt;yesterday's post&lt;/a&gt; about using Spring 2.1's annotation injection, I'm now ready to show you how to get rid of the XML altogether.&lt;/p&gt;

&lt;p&gt;When we last saw our Spring XML file (ctx.xml in the &lt;a href="http://www.habuma.com/spring/knight-spring-2.1.zip"&gt;downloadable example&lt;/a&gt;), it looked like this:&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd"&amp;gt;

  &amp;lt;context:component-scan
      base-package="com.springinaction.chapter01.knight" /&amp;gt;

  &amp;lt;aop:aspectj-autoproxy/&amp;gt;

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;I had eliminated all of the app-specific beans ("knight", "quest", "minstrel") and had replaced them with only two infrastructural elements. &amp;lt;context:component-scan&amp;gt; to automatically scan for and load classes annotated with @Component, @Repository, or @Aspect; and &amp;lt;aop:aspectj-autoproxy&amp;gt; to automatically create proxies for any beans annotated with @Aspect.&lt;/p&gt;

&lt;p&gt;You can now delete that XML file...we won't be needing it anymore. We can get the same behavior of &amp;lt;context:component-scan&amp;gt; by changing the main() method to look like this:&lt;/p&gt;

&lt;pre class="code"&gt;
package com.springinaction.chapter01.knight;

import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.support.GenericApplicationContext;

public class KnightApp {
  public static void main(String[] args) throws Exception {
    GenericApplicationContext ctx = new GenericApplicationContext();
    ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(ctx);
    scanner.scan("com.springinaction.chapter01.knight");
    ctx.refresh();

    Knight knight = (Knight) ctx.getBean("knight");
    knight.embarkOnQuest();
  }
}
&lt;/pre&gt;

&lt;p&gt;Previously, I was using a ClassPathXmlApplicationContext to load the Spring definition from an XML file in the classpath. But since the XML is going away completely, we won't need that application context class anymore. This time I'm using GenericApplicationContext...it doesn't load anything. Instead, we'll load it using ClassPathBeanDefinitionScanner.&lt;/p&gt;

&lt;p&gt;ClassPathBeanDefinitionScanner does the work of &amp;lt;context:component-scan&amp;gt; scanning the com.springinaction.chapter01.knight package for classes that are annotated with @Component, @Repository, or @Aspect. When it finds them, it automatically registers them in the Spring context.&lt;/p&gt;

&lt;p&gt;After the context has been loaded with all of the bean definitions, I refresh the context to be sure that all of the wiring takes place. Without calling refresh(), the beans are loaded, but not wired together.&lt;/p&gt;

&lt;p&gt;Finally, I retrieve the knight bean from the context and invoke the embarkOnQuest() method.&lt;/p&gt;

&lt;p&gt;If you run this, you'll notice that the Minstrel aspect doesn't get woven. I haven't figured that one out yet, but I'm really close. Stay tuned. In the meantime, you can download the XML-free version from &lt;a href="http://www.habuma.com/spring/knight-spring-2.1-noxml.zip"&gt;here&lt;/a&gt;. After unzipping it, notice that aside from the Maven POM file, there's no XML to be found in the entire project.&lt;/p&gt;

&lt;p&gt;Disclaimer P.S.: As I've stated before, I have no problems with Spring XML and still prefer to configure my Spring apps this way. But I also enjoy trying out the other configuration options and letting my readers choose for themselves.&lt;/p&gt;</dc:description>
    <dc:date>Fri, 18 May 2007 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jroller.com/page/bsnyder?entry=google_calendar_in_thunderbird">
    <title>Bruce Snyder - Google Calendar in Thunderbird</title>
    <link>http://jroller.com/page/bsnyder?entry=google_calendar_in_thunderbird</link>
    <dc:description>&lt;p&gt;
&lt;img src="http://www.mozilla.com/img/thunderbird-logo-64x64.png" align="right" /&gt;&lt;br /&gt;
&lt;img src="http://jroller.com/resources/b/bsnyder/google_calendar.gif" alight="right" /&gt;
Ever since &lt;a href="http://calendar.google.com/"&gt;Google Calendar&lt;/a&gt; was released, I've been in search of a way to integrate it with &lt;a href="http://www.mozilla.com/en-US/thunderbird/"&gt;Mozilla Thunderbird&lt;/a&gt; or &lt;a href="http://www.apple.com/macosx/features/ical/"&gt;Apple iCal&lt;/a&gt; to allow birectional updates. 
&lt;/p&gt;

&lt;p&gt;
Right away I was able to subscribe to my Google Calendar from iCal, but I'm not able to update my Google Calendar from within iCal. This is a real pain because now I'm keeping both an iCal calendar and a Google calendar and they're completely separate. Up until today, I've always wondered if this is a problem with iCal or with Google Calendar. In speaking to people, including a friend at Apple who works on the Darwin Calendar server, it turns out that it's a because the iCalendar spec in that it was never built to allow collaborative calendaring. This is where the &lt;a href="http://ietf.osafoundation.org/caldav/index.html"&gt;CalDav&lt;/a&gt; spec comes in - but that's a different story entirely (and &lt;a href="http://www.mozilla.org/projects/calendar/lightning/"&gt;Mozilla Lightning&lt;/a&gt; even supports CalDav!). 
&lt;/p&gt;

&lt;p&gt;
Well today I discovered that there is an integration with Thunderbird via &lt;a href="http://www.mozilla.org/projects/calendar/lightning/"&gt;Mozilla Lightning&lt;/a&gt; with the Google Calendar - and it's bidirectional! There is even a &lt;a href="http://bfish.xaedalus.net/?p=239"&gt;visual howto with screenshots&lt;/a&gt; which is pretty handy (nice work, Jonny). I've already tested it to verify that I can update the Google Calendar from within Lightning and it works beautifully. 
&lt;/p&gt;

&lt;p&gt;
This is the first time I've tried Lightning and it seems fairly basic. Hopefully the features will improve over time. Many, many people have been waiting for the Mozilla Foundation to create a competing product to Microsoft LookOut for many years and it seems like it's finally beginning to appear. 
&lt;/p&gt;</dc:description>
    <dc:date>Fri, 18 May 2007 13:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://blog.interface21.com/main/2007/05/18/spring-web-flow-java-one-2007-demo/">
    <title>Mark Fisher - Spring Web Flow Java One 2007 Demo</title>
    <link>http://blog.interface21.com/main/2007/05/18/spring-web-flow-java-one-2007-demo/</link>
    <dc:description>&lt;a href="http://blog.interface21.com/main/author/keithd/" title="Posts by Keith Donald"&gt;&lt;img src='http://blog.interface21.com/main/wp-content/images/authors/keithd.jpg' alt='Keith Donald' title='Keith Donald' align="right" hspace="10px" /&gt;&lt;/a&gt;&lt;p&gt;When Sun scheduled my JavaOne 2007 session on Spring Web Flow for Friday, the last day of the conference, I wasn&amp;#039;t sure what to expect.  I was honored to have been accepted again this year, but I wondered what I would see in terms of attendance presenting on the last day of the 4-day conference.&lt;/p&gt;
&lt;p&gt;I could not have been more pleased with how things transpired.  When I checked in at speaker setup on Thursday 800 people had pre-registered for my Friday session.  Fifteen minutes before my talk was to begin the room had reached that number.  In the end, 1000 JavaOne attendees came to room 307-310 of the Moscone center to experience an adrenaline-powered Spring Web Flow test drive.&lt;/p&gt;
&lt;h3&gt;Spring Web Flow Test Drive&lt;/h3&gt;
&lt;p&gt;In this blog I am hoping to re-create some the best parts of my JavaOne Web Flow presentation.  Checkout the screen cast below to see what was personally the most exhiliterating part of the presentation for me&amp;#8211;building out a search flow from the ground up for deployment in a Java Server Faces (JSF) environment.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;object width="425" height="350"&gt;&lt;br /&gt;
&lt;param name="movie" value="http://www.youtube.com/v/N5l_CN-zD74"&gt; &lt;/param&gt; &lt;embed src="http://www.youtube.com/v/N5l_CN-zD74" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;When watching the screen cast note how Web Flow manages all navigation and state for the application, while standard JSF components care for view rendering and model data binding.  It really is a nice fit.  Also note even when I screw something up I can quickly fix it and get back to work because I never need to restart my server or switch my editor.&lt;/p&gt;
&lt;p&gt;The Spring IDE visualization of this flow is below:&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://blog.interface21.com/main/wp-content/uploads/2007/05/search-flow.png" alt="Search flow" /&gt;
&lt;/p&gt;
&lt;p&gt;Get the code for this demo &lt;a href="http://static.springframework.org/spring-webflow/resources/phonebook-jsf/phonebook-webflow-jsf.zip"&gt;here&lt;/a&gt;.  If you are using Eclipse with Web Tools you can import phonebook as an Dynamic Web Project and fire up the webapp inside your IDE.
&lt;/p&gt;</dc:description>
    <dc:date>Fri, 18 May 2007 11:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.briangoetz.com/blog/?p=35">
    <title>Brian Goetz - JCiP best seller at JavaOne 2007</title>
    <link>http://www.briangoetz.com/blog/?p=35</link>
    <dc:description>&lt;p&gt;For the second year in a row, &lt;a href="http://www.amazon.com/gp/product/0321349601?ie=UTF8&amp;#038;tag=none0b69&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=9325&amp;#038;creativeASIN=0321349601"&gt;Java Concurrency in Practice&lt;/a&gt; was the best selling book at the JavaOne bookstore&amp;#8230;thanks everyone!
&lt;/p&gt;</dc:description>
    <dc:date>Fri, 18 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://trailridgeconsulting.com/blog/?p=90">
    <title>Pete Behrens - Carnival of Agilists - 5/17/07</title>
    <link>http://trailridgeconsulting.com/blog/?p=90</link>
    <dc:description>&lt;p&gt;Welcome to the most recent edition of the Carnival of Agilists - a blog roll of some of the thoughts, insights, ideas and trends in the agile (and post-agile) communities. In continuing with the free-form format of our last couple of carnival posters and our first topic on post-agile, I have freed myself from the agile manifesto structure as well - freedom!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jason Gorman&lt;/strong&gt; and &lt;strong&gt;Jonathon Kohl&lt;/strong&gt; are revoicing their skepticism on the current Agile (capital A) movement hype and wanting to find a better place to do just what works for you in their recent postings on &lt;a href="http://parlezuml.com/blog/?postid=407"&gt;Post-Agilism Explained&lt;/a&gt; and &lt;a href="http://www.kohl.ca/blog/archives/000184.html"&gt;Post Agilism Frequently Asked Questions&lt;/a&gt;. I say &amp;#8216;revoicing&amp;#8217; because this was started over a year ago. Has Agile (capital A) hyped out the benefits of agile (lowercase a)? While this may be true in the microcosm deep in the agile community - I still find too many people who haven&amp;#8217;t even heard of agile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ester Derby&lt;/strong&gt; is confused by all of the talk about whether everyone on an agile team needs to be above average as she asks if we should &lt;a href="http://www.estherderby.com/weblog/2007/05/focus-on-individual-or-system.html"&gt;Focus on the individual or the system&lt;/a&gt;? Thanks Esther for pointing us back to the lean principle of optimizing the whole system and not locally optimizing its parts as we often tend to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diana Larson&lt;/strong&gt; provides a quick method in gathering/prioritizing team retrospective feedback using FRequency &amp;amp; IMpact with &lt;a href="http://www.futureworksconsulting.com/blog/2007/04/27/frim-another-way-to-gather-data/"&gt;FRIM: Another way to gather data&lt;/a&gt;. This is another great visualization tool that I plan to try out on my next team retrospective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;James Shore&lt;/strong&gt; continues to make progress on his new book &lt;a href="http://www.jamesshore.com/Agile-Book/"&gt;The Art of Agile Development&lt;/a&gt;. He has generously posted most of his work online during the writing stages for you to absorb and respond. James, thanks for reminding us of the agile value of openness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ron Jeffries and Chet Hendrickson&lt;/strong&gt; invite you to &lt;a href="http://xprogramming.com/xpmag/FiveDays.htm"&gt;Five Days of Software Development with Style and Grace&lt;/a&gt;. This proves to be the experience of a lifetime for any (well, Java) developer!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mike Cohn&lt;/strong&gt; provides some &lt;a href="http://www.scrumalliance.org/articles/46-advice-on-conducting-the-scrum-of-scrums-meeting"&gt;Advice on Conducting the Scrum of Scrums Meeting&lt;/a&gt; in scaling scrum across a larger organization.&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bernie Thompson&lt;/strong&gt; started a new blog and discusses post-agile with the essential principle that allows lean to be something more than agile - &lt;a href="http://leansoftwareengineering.com/2007/04/22/schedule-is-orthogonal-to-workflow/"&gt;Schedule is orthogonal to workflow&lt;/a&gt;. Scrum, being the closest to lean thinking separates workflow and re-enforces independent work items.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://agile2007.com/index.php?page=schedule/&amp;amp;date=2007-08-14"&gt;Agile 2007 Conference Schedule&lt;/a&gt; has now been published. There are a tremendous number of sessions over the course of 5 days in August. I would highly suggest attending some or all of the event.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Previous Editions&lt;/strong&gt;&lt;br /&gt;
All previous editions of the Carnival are referenced at the &lt;a href="http://www.agilealliance.org/show/1670"&gt;Agile Alliance website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Join in the Fun!&lt;/strong&gt;&lt;br /&gt;
Have something that you think is worth sharing? Don?t be shy! We love new ideas and insights. Send us a link to your post at &lt;a href="mailto:agilists.carnival@gmail.com"&gt;agilists.carnival@gmail.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Future editions will be on the first and third Thursday of each month. If you would like to participate, please send us a link to your post at &lt;a href="mailto:agilists.carnival@gmail.com" title="Link outside of this blog"&gt;mailto:agilists.carnival@gmail.com&lt;/a&gt; Or, if you prefer, use this handy dandy &lt;a href="http://blogcarnival.com/bc/submit_115.html" title="Submit an entry to ?carnival of the agilists?"&gt;carnival submission form&lt;/a&gt;.&lt;/p&gt;</dc:description>
    <dc:date>Thu, 17 May 2007 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=a9394f12-95de-4e92-aa54-2255d01d9558">
    <title>Venkat Subramaniam - Going to Grails Exchange</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=a9394f12-95de-4e92-aa54-2255d01d9558</link>
    <dc:description>&lt;a href="http://www.grails-exchange.com/pcd/1010" title="Venkat Subramaniam at Grails eXchange 2007" alt="grails,groovy,java ee, grails exchange" target="_blank"&gt;&lt;img title="Venkat Subramaniam at Grails eXchange 2007" alt="groovy, grails, java ee, grails exchange" src="http://www.grails-exchange.com/custom/images/Grails-exchange-im-speaking-@-280-84.jpg" border="0"&gt;&lt;/a&gt; &lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=a9394f12-95de-4e92-aa54-2255d01d9558"&gt;</dc:description>
    <dc:date>Thu, 17 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://tapestryjava.blogspot.com/2007/05/tapestry-at-javaone-2007.html">
    <title>Howard Lewis Ship - Tapestry at JavaOne 2007</title>
    <link>http://tapestryjava.blogspot.com/2007/05/tapestry-at-javaone-2007.html</link>
    <dc:description>&lt;p&gt;
JavaOne was a lot of fun this year; I didn't arrive in time for the JavaFX keynote, but I understood it to be underwhelming.  Yep ... that's what Java needs ... to take on Adobe &lt;em&gt;and&lt;/em&gt; Microsoft in Adobe's home territory.

&lt;p&gt;
On the other hand, this was a very &lt;em&gt;social&lt;/em&gt; JavaOne; lots of good conversations and meeting with people I only know online.


&lt;p&gt;
I also attended the &lt;a href="http://weblogs.java.net/blog/edburns/archive/2007/05/jsf_20_eg_kick.html"&gt;Java Server Faces 2.0 Expert Group kickoff&lt;/a&gt;. I can't really see where that's going to go, alas. It's not like everyone bowed down and said "JSF 2.0 shall be Tapestry" (not even Jacob Hookom, who does see Tapestry as a good model for much of JSF 2.0). But I did get a chance to chat with Gavin King ... about motorcycles. He's riding a Ducati now, and I'm thinking about picking up a new bike once I buy a house.  Gavin --- I used to ride a Yamaha FZR1000.

&lt;p&gt;
The best part of the JSF meeting was when &lt;a href="http://blogs.sun.com/jonathan/"&gt;Jonathan Swartz&lt;/a&gt; stopped by. We shook hands and talked about how slow adoption of JCP standards.

&lt;p&gt;
Elsewhere ... the fun part about the RubyEnv parody ad ...

&lt;p&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PQbuyKUaKFo"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/PQbuyKUaKFo" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;




&lt;p&gt;
... is that Tapestry is jar #3.  Interesting, though I guess it's hard to know what "JSF in a Jar" looks like, or "Struts in a Jar" for that matter. My intention is to reverse the meaning, make Tapestry 5 something that'll make the Ruby guys envious. We'll see.</dc:description>
    <dc:date>Wed, 16 May 2007 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.nofluffjuststuff.com/show_view.jsp?showId=102">
    <title>Northern Wisconsin Software Symposium - Aug. 03 - 05, 2007</title>
    <link>http://www.nofluffjuststuff.com/show_view.jsp?showId=102</link>
    <dc:description>&lt;div style="font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 10pt;"&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
No Fluff Just Stuff is pleased to announce the &lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_view.jsp?showId=102" target="new"&gt;Northern Wisconsin Software Symposium&lt;/a&gt;, Aug. 03 - 05, 2007.&#xD;
&lt;/p&gt;&#xD;
&#xD;
	&lt;div style="background-color: #0860A9; color: #EFCE52; font-weight: bold; padding: 5px 5px 5px 5px;"&gt;&#xD;
		&lt;em&gt;Catch these Featured Sessions&lt;/em&gt;&#xD;
	&lt;/div&gt;&#xD;
&#xD;
	&lt;div style="border: 1px solid #999999; padding: 0 5px 0 5px;"&gt;&#xD;
&#xD;
	&lt;table cellpadding="0" cellspacing="0" style="font-size: 10pt;"&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7296&amp;showId=102" target="new"&gt;Running Tested Features&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Kirk Knoernschild&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=893" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/893_Knoernschild_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				Running Tested Features is a metric used to measure the delivery of running, tested features to business clients, and collect their feedback. The idea is simple. Break the software down into features that represent observable value to the business. For each feature, create one or more automated acceptance tests that validate the feature. Consolidate all features into a single, integrated product and continuously execute the automated acceptance tests. At any given moment, the project team should know the number of features that are passing all acceptance tests. This number represents the RTF metric. &#xD;
&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7270&amp;showId=102" target="new"&gt;Guerilla Unit Testing Part 1: TestNG with Code Coverage&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Howard Lewis Ship&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=31" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/31_Lewis_Ship_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				Part one (of two) coverts the TestNG unit testing framework, and shows how it integrates with tools such as Emma or Cobertura (for code coverage) and Selenium (for integration testing).&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7254&amp;showId=102" target="new"&gt;Test Infecting the Legacy Organization&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Nathaniel Schutta&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=1314" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/1314_Schutta_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				When starting a new project, most developers make sure that testing is a priority. However, only the lucky few live in the idyllic world of greenfield development; the vast majority of us must contend with code written when "test" was a four letter word and testing was the sole responsibility of that "other" organization. We'll examine some techniques for introducing testing - not just to your code but to the rest of your development organization.&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;/table&gt;&#xD;
&#xD;
	&lt;/div&gt;&#xD;
&#xD;
&lt;/div&gt;</dc:description>
    <dc:date>Wed, 16 May 2007 15:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://tapestryjava.blogspot.com/2007/05/free-and-excellent-code-coverage-for.html">
    <title>Howard Lewis Ship - Free and Excellent Code Coverage for Eclipse</title>
    <link>http://tapestryjava.blogspot.com/2007/05/free-and-excellent-code-coverage-for.html</link>
    <dc:description>&lt;p&gt;
&lt;img class="inline" src="http://www.eclemma.org/images/smallscreen.gif"/&gt;
The &lt;a href="http://www.eclemma.org/"&gt;EMMA&lt;/a&gt; plugin for Eclipse is my latest addition to the "can't live without it" category.  It allows you to run applications and test suites from within Eclipse and gather code coverage ... better yet, that code coverage data is shown visibly in  your code, much as it is in an HTML Cobertura report. 

&lt;p&gt;The plugin is slick, fast, easy and non-intrusive.

&lt;p&gt;
The one thing you do need to do is &lt;a href="http://www.eclemma.org/faq.html#usage02"&gt;split your output directories&lt;/a&gt;, so that production code goes into bin, and test code goes into test-bin; this allows you to turn off coverage information for your test classes, and just gather 

&lt;p&gt;
Of course, IDEA also has code coverage, based on EMMA, built right in.</dc:description>
    <dc:date>Wed, 16 May 2007 13:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jroller.com/page/habuma?entry=reducing_xml_with_spring_2">
    <title>Craig Walls - Reducing XML with Spring 2.1 and annotations</title>
    <link>http://jroller.com/page/habuma?entry=reducing_xml_with_spring_2</link>
    <dc:description>&lt;p&gt;If you're a regular reader of this blog, then you know that I've been
spending some time exploring alternatives to Spring's XML configuration.
Although I have no specific issues with using XML to configure Spring, I
do know that some folks think that XML is a bad thing--therefore to ease
their mind, I've taken it upon myself to report about the configuration
options available to Spring developers.&lt;/p&gt;

&lt;p&gt;In case you missed the &lt;a href="http://www.interface21.com/news-home/2007/springframeworkannotations"&gt;memo&lt;/a&gt;, Spring 2.1-m1 has been released. Among
other things, Spring 2.1-m1 adds some configuration-by-annotation options
as an alternative Spring's verbose (and allegedly evil) XML configuration.&lt;/p&gt;

&lt;p&gt;To demonstrate these new annotations, I'll revisit the knight example
from chapter 1 of &lt;a href="http://astore.amazon.com/habumacom-20/detail/1933988134"&gt;&lt;i&gt;Spring in Action, Second Edition&lt;/i&gt;&lt;/a&gt;
(coming to a bookshelf near you in July). If you'd like to follow along
at home, you can download the code from &lt;a href="http://www.habuma.com/spring/knight-spring-2.1.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(Note: The example code is a Maven-ized project. You don't need Maven to follow along, but if you want the convenience of using my predefined build, you'll need to have Maven 2 installed. When you're ready to compile/run it, just type "mvn install" at the command line.)&lt;/p&gt;

&lt;p&gt;Before we get started, let's take a quick look at the current state of
the knight example's configuration XML:&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
          http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&amp;gt;
          
  &amp;lt;bean id="quest"
      class="com.springinaction.chapter01.knight.HolyGrailQuest"/&amp;gt;

  &amp;lt;bean id="knight"
      class="com.springinaction.chapter01.knight.KnightOfTheRoundTable"&amp;gt;
    &amp;lt;constructor-arg value="Bedivere" /&amp;gt;

    &amp;lt;property name="quest" ref="quest" /&amp;gt;
  &amp;lt;/bean&amp;gt;

  &amp;lt;bean id="minstrel"
      class="com.springinaction.chapter01.knight.Minstrel"/&amp;gt;

  &amp;lt;aop:config&amp;gt;
    &amp;lt;aop:aspect ref="minstrel"&amp;gt;

      &amp;lt;aop:pointcut
          id="questPointcut"
          expression="execution(* *.embarkOnQuest(..)) and target(bean)" /&amp;gt;

      &amp;lt;aop:before
          method="singBefore"
          pointcut-ref="questPointcut" 
          arg-names="bean" /&amp;gt;

      &amp;lt;aop:after-returning
          method="singAfter"
          pointcut-ref="questPointcut" 
          arg-names="bean" /&amp;gt;
    &amp;lt;/aop:aspect&amp;gt;
  &amp;lt;/aop:config&amp;gt;

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;There are only three beans and an aspect definition...not a grossly
verbose bit of XML. Nonetheless, as this article concerns configuring
Spring &lt;i&gt;without&lt;/i&gt; XML, I'll need to gut this configuration file.
Here's what I'll work with after removing the unneeded bean and aspect
elements:&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
          http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&amp;gt;
          

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Wow! That's a lot cleaner. But it's also useless. To make Spring 2.1's annotations work, I'll need to add a tiny bit of XML back to the
XML. Specifically, I'll need to
put in a &amp;lt;context:component-scan&amp;gt; element:&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
&lt;b&gt;       xmlns:context="http://www.springframework.org/schema/context"&lt;/b&gt;

       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
&lt;b&gt;           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd&lt;/b&gt;"&amp;gt;

&lt;b&gt;  &amp;lt;context:component-scan
      base-package="com.springinaction.chapter01.knight" /&amp;gt;&lt;/b&gt;

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;(Notice that I also had to add the XML Schema preamble to make the
"context" namespace available.)&lt;/p&gt;

&lt;p&gt;&amp;lt;context:component-scan&amp;gt; is a new configuration element in the "context" namespace (which, BTW, is also new in Spring 2.1). This modest little element tells Spring to scan the "com.springinaction.chapter01.knight" package (as specified by the base-package attribute) and any subpackage looking for classes that might be annotated with @Component (new in Spring 2.1), @Repository (new in Spring 2.0), or @Aspect (provided by @AspectJ). If it finds any such class, it automatically will register the class as a bean in the Spring application context. So, although &amp;lt;context:component-scan&amp;gt; takes up so very little space in the XML configuration, it could be responsible for configuring dozens, hundreds, or even thousands of beans in Spring.&lt;/p&gt;

&lt;p&gt;So where do these annotated classes come from? Well, we have to create them...let's do that now.&lt;/p&gt;

&lt;h4&gt;Let's add some annotations&lt;/h4&gt;

&lt;p&gt;Alrighty, then...I had to add a bit of XML, but fortunately, that's
almost all of the XML we need. (I'll put in a bit more later for the 
aspect-oriented stuff.) Now I need to slap a few annotations into the 
knight example's Java class files. First up is the KnightOfTheRoundTable
class:&lt;/p&gt;

&lt;pre class="code"&gt;
package com.springinaction.chapter01.knight;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

&lt;b&gt;@Component("knight")&lt;/b&gt;
public class KnightOfTheRoundTable implements Knight {
  public void embarkOnQuest() {
    quest.embark();
  }
  
  private String name = "Bedivere";
  public void setName(String name) {
    this.name = name;
  }
  
  public String getName() {
    return name;
  }

  private Quest quest;
&lt;b&gt;  @Autowired&lt;/b&gt;
  public void setQuest(Quest quest) {
    this.quest = quest;
  }
}

&lt;/pre&gt;

&lt;p&gt;The first of the new annotations I used is @Component. @Component tells Spring
that this class should be automatically registered in the Spring context. By default,
the class name is used as the bean's ID, but here I've explicitly specified that
the bean should have an ID of "knight".&lt;/p&gt;

&lt;p&gt;Next, notice that the setQuest() method is annotated with @Autowired. This
tells Spring that this setter shold automatically be wired with a bean reference.
The autowiring is "byType", so there will need to be a Quest bean in the Spring
context. There's not one there now, but I'll add one soon.&lt;/p&gt;

&lt;p&gt;However, before we look at the Quest bean, you may be interested in noting that the @Autowired annotation
doesn't have to be used with setter methods. In fact, you can use it with any
method you want. For example, the following use of @Autowired is perfectly
valid:&lt;/p&gt;

&lt;pre class="code"&gt;
&lt;b&gt;  @Autowired&lt;/b&gt;
  public void assignAQuest(Quest quest) {
    this.quest = quest;
  }
&lt;/pre&gt;

&lt;p&gt;Although it does the work of a setter, assignAQuest() isn't technically a setter method in the JavaBeans sense. Nonetheless, @Autowired has no problem injecting a quest into it through its argument.&lt;/p&gt;

&lt;p&gt;Moreover (and perhaps even more interesting), @Autowired doesn't even need
a method at all to do its job. You can just as easily use it on a private instance
variable:&lt;/p&gt;

&lt;pre class="code"&gt;
&lt;b&gt;  @Autowired&lt;/b&gt;
  private Quest quest;
&lt;/pre&gt;

&lt;p&gt;Goodbye unnecessary setter methods! (Well, only if you're using these annotations. If you're configuring with Spring XML, you'll still need them.)&lt;/p&gt;

&lt;p&gt;Now let's add the Quest bean to the Spring context. Normally I'd do this
with a &amp;lt;bean&amp;gt; element in XML. But since I'm using &amp;lt;context:component-scan&amp;gt;
I just need to annotate the HolyGrailQuest class with @Component:&lt;/p&gt;

&lt;pre class="code"&gt;
package com.springinaction.chapter01.knight;

import org.springframework.stereotype.Component;

&lt;b&gt;@Component&lt;/b&gt;
public class HolyGrailQuest implements Quest {
  public void embark() {
    System.out.println("Embarking on the quest for the Holy Grail!");
  }
}
&lt;/pre&gt;

&lt;p&gt;Voila! The "knight" and "quest" beans are now wired in Spring...using
annotations instead of XML. We're about ready to add AOP to the mix. But first,
let me address any concerns that you may have with auto-wiring.&lt;/p&gt;

&lt;h4&gt;Explicit wiring with annotations&lt;/h4&gt;

&lt;p&gt;If you're like me, auto-wiring makes you a bit nervous. It's fine for
small examples, but as an application gets larger, auto-wiring can be
quite a confusing mess, leaving you wondering how things are wired
together.&lt;/p&gt;

&lt;p&gt;If explicit wiring is more your style, then Spring has you covered
with the @Resource annotation. @Resource is a &lt;a href="http://jcp.org/en/jsr/detail?id=250"&gt;JSR-250&lt;/a&gt; annotation that 
lets you explicitly pick out which bean to wire into a property.&lt;/p&gt;

&lt;p&gt;For example, to hand-pick a bean named "grailQuest" to wire into
the KnightOfTheRoundTable, you can annotate the setter method like this:&lt;/p&gt;

&lt;pre class="code"&gt;

&lt;b&gt;  @Resource(name="grailQuest")&lt;/b&gt;
  public void setQuest(Quest quest) {
    this.quest = quest;
  }
&lt;/pre&gt;

&lt;p&gt;Now let's turn our attention to AOP with annotations by wiring in the Minstrel (musically inclined logging system of medieval times) aspect.&lt;/p&gt;

&lt;h4&gt;Spring, AOP, and annotations&lt;/h4&gt;

&lt;p&gt;To setup the Minstrel aspect, I'll use &lt;a href="http://www.eclipse.org/aspectj/"&gt;@AspectJ&lt;/a&gt; annotations. Spring's support for @AspectJ annotations isn't new to Spring 2.1. But Spring 2.1 does make it a bit easier, as you'll soon see.&lt;/p&gt;

&lt;p&gt;To add AOP support, the first thing I'll do is add one more line of XML to the Spring
XML configuration:&lt;/p&gt;

&lt;pre class="code"&gt;

&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd"&amp;gt;

  &amp;lt;context:component-scan
      base-package="com.springinaction.chapter01.knight" /&amp;gt;

&lt;b&gt;  &amp;lt;aop:aspectj-autoproxy/&amp;gt;&lt;/b&gt;

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;lt;aop:aspectj-autoproxy&amp;gt; was introduced in Spring 2.0 to automatically
proxy @AspectJ-annotated classes. But in Spring 2.0, you'd still need to explicitly
declare the @Aspectj-annotated classes as beans in XML. Spring 2.1's &amp;lt;context:component-scan&amp;gt;
element simplifies things a bit by automatically registering any class that is
annotated with @Aspect. Once @Aspect-annotated classes are registered in the Spring context by &amp;lt;context:component-scan&amp;gt;, &amp;lt;aop:aspectj-autoproxy&amp;gt; takes over to create the proxies.&lt;/p&gt;

&lt;p&gt;In the XML-oriented configuration, the Minstrel class was a simple POJO
with no special interfaces or annotations:&lt;/p&gt;

&lt;pre class="code"&gt;
package com.springinaction.chapter01.knight;

import org.apache.log4j.Logger;

public class Minstrel {
  private static final Logger SONG = 
      Logger.getLogger(Minstrel.class);

   public void singBefore(Knight knight) {
    SONG.info("Fa la la; Sir " + knight.getName() +
        " is so brave!");
  }
  
  public void singAfter(Knight knight) {
    SONG.info("Tee-hee-he; Sir " + knight.getName() +
        " did embark on a quest!");
  }
}
&lt;/pre&gt;

&lt;p&gt;In the original version, I used elements in Spring's "aop" namespace to turn Minstrel into an aspect. But for this article, I'm trying to cut down on
the XML and exploit the annotations. Therefore, I'm going to tweak Minstrel
to use @AspectJ-style annotations:&lt;/p&gt;

&lt;pre class="code"&gt;
package com.springinaction.chapter01.knight;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

&lt;b&gt;@Aspect&lt;/b&gt;
public class Minstrel {
  private static final Logger SONG = 
    Logger.getLogger(Minstrel.class);
  
&lt;b&gt;  @Pointcut("execution(* com.springinaction.chapter01.knight.Knight.embarkOnQuest(..))")
  public void questEmbarkment() {}&lt;/b&gt;
  
&lt;b&gt;  @Before("questEmbarkment() &amp;&amp; this(knight)")&lt;/b&gt;
  public void singBefore(Knight knight) {
    SONG.info("Fa la la; Sir " + knight.getName() +
    " is so brave!");  
  }
  

&lt;b&gt;  @After("questEmbarkment() &amp;&amp; this(knight)")&lt;/b&gt;
  public void singAfter(Knight knight) {
    SONG.info("Tee-hee-he; Sir " + knight.getName() +
        " did embark on a quest!");
  }
}
&lt;/pre&gt;

&lt;p&gt;This new Minstrel class is a typical @AspectJ aspect. The annotations applied
are:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;@Aspect indicates that this class is an aspect.&lt;/li&gt;
  &lt;li&gt;@Pointcut defines a pointcut. Notice that there's an empty method
    that serves as a place to attach the aspect and also provides the name
    for the pointcut. (Weird, yes...take it up with the AspectJ team.)&lt;/li&gt;

  &lt;li&gt;The @Before and @After annotations indicate the methods to be invoked
    before and after (respectively) when the pointcut is encountered.
&lt;/ul&gt;

&lt;p&gt;And that's it! I've extracted all of the configuration details out of
Spring XML and reworked it as annotations. As a reminder, here's the final
version of the XML:&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;

&amp;lt;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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd"&amp;gt;

  &amp;lt;context:component-scan
      base-package="com.springinaction.chapter01.knight" /&amp;gt;

  &amp;lt;aop:aspectj-autoproxy/&amp;gt;

&amp;lt;/beans&amp;gt;
&lt;/pre&gt;

&lt;p&gt;After yanking all of the application-specific bean definitions, I ended up
putting back a couple of infrastructural elements. But in the end, there is not nearly
as much XML. And, furthermore, as long as all of the application's beans are packaged in
com.springinaction.chapter01.knight (or a subpackage), then I probably won't have to
add much more XML to the Spring XML configuration.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Spring 2.1-m1 offers another choice for Spring configuration in the form
of annotations. Although I still favor Spring XML, I'm happy to see that there
are a wealth of configuration options for Spring developers to choose from.&lt;/p&gt;

&lt;p&gt;The downside of using annotations in this way, as opposed to XML or even &lt;a href="http://www.springframework.org/javaconfig"&gt;Spring JavaConfig&lt;/a&gt;, is that there's not 
a central place to look to gain an understanding of how application objects are
wired together. With Spring's XML configuration, you would only need to view a
handful of XML files to get the big picture of a Spring application's structure.
Spring IDE and Spring BeanDoc take advantage of this to generate a visual guide
to a Spring application's beans. With annotations, however, it's not so cut and dried. 
The application wiring is spread out across the application's many classes.&lt;/p&gt;

&lt;p&gt;In the end, Spring 2.1's annotations are one choice among many for configuring Spring. A wise developer will choose the correct configuration option for their application, whether it be Spring 2.1 annotations, XML, JavaConfig, or a scripted configuration like Groovy or JRuby. Or you may mix-n-match configuration styles in the same application.&lt;/p&gt;

&lt;p&gt;Finally, for those of you who may be wondering, &lt;a href="http://astore.amazon.com/habumacom-20/detail/1933988134"&gt;&lt;i&gt;Spring in Action, 2E&lt;/i&gt;&lt;/a&gt; is on its way to being complete. The writing phase is complete and it has been in the production team's hands for a few weeks. We've hit a few snags, but those are clearing up and we're anticipating a July release. Unfortunately, the timing of Spring 2.1 didn't allow me to cover any 2.1 stuff in the book (I'm compiling my examples against Spring 2.0.5). But watch this blog for more interesting Spring 2.1 stuff as I have the opportunity to share it.&lt;/p&gt;</dc:description>
    <dc:date>Wed, 16 May 2007 11:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=baf62c91-6ff1-4b3b-bfce-c8fe01709710">
    <title>Venkat Subramaniam - The Agile Experience this Summer in San Jose</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink.aspx?guid=baf62c91-6ff1-4b3b-bfce-c8fe01709710</link>
    <dc:description>I am excited to see that &lt;a href="http://www.theagileexperience.com" target="_blank"&gt;The
Agile Experience&lt;/a&gt; was announced today! 
&lt;br&gt;
&lt;br&gt;
I look forward to meet and mingle with the speakers and attendees who share a common
interest in the&lt;br&gt;
area that I am passionate about, July 12-14 in San Jose. All the exciting topics are
centered around&lt;br&gt;
various topics related to Agile Software Development. You will have four simultaneous
tracks to choose&lt;br&gt;
from. If you're interested in Agile Development (if you are reading this, I am sure
you are!), you don't&lt;br&gt;
want to miss this event. You've got to check out the impressive &lt;a href="http://www.theagileexperience.com/show_agenda.jsp?showId=100&amp;amp;byRoom=false" target="_blank"&gt;session
schedule&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
P.S.: Wait, I just noticed that the first 100 registrants will receive autographed
copy of&lt;br&gt;
&lt;a href="http://pragmaticprogrammer.com/titles/pad/index.html" target="_blank"&gt;Practices
of an Agile Developer!&lt;/a&gt; I will not only sign it, but personally imprint your first
name on it, how about that!&lt;hints id="hah_hints"&gt;
&lt;/hints&gt;
&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=baf62c91-6ff1-4b3b-bfce-c8fe01709710"&gt;</dc:description>
    <dc:date>Wed, 16 May 2007 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.nofluffjuststuff.com/show_view.jsp?showId=87">
    <title>Desert Southwest Software Symposium - Jul. 27 - 29, 2007</title>
    <link>http://www.nofluffjuststuff.com/show_view.jsp?showId=87</link>
    <dc:description>&lt;div style="font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 10pt;"&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
No Fluff Just Stuff is pleased to announce the &lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_view.jsp?showId=87" target="new"&gt;Desert Southwest Software Symposium&lt;/a&gt;, Jul. 27 - 29, 2007.&#xD;
&lt;/p&gt;&#xD;
&#xD;
	&lt;div style="background-color: #0860A9; color: #EFCE52; font-weight: bold; padding: 5px 5px 5px 5px;"&gt;&#xD;
		&lt;em&gt;Catch these Featured Sessions&lt;/em&gt;&#xD;
	&lt;/div&gt;&#xD;
&#xD;
	&lt;div style="border: 1px solid #999999; padding: 0 5px 0 5px;"&gt;&#xD;
&#xD;
	&lt;table cellpadding="0" cellspacing="0" style="font-size: 10pt;"&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7203&amp;showId=87" target="new"&gt;Spring 2.0: New and Noteworthy&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Ben Hale&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=1564" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/1564_Hale_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				Spring 2.0 has marked a major advance in the Spring Framework.  While still maintaining backwards compatibility, this release adds quite a few new features.  What are those features and how do they add value?  Come by and see.&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7192&amp;showId=87" target="new"&gt;Rails for Java Programmers&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Bruce Tate&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=12" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/12_Tate_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				The productivity of Ruby on Rails cannot be denied, but the explosion of Ruby on Rails left many developers, with hard commitments to Java deployment platforms, out in the cold. The continued evolution of JRuby can change that. JRuby is a Ruby implementation on the Java virtual machine. And yes, it runs Rails. In this session, you will learn Rails as it was meant to be learned, within the context of building a live site, from scratch. &#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7196&amp;showId=87" target="new"&gt;RAD JSF with Seam, Facelets, and Ajax4jsf, Part One&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by David Geary&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=4" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/4_Geary_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				In this session, see how you can get Ruby On Rails-like productivity on the Java side of the house with this compelling combination of technologies.&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;/table&gt;&#xD;
&#xD;
	&lt;/div&gt;&#xD;
&#xD;
&lt;/div&gt;</dc:description>
    <dc:date>Tue, 15 May 2007 09:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://blog.interface21.com/main/2007/05/14/annotation-driven-dependency-injection-in-spring-21/">
    <title>Mark Fisher - Annotation-Driven Dependency Injection in Spring 2.1</title>
    <link>http://blog.interface21.com/main/2007/05/14/annotation-driven-dependency-injection-in-spring-21/</link>
    <dc:description>&lt;a href="http://blog.interface21.com/main/author/markf/" title="Posts by Mark Fisher"&gt;&lt;img src='http://blog.interface21.com/main/wp-content/images/authors/markf.jpg' alt='Mark Fisher' title='Mark Fisher' align="right" hspace="10px" /&gt;&lt;/a&gt;&lt;p&gt;
Spring 2.0 introduced annotation support and annotation-aware configuration options that can be leveraged by Spring users who are developing with Java 5 (or later versions): &lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a href="http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/transaction/annotation/Transactional.html"&gt;@Transactional&lt;/a&gt;&lt;/th&gt;
&lt;td&gt;for demarcating and configuring transaction definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a href="http://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/org/aspectj/lang/annotation/Aspect.html"&gt;@Aspect&lt;/a&gt; (AspectJ)&lt;/th&gt;
&lt;td&gt;for defining aspects along with @Pointcut definitions and advice (@Before, @After, @Around)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a href="http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/stereotype/Repository.html"&gt;@Repository&lt;/a&gt;&lt;/th&gt;
&lt;td&gt;for indicating a class that is operating as a repository (a.k.a. Data Access Object or DAO)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a href="http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/beans/factory/annotation/Required.html"&gt;@Required&lt;/a&gt;&lt;/th&gt;
&lt;td&gt;for enforcing annotated bean properties are provided a value&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
With Spring 2.1, this theme of annotation-driven configuration has been significantly extended and will continue to evolve as we progress toward the RC1 release. In fact, it is now possible to drive Spring&amp;#039;s dependency injection via annotations. Furthermore, Spring can &lt;em&gt;discover&lt;/em&gt; beans that need to be configured within an application context.
&lt;/p&gt;
&lt;p&gt;
This blog entry will serve as a tutorial-style introduction to the basic features in 10 easy-to-follow steps. I will follow up later in the week with information on some more advanced features and customization options. If you are interested in alternative configuration options, you should also check out the &lt;a href="http://www.springframework.org/javaconfig"&gt;Spring Java Configuration&lt;/a&gt; project and &lt;a href="http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/"&gt;this blog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
This tutorial requires at least Java 5, and Java 6 is recommended (otherwise there is a single requirement at the end of step 1).
&lt;/p&gt;
&lt;h2&gt;Step 1:&lt;/h2&gt;
&lt;p&gt;
Grab &lt;a href="http://downloads.sourceforge.net/springframework/spring-framework-2.1-m1-with-dependencies.zip"&gt;spring-framework-2.1-m1-with-dependencies.zip&lt;/a&gt;. After extracting the archive, you will find the spring.jar and spring-mock.jar in the &amp;#039;dist&amp;#039; directory. Add them to your CLASSPATH as well as the following (paths shown are relative to the &amp;#039;lib&amp;#039; directory of the extracted 2.1-m1 archive):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asm/asm-2.2.3.jar&lt;/li&gt;
&lt;li&gt;asm/asm-commons-2.2.3.jar&lt;/li&gt;
&lt;li&gt;aspectj/aspectjweaver.jar&lt;/li&gt;
&lt;li&gt;hsqldb/hsqldb.jar&lt;/li&gt;
&lt;li&gt;jakarta-commons/commons-logging.jar&lt;/li&gt;
&lt;li&gt;log4j/log4j-1.2.14.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(NOTE: If you are not running on Java 6, you will also need to add j2ee/common-annotations.jar)
&lt;/p&gt;
&lt;h2&gt;Step 2:&lt;/h2&gt;
&lt;p&gt;Provide the interfaces and classes for the example. I have tried to keep it as simple as possible yet capable of demonstrating the main functionality. I am including all of the code and configuration in a single &amp;#034;blog&amp;#034; package. I would encourage following that same guideline so that the examples work as-is; otherwise, be sure to make the necessary modifications. First, the &lt;em&gt;GreetingService&lt;/em&gt; interface:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;interface&lt;/span&gt; GreetingService &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; greet&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then, a simple implementation:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; GreetingServiceImpl &lt;span class="kw2"&gt;implements&lt;/span&gt; GreetingService &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; MessageRepository messageRepository;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; setMessageRepository&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;MessageRepository messageRepository&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;messageRepository&lt;/span&gt; = messageRepository;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; greet&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt; locale = &lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;getDefault&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; message = messageRepository.&lt;span class="me1"&gt;getMessage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;locale.&lt;span class="me1"&gt;getDisplayLanguage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; message + &lt;span class="st0"&gt;&amp;#034; &amp;#034;&lt;/span&gt; + name;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Since the service depends upon a &lt;em&gt;MessageRepository&lt;/em&gt;, define that interface next:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;interface&lt;/span&gt; MessageRepository &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; getMessage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; language&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And for now, a stub implementation:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; StubMessageRepository &lt;span class="kw2"&gt;implements&lt;/span&gt; MessageRepository &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Map&amp;lt;String,String&amp;gt; messages = &lt;span class="kw2"&gt;new&lt;/span&gt; HashMap&amp;lt;String,String&amp;gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; initialize&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; messages.&lt;span class="me1"&gt;put&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;English&amp;#034;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;#034;Welcome&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; messages.&lt;span class="me1"&gt;put&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;Deutsch&amp;#034;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;#034;Willkommen&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; getMessage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; language&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; messages.&lt;span class="me1"&gt;get&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;language&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Step 3:&lt;/h2&gt;
&lt;p&gt;
Define the beans for a Spring application context. Notice, that I am including a new &amp;#039;context&amp;#039; namespace (NOTE: the &amp;#039;aop&amp;#039; namespace is also included here and will be used in the final step):&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;&lt;/span&gt;?xml &lt;span class="re0"&gt;version&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;1.0&amp;#034;&lt;/span&gt; &lt;span class="re0"&gt;encoding&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;UTF-8&amp;#034;&lt;/span&gt;?&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;beans&lt;/span&gt; &lt;span class="re0"&gt;xmlns&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;http://www.springframework.org/schema/beans&amp;#034;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:&lt;span class="re0"&gt;xsi&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;http://www.w3.org/2001/XMLSchema-instance&amp;#034;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:&lt;span class="re0"&gt;aop&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;http://www.springframework.org/schema/aop&amp;#034;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:&lt;span class="re0"&gt;context&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;http://www.springframework.org/schema/context&amp;#034;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xsi:&lt;span class="re0"&gt;schemaLocation&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;http://www.springframework.org/schema/beans&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.springframework.org/schema/aop&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.springframework.org/schema/context&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.springframework.org/schema/context/spring-context-2.1.xsd&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog.GreetingServiceImpl&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog.StubMessageRepository&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/beans&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Obviously this configuration looks a little sparse. As you can probably guess, the &amp;#039;context&amp;#039; namespace will soon play a role.
&lt;/p&gt;
&lt;h2&gt;Step 4:&lt;/h2&gt;
&lt;p&gt;Provide a simple test case leveraging Spring&amp;#039;s base support class:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; GreetingServiceImplTests &lt;span class="kw2"&gt;extends&lt;/span&gt; AbstractDependencyInjectionSpringContextTests &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; GreetingService greetingService;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; setGreetingService&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;GreetingService greetingService&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;greetingService&lt;/span&gt; = greetingService;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; getConfigLocations&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;span class="st0"&gt;&amp;#034;/blog/applicationContext.xml&amp;#034;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; testEnglishWelcome&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;setDefault&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;ENGLISH&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; name = &lt;span class="st0"&gt;&amp;#034;Spring Community&amp;#034;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; greeting = greetingService.&lt;span class="me1"&gt;greet&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assertEquals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;Welcome &amp;#034;&lt;/span&gt; + name, greeting&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; testGermanWelcome&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;setDefault&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3ALocale+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Locale&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;GERMAN&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; name = &lt;span class="st0"&gt;&amp;#034;Spring Community&amp;#034;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; greeting = greetingService.&lt;span class="me1"&gt;greet&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; assertEquals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;Willkommen &amp;#034;&lt;/span&gt; + name, greeting&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Try running the tests and notice that they fail with a NullPointerException. This is to be expected since the GreetingServiceImpl has not been provided a MessageRepository. In the next two steps, you will add annotations to drive the dependency injection and initialization respectively.
&lt;/p&gt;
&lt;h2&gt;Step 5:&lt;/h2&gt;
&lt;p&gt;Provide an @Autowired annotation on the GreetingServiceImpl&amp;#039;s setter method, such as:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@Autowired&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; setMessageRepository&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;MessageRepository messageRepository&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;messageRepository&lt;/span&gt; = messageRepository;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then, add the &amp;#039;annotation-config&amp;#039; element (from the new &amp;#039;context&amp;#039; namespace) to your configuration:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;beans&lt;/span&gt; &amp;#8230; &lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;context&lt;/span&gt;:annotation-config&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog.GreetingServiceImpl&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog.StubMessageRepository&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/beans&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Rerun the tests. They will still fail, but if you look closely it&amp;#039;s a new problem. The assertions fail, because the messages being returned are null. That means that the &amp;#039;messageRepository&amp;#039; property &lt;em&gt;has&lt;/em&gt; been set on the greeting service! Now, the StubMessageRepository simply needs to be initialized.
&lt;/p&gt;
&lt;h2&gt;Step 6:&lt;/h2&gt;
&lt;p&gt;Spring provides a couple options for initialization callbacks: Spring&amp;#039;s InitializingBean interface or an &amp;#039;init-method&amp;#039; declaration within XML. As of Spring 2.1, JSR-250 annotations are supported - providing yet another option: @PostConstruct  (and the @PreDestroy annotation can be used for destruction callbacks as you will see shortly). In the StubMessageRepository, add the annotation to the &lt;em&gt;initialize&lt;/em&gt; method:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@PostConstruct&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; initialize&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; messages.&lt;span class="me1"&gt;put&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;English&amp;#034;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;#034;Welcome&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; messages.&lt;span class="me1"&gt;put&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;Deutsch&amp;#034;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;#034;Willkommen&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Rerun the tests. This time they should pass!
&lt;/p&gt;
&lt;h2&gt;Step 7:&lt;/h2&gt;
&lt;p&gt;
The @Autowired annotation can also be used for constructor-based injection. If you&amp;#039;d like to experiment with that option, remove the setter method from the GreetingServiceImpl and add this constructor instead (then rerun the tests):&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@Autowired&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; GreetingServiceImpl&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;MessageRepository messageRepository&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;messageRepository&lt;/span&gt; = messageRepository;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If preferred, you can even use field-injection. Remove the constructor, add the annotation directly to the field, and rerun the tests. The code should look like this:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@Autowired&lt;br /&gt;
&lt;span class="kw2"&gt;private&lt;/span&gt; MessageRepository messageRepository;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Step 8:&lt;/h2&gt;
&lt;p&gt;
Add a JDBC-based repository implementation of the MessageRepository:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; JdbcMessageRepository &lt;span class="kw2"&gt;implements&lt;/span&gt; MessageRepository &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; SimpleJdbcTemplate jdbcTemplate;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; @PostConstruct&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; setUpDatabase&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jdbcTemplate.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;create table messages (language varchar(20), message varchar(100))&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jdbcTemplate.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;insert into messages (language, message) values (&amp;#039;English&amp;#039;, &amp;#039;Welcome&amp;#039;)&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jdbcTemplate.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;insert into messages (language, message) values (&amp;#039;Deutsch&amp;#039;, &amp;#039;Willkommen&amp;#039;)&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; @PreDestroy&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; tearDownDatabase&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jdbcTemplate.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;drop table messages&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; getMessage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; language&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; jdbcTemplate.&lt;span class="me1"&gt;queryForObject&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;select message from messages where language = ?&amp;#034;&lt;/span&gt;, &lt;a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt;.&lt;span class="kw2"&gt;class&lt;/span&gt;, language&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Notice that in addition to @PostConstruct for initialization, this is using @PreDestroy to mark a method to be called on destruction. One thing is unclear from this implementation: how will the SimpleJdbcTemplate be provided? One option would be to provide a bean definition for the template. Another option would be to somehow provide a DataSource implementation to the template&amp;#039;s constructor. Add the following (annotated) method:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@Autowired&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; createTemplate&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;DataSource dataSource&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;jdbcTemplate&lt;/span&gt; = &lt;span class="kw2"&gt;new&lt;/span&gt; SimpleJdbcTemplate&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dataSource&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This demonstrates dependency injection working with an arbitrary method (not a traditional &amp;#039;setter&amp;#039;). This will be tested in the course of the next step.
&lt;/p&gt;
&lt;h2&gt;Step 9:&lt;/h2&gt;
&lt;p&gt;
In Spring 2.1, &amp;#034;candidate&amp;#034; beans can even be discovered rather than provided explicitly in the XML as above. Certain annotations are recognized by default. This includes the @Repository annotation as well as a new @Component annotation. Add those two annotations to JdbcMessageRepository and GreetingServiceImpl respectively:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@&lt;a href="http://www.google.com/search?q=allinurl%3ARepository+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Repository&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; JdbcMessageRepository &lt;span class="kw2"&gt;implements&lt;/span&gt; MessageRepository &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &amp;#8230; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@&lt;a href="http://www.google.com/search?q=allinurl%3AComponent+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;Component&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; GreetingServiceImpl &lt;span class="kw2"&gt;implements&lt;/span&gt; GreetingService &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &amp;#8230; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then modify the XML file by removing the existing explicit bean definitions and simply adding a &lt;em&gt;component-scan&lt;/em&gt; tag:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;beans&lt;/span&gt; &amp;#8230; &lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;context&lt;/span&gt;:component-scan &lt;span class="re0"&gt;base-package&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/beans&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then, add just the DataSource bean definition and the new tag for configuring property placeholders:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;beans&lt;/span&gt; &amp;#8230; &lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;context&lt;/span&gt;:component-scan &lt;span class="re0"&gt;base-package&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;blog&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;context&lt;/span&gt;:property-placeholder &lt;span class="re0"&gt;location&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;classpath:blog/jdbc.properties&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="re0"&gt;class&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;org.springframework.jdbc.datasource.DriverManagerDataSource&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;driverClassName&amp;#034;&lt;/span&gt; &lt;span class="re0"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;${jdbc.driver}&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;url&amp;#034;&lt;/span&gt; &lt;span class="re0"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;${jdbc.url}&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;username&amp;#034;&lt;/span&gt; &lt;span class="re0"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;${jdbc.username}&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="re0"&gt;name&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;password&amp;#034;&lt;/span&gt; &lt;span class="re0"&gt;value&lt;/span&gt;=&lt;span class="st0"&gt;&amp;#034;${jdbc.password}&amp;#034;&lt;/span&gt;&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/bean&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;/beans&lt;span class="re2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#8230; and the jdbc.properties file itself:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;jdbc.&lt;span class="me1"&gt;driver&lt;/span&gt;=org.&lt;span class="me1"&gt;hsqldb&lt;/span&gt;.&lt;span class="me1"&gt;jdbcDriver&lt;/span&gt;&lt;br /&gt;
jdbc.&lt;span class="me1"&gt;url&lt;/span&gt;=jdbc:hsqldb:mem:blog&lt;br /&gt;
jdbc.&lt;span class="me1"&gt;username&lt;/span&gt;=sa&lt;br /&gt;
jdbc.&lt;span class="me1"&gt;password&lt;/span&gt;=&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Rerun the tests, and you should see the green bar even though only the data source has been defined in XML.
&lt;/p&gt;
&lt;h2&gt;Step 10:&lt;/h2&gt;
&lt;p&gt;
Finally, add an aspect (the @Aspect annotations are also automatically detected by default):&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;@Aspect&lt;br /&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; ServiceInvocationLogger &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; invocationCount;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; @Pointcut&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;execution(* blog.*Service+.*(..))&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; serviceInvocation&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; @Before&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;serviceInvocation()&amp;#034;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; log&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; invocationCount++;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href="http://www.google.com/search?q=allinurl%3ASystem+java.sun.com&amp;#038;bntl=1"&gt;&lt;span class="kw3"&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;out&lt;/span&gt;.&lt;span class="me1"&gt;println&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;#034;service invocation #&amp;#034;&lt;/span&gt; + invocationCount&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And to activate automatic proxy generation, simply add the following tag to the xml:&lt;/p&gt;
&lt;div class="codesnip-container" &gt;
&lt;div class="codesnip"&gt;&lt;span class="sc3"&gt;&lt;span class="re1"&gt;&amp;lt;aop&lt;/span&gt;:aspectj-autoproxy&lt;span class="re2"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Rerun the tests, and you should see the log messages!
&lt;/p&gt;
&lt;p&gt;
NOTE: the scanning and configuration process can be initiated without any XML and can be customized (e.g. detect your own annotations and/or types). I will discuss those features and more in the next post.
&lt;/p&gt;
&lt;p&gt;
In the mean time, I hope this post will serve its purpose well - providing hands-on experience with these new Spring 2.1 features. As always, we are looking forward to feedback from the community, so please feel free to leave comments!
&lt;/p&gt;</dc:description>
    <dc:date>Mon, 14 May 2007 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.nofluffjuststuff.com/show_view.jsp?showId=89">
    <title>Research Triangle Software Symposium - Jul. 20 - 22, 2007</title>
    <link>http://www.nofluffjuststuff.com/show_view.jsp?showId=89</link>
    <dc:description>&lt;div style="font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 10pt;"&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
No Fluff Just Stuff is pleased to announce the &lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_view.jsp?showId=89" target="new"&gt;Research Triangle Software Symposium&lt;/a&gt;, Jul. 20 - 22, 2007.&#xD;
&lt;/p&gt;&#xD;
&#xD;
	&lt;div style="background-color: #0860A9; color: #EFCE52; font-weight: bold; padding: 5px 5px 5px 5px;"&gt;&#xD;
		&lt;em&gt;Catch these Featured Sessions&lt;/em&gt;&#xD;
	&lt;/div&gt;&#xD;
&#xD;
	&lt;div style="border: 1px solid #999999; padding: 0 5px 0 5px;"&gt;&#xD;
&#xD;
	&lt;table cellpadding="0" cellspacing="0" style="font-size: 10pt;"&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7129&amp;showId=89" target="new"&gt;Build Teams, Not Products&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Jared Richardson&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=339" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/339_Richardson_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				A great team builds great software, but how do you build a great team?&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7047&amp;showId=89" target="new"&gt;Effective Concurrent Java&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Brian Goetz&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=24" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/24_Goetz_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				The Java programming language has turned a generation of applications programmers into concurrent programmers through its direct support of multithreading. However, the Java concurrency primitives are just that: primitive. From them you can build many concurrency utilities, but doing so takes great care as concurrent programming poses many traps for the unwary.&#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;tr&gt;&#xD;
		&lt;td&gt;&#xD;
&#xD;
		&lt;div style="margin: 5px 0 4px 0;"&gt;&#xD;
			&lt;b&gt;&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/show_session_view.jsp?presentationId=7151&amp;showId=89" target="new"&gt;Everything Old Is New Again&lt;/a&gt;&lt;/b&gt;&#xD;
			&lt;br /&gt;&lt;em&gt;by Glenn Vanderburg&lt;/em&gt;&#xD;
		&lt;/div&gt;&#xD;
&#xD;
					&lt;a style="color: #336699; text-decoration: none;" href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=17" target="new"&gt;&#xD;
				&lt;img src="http://www.nofluffjuststuff.com//s/bio/17_Vanderburg_medium.jpg" width="100" border="0" align="left" style="margin: 5 5 5 5;"/&gt;&#xD;
			&lt;/a&gt;&#xD;
				The early years of computers -- the '50s and '60s -- were characterized by furious exploration of a huge variety of different ideas.  Since then many of the hot topics of those days have moved to the fringe, largely ignored by the mainstream of software development.  But some of them are being rediscovered, and a lot of what we think of as "new developments" are really just some old ideas returning to center stage. &#xD;
		&#xD;
			&lt;br style="clear: both; font: 1px/1px Arial;"/&gt;&#xD;
&#xD;
		&lt;/td&gt;&#xD;
	&lt;/tr&gt;&#xD;
&#xD;
	&#xD;
	&lt;/table&gt;&#xD;
&#xD;
	&lt;/div&gt;&#xD;
&#xD;
&lt;/div&gt;</dc:description>
    <dc:date>Mon, 14 May 2007 15:00:00 CDT</dc:date>
  </item>
</rdf:RDF>

