blob: a52c94026017762e6395c47c5d4c9b9f6b919e36 [file] [log] [blame]
<!DOCTYPE html>
<!--
Cut-down patched version of Bootstrap's doc style:
http://github.com/twitter/bootstrap/blob/gh-pages/
under http://creativecommons.org/licenses/by/3.0/
-->
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sisu ยท Tutorials</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link href="../../assets/css/bootstrap.min.css" rel="stylesheet">
<link href="../../assets/css/bootstrap-responsive.min.css" rel="stylesheet">
<link href="../../assets/css/docs.css" rel="stylesheet">
<link href="../../assets/css/prettify.min.css" rel="stylesheet">
</head>
<body data-spy="scroll" data-target=".sisu-docs-sidebar">
<!-- Navbar
================================================== -->
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="brand" href="./index.html"></a>
<div class="nav-collapse collapse">
<ul class="nav">
<li class="active">
<a href="./index.html">Tutorials</a>
</li>
<li class="">
<a href="./javadoc.html">Javadoc</a>
</li>
<li class="">
<a href="./faq.html">FAQ</a>
</li>
<li class="">
<a href="http://eclipse.org/sisu/" target="_blank">Sisu@Eclipse</a>
</li>
<li class="">
<a href="https://github.com/eclipse/sisu.inject/" target="_blank">GitHub</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Subhead
================================================== -->
<header class="jumbotron subhead" id="overview">
<div class="container">
<h1>Sisu in 5 minutes</h1>
<p class="lead">Easy-peasy Guice.</p>
</div>
</header>
<div class="container">
<!-- Tutorial steps
================================================== -->
<div class="row">
<div class="span3 sisu-docs-sidebar">
<ul class="nav nav-list sisu-docs-sidenav">
<li><a href="#ready"><i class="icon-chevron-right"></i> Ready</a></li>
<li><a href="#code"><i class="icon-chevron-right"></i> Code</a></li>
<li><a href="#go"><i class="icon-chevron-right"></i> Go!</a></li>
</ul>
</div>
<div class="span9">
<!-- Ready
================================================== -->
<section id="ready">
<div class="page-header">
<h1>What is Sisu?</h1>
</div>
<p class="lead">
Sisu is a set of <a href="http://code.google.com/p/google-guice/">Guice</a> modules that add classpath scanning, auto-binding, and dynamic wiring.
Together these modules make up the Sisu container, but they can also be used individually.
</p>
<p>Let's begin with a simple Maven project, paste the following into a file called 'pom.xml'</p>
<pre class="prettyprint">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project&gt;&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;groupId&gt;example&lt;/groupId&gt;
&lt;artifactId&gt;sisu-5min-demo&lt;/artifactId&gt;
&lt;version&gt;0-SNAPSHOT&lt;/version&gt;
&lt;name&gt;Sisu 5-minute demo&lt;/name&gt;
&lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;com.google.inject&lt;/groupId&gt;
&lt;artifactId&gt;guice&lt;/artifactId&gt;
&lt;version&gt;4.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.eclipse.sisu&lt;/groupId&gt;
&lt;artifactId&gt;org.eclipse.sisu.inject&lt;/artifactId&gt;
&lt;version&gt;0.3.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;/project&gt;</pre>
</section>
<!-- Code
================================================== -->
<section id="code">
<div class="page-header">
<h1>What can it do?</h1>
</div>
<p class="lead">
Sisu looks for types annotated with
<code class="prettyprint">@Named</code>,
binds them, and wires any missing dependencies.
</p>
<p>Paste the following code into a file called 'src/main/java/example/Example.java'</p>
<pre class="prettyprint">
package example;
import java.awt.*;
import java.util.*;
import javax.swing.*;
// Standard JSR330 annotations
import javax.inject.Inject;
import javax.inject.Named;
import com.google.inject.Guice;
// Sisu modules for scanning and wiring
import org.eclipse.sisu.space.SpaceModule;
import org.eclipse.sisu.space.URLClassSpace;
import org.eclipse.sisu.wire.WireModule;
// let's create some simple Swing tabs...
abstract class AbstractTab extends JPanel {}
// Sisu will spot any @Named components
@Named("One")
class ButtonTab extends AbstractTab {
ButtonTab() {
add(new JButton("Button"));
}
}
@Named("Two")
class CheckBoxTab extends AbstractTab {
CheckBoxTab() {
add(new JCheckBox("CheckBox"));
}
}
@Named("Three")
class RadioButtonTab extends AbstractTab {
RadioButtonTab() {
ButtonGroup group = new ButtonGroup();
group.add(new JRadioButton("+1"));
group.add(new JRadioButton("0"));
group.add(new JRadioButton("-1"));
Enumeration&lt;AbstractButton&gt; e = group.getElements();
while (e.hasMoreElements()) {
add(e.nextElement());
}
}
}
// Sisu will launch @EagerSingleton's on startup
@Named
@org.eclipse.sisu.EagerSingleton
class Example implements Runnable {
JTabbedPane pane = new JTabbedPane();
// Sisu spots we want a map of tabs and wires it up for us
@Inject
Example(Map&lt;String, AbstractTab&gt; tabs) {
for (Map.Entry&lt;String, AbstractTab&gt; t:tabs.entrySet()) {
pane.addTab(t.getKey(), t.getValue());
}
SwingUtilities.invokeLater(this);
}
public void run() {
JFrame frame = new JFrame("Sisu 5-minute demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pane, BorderLayout.CENTER);
frame.setLocation(100, 50);
frame.setSize(300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
ClassLoader classloader = Example.class.getClassLoader();
Guice.createInjector(
new WireModule( // auto-wires unresolved dependencies
new SpaceModule( // scans and binds @Named components
new URLClassSpace( classloader ) // abstracts class/resource finding
)));
}
}</pre>
</section>
<!-- Go!
================================================== -->
<section id="go">
<div class="page-header">
<h1>How does it work?</h1>
</div>
<p class="lead">
Sisu has a
<a href="../api/org.eclipse.sisu.inject/reference/org/eclipse/sisu/space/package-summary.html"><code class="prettyprint">SpaceModule</code></a>
for scanning and a
<a href="../api/org.eclipse.sisu.inject/reference/org/eclipse/sisu/wire/package-summary.html"><code class="prettyprint">WireModule</code></a>
that wires requests to its dynamic
<a href="../api/org.eclipse.sisu.inject/reference/org/eclipse/sisu/inject/package-summary.html"><code class="prettyprint">BeanLocator</code></a>.
</p>
<p>Paste the following Maven command into your console window to launch the demo</p>
<pre class="prettyprint">
mvn compile exec:java -Dexec.mainClass=example.Example</pre>
<img src="../../assets/img/5min-demo.png"></img>
<p>If you're interested in what Sisu is doing you can turn on tracing with -Dsisu.debug</p>
</section>
</div>
</div>
</div>
<!-- Footer
================================================== -->
<footer class="footer">
<div class="container">
<p>Document style adapted from <a href="http://github.com/twitter/bootstrap/blob/gh-pages/">Bootstrap</a> under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
<p><a href="http://glyphicons.com">Glyphicons Free</a> licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
<ul class="footer-links">
</ul>
</div>
</footer>
<script src="../../assets/js/jquery.min.js"></script>
<script src="../../assets/js/bootstrap.min.js"></script>
<script src="../../assets/js/prettify.min.js"></script>
<script src="../../assets/js/docs.js"></script>
</body>
</html>