source: mini_app.zip

Here is a simple example on how to use only tapestry-ioc in your app.

Using IOC has many advantages, so why not get used to it even in the smallest apps.

if you are comfortable with maven: pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>tapestry.mini-app</groupId>
  <artifactId>mini-app</artifactId>
  <version>0.0.1</version>
  <build>
    <finalName>mini-app</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <optimize>true</optimize>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.apache.tapestry</groupId>
      <artifactId>tapestry-ioc</artifactId>
      <version>${tapestry-release-version}</version>
    </dependency>    
  </dependencies>
  <properties>
    <tapestry-release-version>5.0.6</tapestry-release-version>
  </properties>
</project>

or add these libraries to your path

javassist-3.4.ga.jar
log4j-1.2.14.jar
tapestry-ioc-5.0.5.jar
slf4j-api-1.4.3.jar
slf4j-log4j12-1.4.3.jar

Your main class is fairly simple(Main.java)

package tapestry.mini;

import org.apache.tapestry.ioc.Registry;
import org.apache.tapestry.ioc.RegistryBuilder;

import tapestry.mini.services.Hello;
import tapestry.mini.services.MiniAppModule;

public class Main {

    public static void main(String[] args) {
        RegistryBuilder builder = new RegistryBuilder();
        builder.add(MiniAppModule.class);
        
        Registry registry = builder.build();
        registry.performRegistryStartup();
        
        
        Hello hello = registry.getService(Hello.class);
        hello.sayHello();

        //for operations done from this thread 
        registry.cleanupThread();
        //call this to allow services clean shutdown
        registry.shutdown();
    }
}

MiniAppModule.java:

package tapestry.mini.services;

import org.apache.tapestry.ioc.ServiceBinder;

public class MiniAppModule {
    
    public static void bind(ServiceBinder binder){
        binder.bind(Hello.class);
        binder.bind(Output.class, OutputImpl.class);
    }
}

A small class that also shows automatic dependency injection: Hello.java

package tapestry.mini.services;

public class Hello {
    
    private final Output _output;

    public Hello(Output output) {
        _output = output;
    }
    
    public void sayHello(){
        _output.say("Hello world");
    }
}

a very simple dependancy: Output.java

package tapestry.mini.services;

public interface Output {
    public void say(String text);
}

A simple implementation of course: OutputImpl.java

package tapestry.mini.services;

public class OutputImpl implements Output{
    public void say(String text){
        System.out.println(text);
    }
}

It's also important to a log4j configuration file. I.e. for maven you can put it to src/main/resources/log4j.properties. This is an example config file:
{{{#!properties log4j.rootCategory=WARN, A1

# A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses [PatternLayout]. log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=[%p] %c{1} %m%n

log4j.category.org.apache.tapestry=error log4j.category.tapestry=error log4j.category.tapestry.ioc.ClassFactory=error

log4j.category.org.apache.tapestry5.ioc.FredModule=debug log4j.category.org.apache.tapestry5.ioc.AdviceDemoModule.Greeter=debug

log4j.category.com.example=debug log4j.category.org.apache.tapestry5.ioc.services.TapestryIOCModule.PeriodicExecutor=debug

# This makes things very verbose, but can be useful to figure what's happening and how long its taking. log4j.category.org.apache.tapestry5.ioc.Registry=debug log4j.category.org.apache.tapestry5.ioc.RegistryBuilder=debug

# log4j.category.org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory=debug
}}}

  • No labels