You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by bu...@apache.org on 2018/10/01 16:58:29 UTC

svn commit: r1035989 - in /websites/staging/felix/trunk/content: ./ documentation/subprojects/apache-felix-dependency-manager/reference/component-aspect.html

Author: buildbot
Date: Mon Oct  1 16:58:28 2018
New Revision: 1035989

Log:
Staging update by buildbot for felix

Modified:
    websites/staging/felix/trunk/content/   (props changed)
    websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/component-aspect.html

Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Oct  1 16:58:28 2018
@@ -1 +1 @@
-1842518
+1842519

Modified: websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/component-aspect.html
==============================================================================
--- websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/component-aspect.html (original)
+++ websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/component-aspect.html Mon Oct  1 16:58:28 2018
@@ -91,28 +91,65 @@ h2:hover > .headerlink, h3:hover > .head
 <p>Aspects, as part of aspect oriented programming, can be used in a dynamic environment such as OSGi to "extend" existing services and add certain "capabilities" to them. Examples of these are adding a specific caching mechanism to a storage service or implementing logging. Aspects in OSGi can be applied to services and can be added and removed at runtime.</p>
 <p>Aspects allow you to define an "interceptor", or chain of interceptors for a service to add features like caching or logging, etc. An aspect will be applied to any service that matches the specified interface and filter. For each matching service an aspect will be created based on the aspect implementation class. The aspect will be registered with the same interface and properties as the original service, plus any extra properties you supply here. It will also inherit all dependencies, and if you declare the original service as a member it will be injected.</p>
 <h2 id="usage-example-using-annotation">Usage example using annotation<a class="headerlink" href="#usage-example-using-annotation" title="Permanent link">&para;</a></h2>
-<p>The <em>@AspectService</em> annotation allows you to create an aspect service. In this example, a "DatabaseCache" aspect service is used to add caching functionality to an existing Database service:</p>
+<p>The <em>@AspectService</em> annotation allows you to create an aspect service. In this example, a "DatabaseCache" aspect service is used to add caching functionality to an existing Database service.</p>
 <h3 id="sample-code">Sample code<a class="headerlink" href="#sample-code" title="Permanent link">&para;</a></h3>
+<p>First, here is the original Database service:</p>
 <div class="codehilite"><pre><span class="kd">interface</span> <span class="nc">Database</span> <span class="o">{</span>
     <span class="n">String</span> <span class="nf">get</span><span class="o">(</span><span class="n">String</span> <span class="n">key</span><span class="o">);</span>
 <span class="o">}</span>
 
-<span class="nd">@AspectService</span><span class="o">(</span><span class="n">ranking</span><span class="o">=</span><span class="mi">10</span><span class="o">)</span>
-<span class="kd">class</span> <span class="nc">DatabaseCache</span> <span class="kd">implements</span> <span class="n">Database</span> <span class="o">{</span>
-    <span class="kd">volatile</span> <span class="n">Database</span> <span class="n">originalDatabase</span><span class="o">;</span> <span class="c1">// injected</span>
+<span class="nd">@Component</span>
+<span class="kd">class</span> <span class="nc">DatabaseImpl</span> <span class="kd">implements</span> <span class="n">Database</span> <span class="o">{</span>
+    <span class="n">String</span> <span class="nf">get</span><span class="o">(</span><span class="n">String</span> <span class="n">key</span><span class="o">)</span> <span class="o">{</span>
+        <span class="c1">// fetch the key value from the actual database</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
 
-    <span class="nd">@ServiceDependency</span><span class="o">(</span><span class="n">required</span><span class="o">=</span><span class="kc">false</span><span class="o">)</span>
-    <span class="kd">volatile</span> <span class="n">LogService</span> <span class="n">log</span><span class="o">;</span>
 
-    <span class="n">String</span> <span class="nf">get</span><span class="o">(</span><span class="n">String</span> <span class="n">key</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">String</span> <span class="n">value</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">key</span><span class="o">);</span>
-        <span class="k">if</span> <span class="o">(</span><span class="n">value</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
-            <span class="n">value</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">originalDatabase</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">key</span><span class="o">);</span>
-            <span class="n">store</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
-        <span class="o">}</span>
-        <span class="k">return</span> <span class="n">value</span><span class="o">;</span>
+<p>Next, here is the DatabaseCache aspect service, which sits between any Database service consumer and the actual DatabaseImpl service:</p>
+<div class="codehilite"><pre><span class="p">@</span><span class="n">AspectService</span><span class="p">(</span><span class="n">ranking</span><span class="p">=</span>10<span class="p">)</span>
+<span class="n">class</span> <span class="n">DatabaseCache</span> <span class="n">implements</span> <span class="n">Database</span> <span class="p">{</span>
+    <span class="n">volatile</span> <span class="n">Database</span> <span class="n">originalDatabase</span><span class="p">;</span> <span class="o">//</span> <span class="n">injected</span>
+
+    <span class="p">@</span><span class="n">ServiceDependency</span><span class="p">(</span><span class="n">required</span><span class="p">=</span><span class="n">false</span><span class="p">)</span>
+    <span class="n">volatile</span> <span class="n">LogService</span> <span class="nb">log</span><span class="p">;</span>
+
+    <span class="n">String</span> <span class="n">get</span><span class="p">(</span><span class="n">String</span> <span class="n">key</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">String</span> <span class="n">value</span> <span class="p">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">==</span> <span class="n">null</span><span class="p">)</span> <span class="p">{</span>
+            <span class="n">value</span> <span class="p">=</span> <span class="n">this</span><span class="p">.</span><span class="n">originalDatabase</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
+            <span class="n">store</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">);</span>
+        <span class="p">}</span>
+        <span class="k">return</span> <span class="n">value</span><span class="p">;</span>
+    <span class="p">}</span>
+    <span class="p">...</span> 
+<span class="p">}</span>
+</pre></div>
+
+
+<p>The aspect service, when started will be bound to the original Database service and will be reinjected to any Database service consumer. For example, the following Database service client will be reinjected with the aspect service in the volatile field:</p>
+<div class="codehilite"><pre><span class="nd">@Component</span> 
+<span class="kd">class</span> <span class="nc">DatabaseClient</span> <span class="o">{</span>
+    <span class="nd">@ServiceDependency</span>
+    <span class="kd">volatile</span> <span class="n">Database</span> <span class="n">dbase</span><span class="o">;</span>
+
+    <span class="o">....</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>The Database client can also define a "swap" callback in order to be notified when the aspect service is injected:</p>
+<div class="codehilite"><pre><span class="nd">@Component</span> 
+<span class="kd">class</span> <span class="nc">DatabaseClient</span> <span class="o">{</span>
+    <span class="nd">@ServiceDependency</span><span class="o">(</span><span class="n">swap</span><span class="o">=</span><span class="s">&quot;swapDatabase&quot;</span><span class="o">)</span>
+    <span class="kd">volatile</span> <span class="n">Database</span> <span class="n">dbase</span><span class="o">;</span>
+
+    <span class="kt">void</span> <span class="nf">swapDatabase</span><span class="o">(</span><span class="n">Database</span> <span class="n">oldDatabase</span><span class="o">,</span> <span class="n">Database</span> <span class="n">newDatabase</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">dbase</span> <span class="o">=</span> <span class="n">newDatabase</span><span class="o">;</span>
     <span class="o">}</span>
-    <span class="o">...</span> 
+
+    <span class="o">....</span>
 <span class="o">}</span>
 </pre></div>
 
@@ -186,7 +223,7 @@ The AspectComponent can be created using
  <span class="o">}</span>
 </pre></div>
       <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
-        Rev. 1842412 by pderop on Sun, 30 Sep 2018 21:05:18 +0000
+        Rev. 1842519 by pderop on Mon, 1 Oct 2018 16:58:10 +0000
       </div>
       <div class="trademarkFooter"> 
         Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project