<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>找不着北 &#187; Java</title>
	<atom:link href="http://www.loveazure.com/archives/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.loveazure.com</link>
	<description>Lost bearings in city</description>
	<lastBuildDate>Fri, 30 Jul 2010 15:42:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java 布局管理器不完全指南</title>
		<link>http://www.loveazure.com/archives/609</link>
		<comments>http://www.loveazure.com/archives/609#comments</comments>
		<pubDate>Sun, 20 Jun 2010 06:45:37 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[introduce]]></category>
		<category><![CDATA[layout]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/archives/609</guid>
		<description><![CDATA[绝大多数的Java程序员都不太热衷于写Java桌面应用程序，他们都觉得用Java写界面既丑，速度又慢，而且很复杂。许多人认为，Java写不了好的桌面程序。好多初学Java的人，在刚学会Java语法之后，直接跳过桌面程序，成为了JavaEE程序员
确实，对于VB或者VC来说,用Java写桌面程序难度差的不是一个数量级。Java语言，本来就不适合快速开发，对于Java大部分的开发框架，本不是针对快速开发而言，而是为了更好的扩展与重构。
个人认为，Swing的难点在于复杂的布局管理器。只要吃透了这个，写Java桌面程序就简单了。
1.流式布局 (FlowLayout)
这是面板(JPanel)的默认布局管理器。流式布局管理器的特点是在一行上水平排列组件，直到没有足够的空间为止，这时开始新的一行。当用户缩放容器时，布局管理器自动地调整组件的位置使其填充可用的空间。
FlowLayout有三种构造方法,

FlowLayout() : 使用居中的对齐方式,组件间水平和垂直间距都为5。 
FlowLayout(int align) : align表示对齐方式,可以是LEFT,CENTER或RIGHT。 
FlowLayout(int align, int hgap, int vgap) : hgap 水平间距,vgap 垂直间距。 

2.边界布局 (BorderLayout)
这是每个JFrame的内容窗格的默认布局管理器( JFrame.getContentPane() ).
边界布局管理器把组件分成5个区域，NORTH，SOUTH，EAST，WEST，CENTER。先放入边缘组件，当容器缩放的时候，边缘组件不会改变，而中部组件的大小会发生相应变化。
但是BorderLayout有一个问题，就是当添加多个组件到一个区域时，只显示最新添加的组件，而且组件会充满整个区域。解决的方法是在区域上添加一个面板(JPanel)，在面板上放置多个组件。
&#160;
3.箱式布局 (BoxLayout)
要想创建一个使用箱式布局的新容器,可以调用：

Box b = Box.createHorizontalBox&#40;&#41;;


  或者 


Box b = Box.createVerticalBox&#40;&#41;;


  下面是添加组件的常用方法： 


b.add&#40;okButton&#41;;
b.add&#40;cancelButtn&#41;;

在水平的箱子里,组件从左到右排列.在垂直的箱子里,组件从上到下排列。
下面详细的研究一下水平布局。
每个组件有三个尺寸,首选尺寸,最大尺寸,最小尺寸。
下面是箱式布局管理器的工作细节：

计算最高组件的最大高度。 
尝试把所有的组件在垂直方向上增至这个高度。 
如果一个组件没有增至这个高度，那么它的y对齐方式要通过调用getAlignmentY()方法获得。这个方法将返回一个介于0(顶端对齐)到1(底端对齐)之间的浮点数，组件的默认值是0.5。 
获得每个组件的首选宽度，然后把所有首选宽度累加起来。 
如果所有的首选宽度的总和小于箱的宽度，那么组件的宽度就会延伸到不超过最大宽度的值，直到适应箱的宽度为止。组件从左到右依次排列，并且相邻的组件之间没有空间。如果所有的首选宽度的总和大于箱的宽度，组件就会被压缩,但不会小于各自的最小宽度，直到适应箱子的宽度为止。如果组件的最小宽度之和大于箱的宽度，有些组件就会显示不出来。 

默认情况下，箱式布局各组件是没有间距的。如果需要添加间距,可以添加不可见的填充件。有这样三种填充件：支柱，固定区，胶水。

b.add&#40;label&#41;
b.add&#40;Box.createHorizontalStrut&#40;10&#41;&#41;;
b.add&#40;textField&#41;;


  固定区填充件有点像一对支柱。例如： 


b.add&#40;Box.createRightArea&#40;new Dimension&#40;5,20&#41;&#41;&#41;;

将添加一个宽度为5像素，高度是20像素的不可见区域。
胶水将组件互相拉开，直至充满整个空间。例如

b.add&#40;button1&#41;;
b.add&#40;Box.createGlue&#40;&#41;&#41;;
b.add&#40;button2&#41;;

如果这个箱子不包含其他的组件，那么button1就会被放在最左边，button2就会被放置到最右边。
4.网格组布局 (GridBagLayout)
网格组布局是所有布局管理器之首。可以认为网格组布局是没有限制的网格布局。在网格组布局中，行和列的尺寸都可以改变。可以通过将响铃的单元合并来适应更大的组件。使用网格组布局可能相当复杂，但是它最灵活且使用范围最广。
要想使用网格组布局管理器进行布局，必须经过下列过程：

建立GridBagLayout类型的对象。不需要指定网格的行数和列数，布局管理器会根据后面所给的信息猜测出来。 
把GridBagLayout对象设置成组件的布局管理器。 
为每个组件建立一个GridBagConstraints类型的对象。设置GridBagConstraints对象的域值以便制定组件在网格组中的布局方案。 
最后通过下面的调用添加组件的约束。 


add&#40;component,constrants&#41;;


  示例代码： 


JPanel panel = new [...]]]></description>
			<content:encoded><![CDATA[<p>绝大多数的Java程序员都不太热衷于写Java桌面应用程序，他们都觉得用Java写界面既丑，速度又慢，而且很复杂。许多人认为，Java写不了好的桌面程序。好多初学Java的人，在刚学会Java语法之后，直接跳过桌面程序，成为了JavaEE程序员</p>
<p>确实，对于VB或者VC来说,用Java写桌面程序难度差的不是一个数量级。Java语言，本来就不适合快速开发，对于Java大部分的开发框架，本不是针对快速开发而言，而是为了更好的扩展与重构。</p>
<p>个人认为，Swing的难点在于复杂的布局管理器。只要吃透了这个，写Java桌面程序就简单了。</p>
<p><span style="font-size: medium"><strong>1.流式布局 (FlowLayout)</strong></span></p>
<p>这是面板(JPanel)的默认布局管理器。流式布局管理器的特点是在一行上水平排列组件，直到没有足够的空间为止，这时开始新的一行。当用户缩放容器时，布局管理器自动地调整组件的位置使其填充可用的空间。</p>
<p>FlowLayout有三种构造方法,</p>
<ul>
<li>FlowLayout() : 使用居中的对齐方式,组件间水平和垂直间距都为5。 </li>
<li>FlowLayout(int align) : align表示对齐方式,可以是LEFT,CENTER或RIGHT。 </li>
<li>FlowLayout(int align, int hgap, int vgap) : hgap 水平间距,vgap 垂直间距。 </li>
</ul>
<p><strong><span style="font-size: medium">2.边界布局 (BorderLayout)</span></strong></p>
<p>这是每个JFrame的内容窗格的默认布局管理器( JFrame.getContentPane() ).</p>
<p>边界布局管理器把组件分成5个区域，NORTH，SOUTH，EAST，WEST，CENTER。先放入边缘组件，当容器缩放的时候，边缘组件不会改变，而中部组件的大小会发生相应变化。</p>
<p>但是BorderLayout有一个问题，就是当添加多个组件到一个区域时，只显示最新添加的组件，而且组件会充满整个区域。解决的方法是在区域上添加一个面板(JPanel)，在面板上放置多个组件。</p>
<p>&#160;</p>
<p><span style="font-size: medium"><strong>3.箱式布局 (BoxLayout)</strong></span></p>
<p>要想创建一个使用箱式布局的新容器,可以调用：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Box</span> b <span style="color: #339933;">=</span> <span style="color: #003399;">Box</span>.<span style="color: #006633;">createHorizontalBox</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
  <br />或者 </p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Box</span> b <span style="color: #339933;">=</span> <span style="color: #003399;">Box</span>.<span style="color: #006633;">createVerticalBox</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
  <br />下面是添加组件的常用方法： </p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>okButton<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>cancelButtn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>在水平的箱子里,组件从左到右排列.在垂直的箱子里,组件从上到下排列。</p>
<p>下面详细的研究一下水平布局。</p>
<p>每个组件有三个尺寸,首选尺寸,最大尺寸,最小尺寸。</p>
<p>下面是箱式布局管理器的工作细节：</p>
<ol>
<li>计算最高组件的最大高度。 </li>
<li>尝试把所有的组件在垂直方向上增至这个高度。 </li>
<li>如果一个组件没有增至这个高度，那么它的y对齐方式要通过调用getAlignmentY()方法获得。这个方法将返回一个介于0(顶端对齐)到1(底端对齐)之间的浮点数，组件的默认值是0.5。 </li>
<li>获得每个组件的首选宽度，然后把所有首选宽度累加起来。 </li>
<li>如果所有的首选宽度的总和小于箱的宽度，那么组件的宽度就会延伸到不超过最大宽度的值，直到适应箱的宽度为止。组件从左到右依次排列，并且相邻的组件之间没有空间。如果所有的首选宽度的总和大于箱的宽度，组件就会被压缩,但不会小于各自的最小宽度，直到适应箱子的宽度为止。如果组件的最小宽度之和大于箱的宽度，有些组件就会显示不出来。 </li>
</ol>
<p>默认情况下，箱式布局各组件是没有间距的。如果需要添加间距,可以添加不可见的填充件。有这样三种填充件：支柱，固定区，胶水。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>label<span style="color: #009900;">&#41;</span>
b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Box</span>.<span style="color: #006633;">createHorizontalStrut</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>textField<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
  <br />固定区填充件有点像一对支柱。例如： </p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Box</span>.<span style="color: #006633;">createRightArea</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Dimension</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>将添加一个宽度为5像素，高度是20像素的不可见区域。</p>
<p>胶水将组件互相拉开，直至充满整个空间。例如</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>button1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Box</span>.<span style="color: #006633;">createGlue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
b.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>button2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>如果这个箱子不包含其他的组件，那么button1就会被放在最左边，button2就会被放置到最右边。</p>
<p><span style="font-size: medium"><strong>4.网格组布局 (GridBagLayout)</strong></span></p>
<p>网格组布局是所有布局管理器之首。可以认为网格组布局是没有限制的网格布局。在网格组布局中，行和列的尺寸都可以改变。可以通过将响铃的单元合并来适应更大的组件。使用网格组布局可能相当复杂，但是它最灵活且使用范围最广。</p>
<p>要想使用网格组布局管理器进行布局，必须经过下列过程：</p>
<ol>
<li>建立GridBagLayout类型的对象。不需要指定网格的行数和列数，布局管理器会根据后面所给的信息猜测出来。 </li>
<li>把GridBagLayout对象设置成组件的布局管理器。 </li>
<li>为每个组件建立一个GridBagConstraints类型的对象。设置GridBagConstraints对象的域值以便制定组件在网格组中的布局方案。 </li>
<li>最后通过下面的调用添加组件的约束。 </li>
</ol>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">add<span style="color: #009900;">&#40;</span>component,constrants<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
  <br />示例代码： </p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">JPanel</span> panel <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">JLabel</span> label <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JLabel</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>Test<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">GridBagLayout</span> layout <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">GridBagLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
panel.<span style="color: #006633;">setLayout</span><span style="color: #009900;">&#40;</span>layout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">GridBagConstraints</span> constrants <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">GridBagConstraints</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">weightx</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">weighty</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">gridx</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">gridy</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">gridwidth</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
constrants.<span style="color: #006633;">gridheight</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
panel.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>label, constrants<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#160;</p>
<p>知道如何设置GridBagConstraints对象的状态是很重要的，下面详细介绍GridBagConstraints的约束属性。</p>
<p>1.gridxgridy，gridwidth，gridheight</p>
<p>gridx，gridy表示组件在网格中的行列位置(第N行,第N列,从0开始计算)。gridwidth，gridheight表示组件所占的网格的行数和列数。示例代码中constrants应用的组件在第0行，第2列，横向占用2格，纵向占用1格。</p>
<p>2.weightx，weighty</p>
<p>增量字段，如果增量字段设置为0，这个区域永远是初始尺寸。默认增量字段的值为1，代表等比例拉伸组件大小。</p>
<p>3.fill</p>
<p>表示组件填充当前网格的属性。它有四个有效值，NONE，HORIZONTAL，VERTICAL，BOTH (为GridBagConstraints的static final成员变量)，分表代表：不填充，横向填充，纵向填充，填充整个区域。</p>
<p>4.anchor</p>
<p>表示当组件在当前网格区域中的位置。有效值可以设置为CENTER，NORTH，SOUTH，NORTHEAST，EAST等。仅当组件没有充满整个区域时有效。</p>
<p>5.insets</p>
<p>表示外部填塞，用来设置组件周围增加的空白区域。通过设置Insets对象的left，right，top，button值在设置组件周围的空间量。</p>
<p>6.ipadx，ipady</p>
<p>表示内部填塞，该参数用以设置组件的最小尺寸。如果参数值为正值则组件的最小尺寸将比原始最小尺寸大，如果为负值，则组件的最小尺寸将会变得比原始的最小尺寸小。该参数也可以理解为直接为组件指定大小，这个设置的大小就是组件的最小尺寸。其设置后组件的大小为组件的原始最小尺寸加上ipadx(y)*2个像素。</p>
<p>对于GridBagLayout对象来说，本身也有columnWidths,rowHeights,columnWidths,rowWeights这四个属性。</p>
<p>1.columnWidths,rowHeights 设置一个int数组对象来表示各个网格的长度和宽度。例如</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">gbl.<span style="color: #006633;">columnWidths</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> <span style="color: #cc66cc;">30</span>, <span style="color: #cc66cc;">80</span>, <span style="color: #cc66cc;">80</span>, <span style="color: #cc66cc;">80</span>, <span style="color: #cc66cc;">30</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
gbl.<span style="color: #006633;">rowHeights</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> <span style="color: #cc66cc;">45</span>, <span style="color: #cc66cc;">200</span>, <span style="color: #cc66cc;">30</span>, <span style="color: #cc66cc;">45</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>表示网格中的前四列宽度为30，80，80，80，30,前四行宽度为45，200，30，45。</p>
<p>2.columnWeights，rowWeights 设置一个double数组对象来表示各个网格的长度和宽度的权重。当面板被拉伸时，会根据权重拉伸相对应的网格。权重为0表示不拉伸网格。为1表示等比例拉伸。</p>
<p>个人认为这个属性和GridBagConstraints中的weightx，weighty是一个意思，只是一个针对面板上的所有组件，一个针对相应组件而已。不过在实际的设计中，个人比较倾向于使用columnWeights， rowWeights而不是weightx，weighty。因为这样更全局，也更直观。</p>
<p>在使用GridBagLayout布局时，最好使用GridBagContraints帮助类(GBC)代替GridBagContraints类.这样会使得代码更加易读而且便于调试。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> GBC <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">GridBagConstraints</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 2242355893259876283L<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> gridx, <span style="color: #000066; font-weight: bold;">int</span> gridy<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridx</span> <span style="color: #339933;">=</span> gridx<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridy</span> <span style="color: #339933;">=</span> gridy<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> gridx, <span style="color: #000066; font-weight: bold;">int</span> gridy, <span style="color: #000066; font-weight: bold;">int</span> gridwidth, <span style="color: #000066; font-weight: bold;">int</span> gridheight<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridx</span> <span style="color: #339933;">=</span> gridx<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridy</span> <span style="color: #339933;">=</span> gridy<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridwidth</span> <span style="color: #339933;">=</span> gridwidth<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">gridheight</span> <span style="color: #339933;">=</span> gridheight<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC setAnchor<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> anchor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">anchor</span> <span style="color: #339933;">=</span> anchor<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC setFill<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> fill<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">fill</span> <span style="color: #339933;">=</span> fill<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC setWeight<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> weightx, <span style="color: #000066; font-weight: bold;">double</span> weighty<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">weightx</span> <span style="color: #339933;">=</span> weightx<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">weighty</span> <span style="color: #339933;">=</span> weighty<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC setInsets<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> distance<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">insets</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Insets</span><span style="color: #009900;">&#40;</span>distance, distance, distance, distance<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> GBC setIpad<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> ipadx, <span style="color: #000066; font-weight: bold;">int</span> ipady<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipadx</span> <span style="color: #339933;">=</span> ipadx<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipady</span> <span style="color: #339933;">=</span> ipady<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
  <br />下面是帮助类的使用方法 </p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">panel.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>label,<span style="color: #000000; font-weight: bold;">new</span> GBC<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setFill</span><span style="color: #009900;">&#40;</span>GBC.<span style="color: #006633;">BOTH</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setInsets</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#160;</p>
<p>注：本文参考《Java2核心技术卷一：基础知识》部分内容。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/609/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Work Timer V0.2</title>
		<link>http://www.loveazure.com/archives/592</link>
		<comments>http://www.loveazure.com/archives/592#comments</comments>
		<pubDate>Tue, 04 May 2010 15:11:54 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Work Timer]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=592</guid>
		<description><![CDATA[为什么要做这个工具?

我一直想做一个这样的工具.很多单位(包括我们单位)实行的是弹性工作制,上班时间只要满8小时就可以下班.因为我老是忘记早上什么时候打的卡,以至于经常在单位多待N久(其实也就是十几二十分钟).这个工具能很好的满足我的要求.
这个工具有什么功能?

1.针对弹性工作制的下班提醒,在某个时间段后程序会自动弹出对话框提示。
2.最小化到系统托盘,双击后显示程序界面。
3.下班提醒时,系统托盘变成闪烁状态(类似于QQ新消息)。
4.程序默认9小时之后提醒,用户可自由设置具体的工作时间。
5.当程序被关闭,如果用户在下班提醒之前重新打开,程序计时依然有效。
如何使用?

1.首先要安装Jre,下载地址:http://www.java.com/zh_CN/download/manual.jsp
2.双击运行该程序。
3.建议将程序设置为开机启动(将程序快捷方式拖到 开始-&#62;所有程序-&#62;启动 中,并将文件setting.properties 中的autoStart设为true)
下载地址
对于这个工具有什么问题可以联系我。
]]></description>
			<content:encoded><![CDATA[<h3>为什么要做这个工具?</h3>
<p><br/><br />
我一直想做一个这样的工具.很多单位(包括我们单位)实行的是弹性工作制,上班时间只要满8小时就可以下班.因为我老是忘记早上什么时候打的卡,以至于经常在单位多待N久(其实也就是十几二十分钟).这个工具能很好的满足我的要求.</p>
<h3>这个工具有什么功能?</h3>
<p><br/><br />
1.针对弹性工作制的下班提醒,在某个时间段后程序会自动弹出对话框提示。</p>
<p>2.最小化到系统托盘,双击后显示程序界面。</p>
<p>3.下班提醒时,系统托盘变成闪烁状态(类似于QQ新消息)。</p>
<p>4.程序默认9小时之后提醒,用户可自由设置具体的工作时间。</p>
<p>5.当程序被关闭,如果用户在下班提醒之前重新打开,程序计时依然有效。</p>
<h3>如何使用?</h3>
<p><br/><br />
1.首先要安装Jre,下载地址:<a href="http://www.java.com/zh_CN/download/manual.jsp">http://www.java.com/zh_CN/download/manual.jsp</a></p>
<p>2.双击运行该程序。</p>
<p>3.建议将程序设置为开机启动(将程序快捷方式拖到 开始-&gt;所有程序-&gt;启动 中,并将文件setting.properties 中的autoStart设为true)</p>
<p><a href="http://code.google.com/p/worktimerforjava/">下载地址</a></p>
<p>对于这个工具有什么问题可以联系我。<img class="alignnone" src="http://www.loveazure.com/wp-content/uploads/2008/12/emailpic1.png" alt="" width="193" height="24" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/592/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log4J使用不完全指南</title>
		<link>http://www.loveazure.com/archives/567</link>
		<comments>http://www.loveazure.com/archives/567#comments</comments>
		<pubDate>Tue, 04 May 2010 14:01:10 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[introduce]]></category>
		<category><![CDATA[Log4J]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=567</guid>
		<description><![CDATA[准备

登录apache.org，下载log4j最新jar文件。将jar文件导入到项目中.


快速应用

1.Log4J应用Demo

package com.log4j.test;
&#160;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
&#160;
public class StartUp &#123;
&#160;
	public static Logger logger;
&#160;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		StartUp s = new StartUp&#40;&#41;;
		s.configLog4J&#40;&#41;;
		s.go&#40;&#41;;
	&#125;
&#160;
	private void configLog4J&#40;&#41; &#123;
		// 1.获取日志记录器,Name一般取本类的名字
		logger = Logger.getLogger&#40;getClass&#40;&#41;.getName&#40;&#41;&#41;;
		// 2.配置Log4j环境
		// BasicConfigurator.configure();自动快速地使用缺省Log4j环境。
		// PropertyConfigurator.configure ( String configFilename);
		// 读取使用Java的特性文件编写的配置文件。
		// DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。
		PropertyConfigurator.configure&#40;&#34;Log4j.properties&#34;&#41;;
&#160;
	&#125;
&#160;
	private void go&#40;&#41; &#123;
		for &#40;int i=0;i&#38;lt;100;i++&#41; &#123;
			logger.debug&#40;&#34;test debug&#34;&#41;;
			logger.log&#40;Level.INFO, &#34;test info&#34;&#41;;
		&#125;
	&#125;
&#125;

2.新建配置文件 Log4j.properties

log4j.rootLogger=INFO, A1 ,A2
&#160;
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=&#91;%-5p&#93; &#91;%t&#93; %c - %m%n
&#160;
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=A2.log
log4j.appender.A2.Append=true
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=&#91;%-5p&#93; [...]]]></description>
			<content:encoded><![CDATA[<h3>准备</h3>
<p><br/></p>
<h3><span style="font-weight: normal; font-size: 13px;">登录<a href="http://apache.org">apache.org</a>，下载log4j最新jar文件。将jar文件导入到项目中.</span></h3>
<p><span style="font-weight: normal; font-size: 13px;"><br />
</span></p>
<h3>快速应用</h3>
<p><br/><br />
1.Log4J应用Demo</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.log4j.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.log4j.Level</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.log4j.Logger</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.log4j.PropertyConfigurator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StartUp <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Logger logger<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		StartUp s <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StartUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		s.<span style="color: #006633;">configLog4J</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		s.<span style="color: #006633;">go</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> configLog4J<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// 1.获取日志记录器,Name一般取本类的名字</span>
		logger <span style="color: #339933;">=</span> Logger.<span style="color: #006633;">getLogger</span><span style="color: #009900;">&#40;</span>getClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// 2.配置Log4j环境</span>
		<span style="color: #666666; font-style: italic;">// BasicConfigurator.configure();自动快速地使用缺省Log4j环境。</span>
		<span style="color: #666666; font-style: italic;">// PropertyConfigurator.configure ( String configFilename);</span>
		<span style="color: #666666; font-style: italic;">// 读取使用Java的特性文件编写的配置文件。</span>
		<span style="color: #666666; font-style: italic;">// DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</span>
		PropertyConfigurator.<span style="color: #006633;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Log4j.properties&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> go<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			logger.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test debug&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			logger.<span style="color: #006633;">log</span><span style="color: #009900;">&#40;</span>Level.<span style="color: #006633;">INFO</span>, <span style="color: #0000ff;">&quot;test info&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>2.新建配置文件 Log4j.properties</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">log4j.<span style="color: #006633;">rootLogger</span><span style="color: #339933;">=</span>INFO, A1 ,A2
&nbsp;
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">ConsoleAppender</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span>.<span style="color: #006633;">layout</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">PatternLayout</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">ConversionPattern</span><span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">%-</span>5p<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#91;</span><span style="color: #339933;">%</span>t<span style="color: #009900;">&#93;</span> <span style="color: #339933;">%</span>c <span style="color: #339933;">-</span> <span style="color: #339933;">%</span>m<span style="color: #339933;">%</span>n
&nbsp;
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A2</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">FileAppender</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A2</span>.<span style="color: #003399;">File</span><span style="color: #339933;">=</span>A2.<span style="color: #006633;">log</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A2</span>.<span style="color: #006633;">Append</span><span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">true</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A2</span>.<span style="color: #006633;">layout</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">PatternLayout</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A2</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">ConversionPattern</span><span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">%-</span>5p<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#91;</span><span style="color: #339933;">%</span>t<span style="color: #009900;">&#93;</span> <span style="color: #339933;">%</span>c <span style="color: #339933;">-</span> <span style="color: #339933;">%</span>m<span style="color: #339933;">%</span>n</pre></div></div>

<p>3.运行Demo即可看到效果</p>
<h3>Log4J详细配置</h3>
<p><br/></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">log4j.<span style="color: #006633;">rootLogger</span><span style="color: #339933;">=</span>INFO, A1
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">ConsoleAppender</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span>.<span style="color: #006633;">layout</span><span style="color: #339933;">=</span>org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">PatternLayout</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">A1</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">ConversionPattern</span><span style="color: #339933;">=%-</span>4r <span style="color: #009900;">&#91;</span><span style="color: #339933;">%-</span>5p<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#91;</span><span style="color: #339933;">%</span>t<span style="color: #009900;">&#93;</span> <span style="color: #339933;">%</span>l <span style="color: #339933;">-</span> <span style="color: #339933;">%</span>m<span style="color: #339933;">%</span>n</pre></div></div>

<p>1.配置根Logger，其语法为：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">log4j.<span style="color: #006633;">rootLogger</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span> level <span style="color: #009900;">&#93;</span> , appenderName, appenderName, …</pre></div></div>

<p>其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。</p>
<p>Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。<br />
比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br />
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。</p>
<p>2.配置日志信息输出目的地Appender，其语法为</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">appenderName</span> <span style="color: #339933;">=</span> fully.<span style="color: #006633;">qualified</span>.<span style="color: #006633;">name</span>.<span style="color: #006633;">of</span>.<span style="color: #006633;">appender</span>.<span style="color: #000000; font-weight: bold;">class</span>
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">appenderName</span>.<span style="color: #006633;">option1</span> <span style="color: #339933;">=</span> value1
…
log4j.<span style="color: #006633;">appender</span>.<span style="color: #006633;">appenderName</span>.<span style="color: #006633;">option</span> <span style="color: #339933;">=</span> valueN
其中，Log4j提供的appender有以下几种：
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">ConsoleAppender</span>（控制台），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">FileAppender</span>（文件），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">DailyRollingFileAppender</span>（每天产生一个日志文件），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">RollingFileAppender</span>（文件大小到达指定尺寸的时候产生一个新的文件），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">WriterAppender</span>（将日志信息以流格式发送到任意指定的地方）</pre></div></div>

<p>其中，Log4j提供的layout有以下几种：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">HTMLLayout</span>（以<span style="color: #003399;">HTML</span>表格形式布局），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">PatternLayout</span>（可以灵活地指定布局模式），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">SimpleLayout</span>（包含日志信息的级别和信息字符串），
org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">log4j</span>.<span style="color: #006633;">TTCCLayout</span>（包含日志产生的时间、线程、类别等等信息）</pre></div></div>

<p>3.pattern</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">%</span>c 输出类的名字，默认是输出全名，可以指定输出多少层次，比如
<span style="color: #339933;">%</span>c<span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#125;</span>这样配置的话 <span style="color: #0000ff;">&quot;a.b.c&quot;</span> 是全类名，会输出<span style="color: #0000ff;">&quot;b.c&quot;</span>.
<span style="color: #339933;">%</span>d 用来输出log事件发生的时间。
可以指定格式，比如：<span style="color: #339933;">%</span>d<span style="color: #009900;">&#123;</span>yyyy<span style="color: #339933;">-</span>MM<span style="color: #339933;">-</span>dd HH<span style="color: #339933;">:</span>mm<span style="color: #339933;">:</span>ss<span style="color: #009900;">&#125;</span>会输出
<span style="color: #cc66cc;">2007</span><span style="color: #339933;">-</span>04<span style="color: #339933;">-</span><span style="color: #cc66cc;">26</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">12</span><span style="color: #339933;">:</span>03
<span style="color: #339933;">%</span>F    输出log事件发生的文件。
<span style="color: #339933;">%</span>l    输出log事件发生的位置，会输出全类名和在源码的哪一行。
<span style="color: #339933;">%</span>L    输出log事件发生在源码的第几行。
<span style="color: #339933;">%</span>m    输出message的内容，就是logger.<span style="color: #006633;">info</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span>的内容。
<span style="color: #339933;">%</span>M    输出log事件发生的方法名。
<span style="color: #339933;">%</span>n    输出一个换行符。不用担心系统的问题。
<span style="color: #339933;">%</span>p    输出log事件的级别，即info，debug，warn等。
<span style="color: #339933;">%</span>r    输出log事件所用的时间。
<span style="color: #339933;">%</span>t    输出log事件所在的线程。
<span style="color: #339933;">%</span>x    输出NDC<span style="color: #009900;">&#40;</span>不明白什么意思，没试验出来<span style="color: #009900;">&#41;</span>
<span style="color: #339933;">%</span>X    输出MDC
<span style="color: #339933;">%%</span>    输出<span style="color: #339933;">%</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/567/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SCJP考试通过了</title>
		<link>http://www.loveazure.com/archives/501</link>
		<comments>http://www.loveazure.com/archives/501#comments</comments>
		<pubDate>Fri, 30 Oct 2009 17:17:34 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://67.208.116.194/~hade/?p=501</guid>
		<description><![CDATA[
前天去上海参加了SCJP的考试，终于过了，看来一个月的复习没白费。
考试地点在交大慧科南洋，提前一天去的预约。第二天中午到了那里，不过不知道是因为老师太热情的缘故，突然感觉有点紧张。在考场外面看了一个多小时的书，让自己调整下心情。
开始有几个问题好像是SUN的调查问卷（貌似还计入考试时间了），我没怎么看，都是胡乱填的。一共60道题（之前以为有72道），考试时间是3个小时，时间上还是比较充裕的。而且之前以为选择题是不定项选择题，后来才发现会告诉本题的答案数量，这也大大降低了难度。做题花了两个小时，检查了一个小时，最后成绩出来，81分，还是比较满意的。
SCJP的考试总体来说不难，但是设计J2SE的方方面面，虽然有的题看起来比较偏，但是确实能反映对一些知识的掌握程度。怎么说对自己这两年的技术有个交待了，很欣慰，哈哈！
接下来要等6周后才能拿到SUN寄出的考试证书，比较期待。
]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-502" title="SCJP成绩单" src="http://www.loveazure.com/wp-content/uploads/2009/10/DSC02811.JPG" alt="SCJP成绩单" /></p>
<p>前天去上海参加了SCJP的考试，终于过了，看来一个月的复习没白费。</p>
<p>考试地点在交大慧科南洋，提前一天去的预约。第二天中午到了那里，不过不知道是因为老师太热情的缘故，突然感觉有点紧张。在考场外面看了一个多小时的书，让自己调整下心情。</p>
<p>开始有几个问题好像是SUN的调查问卷（貌似还计入考试时间了），我没怎么看，都是胡乱填的。一共60道题（之前以为有72道），考试时间是3个小时，时间上还是比较充裕的。而且之前以为选择题是不定项选择题，后来才发现会告诉本题的答案数量，这也大大降低了难度。做题花了两个小时，检查了一个小时，最后成绩出来，81分，还是比较满意的。</p>
<p>SCJP的考试总体来说不难，但是设计J2SE的方方面面，虽然有的题看起来比较偏，但是确实能反映对一些知识的掌握程度。怎么说对自己这两年的技术有个交待了，很欣慰，哈哈！</p>
<p>接下来要等6周后才能拿到SUN寄出的考试证书，比较期待。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/501/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于Java的一些编译机制</title>
		<link>http://www.loveazure.com/archives/494</link>
		<comments>http://www.loveazure.com/archives/494#comments</comments>
		<pubDate>Mon, 26 Oct 2009 07:15:58 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[String常量]]></category>
		<category><![CDATA[编译]]></category>
		<category><![CDATA[重载]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=494</guid>
		<description><![CDATA[No.1 前几天在JavaEye上看到有人讨论Java对String常量优化的问题，代码如下：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
&#160;
public class TestA &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
                String s=&#34;ab&#34;;
		String s1=&#34;a&#34;;
		String s2=&#34;b&#34;;
		String s3=s1+s2;
		String s4=&#34;a&#34;+&#34;b&#34;;
		System.out.println&#40;s3==s4&#41;;
		System.out.println&#40;s3==&#34;ab&#34;&#41;;
		System.out.println&#40;s4==&#34;ab&#34;&#41;;
	&#125;
&#125;

结果：false
false
true
s3和s4虽然值相同，但是显然s3和s4并没有指向同一个String常量池中的String常量。String s4=&#8221;a&#8221;+&#8221;b&#8221;;，字符串连接的行为是在编译期间，编译器给优化了。而String s3=s1+s2;中的字符串连接是在代码运行期间进行的。这也间接的说明一个问题，就是String常量池在代码运行前就已经分配好了，代码运行时生成的String对象不会增加到String常量池中。因为s4指向的对象是在代码运行时新生成的对象，所以s3和s4没有指向同一个对象。
推荐这篇文章《Java编译器对于String常量表达式的优化》
No.2 Java编译涉及到的基本变量的问题。下面的代码

1
2
3
4
5
6
7
8
9
10
11
package test;
&#160;
public class TestA &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		short s=10;//这行代码可以通过编译
		new TestA&#40;&#41;.go&#40;11&#41;;//无法通过编译，需要进行类型转换
	&#125;
	short go&#40;short s&#41;&#123;
		return 12;//可以通过编译
	&#125;
&#125;

之前我一直无法理解为什么第5行和第9行可以通过编译，第6行不能通过编译，需要进行强制类型转换。因为这三行同样都是基本变量赋值的问题。后来我发现，这里面涉及到一个重载的问题。比如下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package test;
&#160;
public class TestA &#123;
	public static void [...]]]></description>
			<content:encoded><![CDATA[<p>No.1 前几天在JavaEye上看到有人讨论Java对String常量优化的问题，代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestA <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">String</span> s<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ab&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> s1<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> s2<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;b&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> s3<span style="color: #339933;">=</span>s1<span style="color: #339933;">+</span>s2<span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> s4<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;b&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>s3<span style="color: #339933;">==</span>s4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>s3<span style="color: #339933;">==</span><span style="color: #0000ff;">&quot;ab&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>s4<span style="color: #339933;">==</span><span style="color: #0000ff;">&quot;ab&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>结果：false<br />
false<br />
true</p>
<p>s3和s4虽然值相同，但是显然s3和s4并没有指向同一个String常量池中的String常量。String s4=&#8221;a&#8221;+&#8221;b&#8221;;，字符串连接的行为是在编译期间，编译器给优化了。而String s3=s1+s2;中的字符串连接是在代码运行期间进行的。这也间接的说明一个问题，就是String常量池在代码运行前就已经分配好了，代码运行时生成的String对象不会增加到String常量池中。因为s4指向的对象是在代码运行时新生成的对象，所以s3和s4没有指向同一个对象。</p>
<p>推荐这篇文章《<a href="http://java.ccidnet.com/art/3539/20070912/1210357_1.html">Java编译器对于String常量表达式的优化</a>》</p>
<p>No.2 Java编译涉及到的基本变量的问题。下面的代码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestA <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">short</span> s<span style="color: #339933;">=</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//这行代码可以通过编译</span>
		<span style="color: #000000; font-weight: bold;">new</span> TestA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">go</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//无法通过编译，需要进行类型转换</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">short</span> go<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">short</span> s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//可以通过编译</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>之前我一直无法理解为什么第5行和第9行可以通过编译，第6行不能通过编译，需要进行强制类型转换。因为这三行同样都是基本变量赋值的问题。后来我发现，这里面涉及到一个重载的问题。比如下面的代码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestA <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">short</span> s<span style="color: #339933;">=</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">new</span> TestA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">go</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//go方法会取调用最匹配的重载方法</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">short</span> go<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">short</span> s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//	short go(int i){</span>
<span style="color: #666666; font-style: italic;">//		return 12;</span>
<span style="color: #666666; font-style: italic;">//	}</span>
	<span style="color: #000066; font-weight: bold;">short</span> go<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span> l<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>在go(int i)的方法注释掉之前，自然会调用go(int i)方法，注释掉之后，g(11)会调用最匹配的重载方法，而11既可以赋值给short型(强制类型转换)，也可以赋值给long型（隐式类型转换），这是不可能的，不存在两个重载方法都匹配的情况，那样的话编译器无法知道真正要调用的方法到底是哪个。所以编译器无法为你主动做强制类型转换,，只能调用go(long l)方法。所以java规定第6行那样的情况需要做强制类型转换。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/494/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>protected访问级别</title>
		<link>http://www.loveazure.com/archives/486</link>
		<comments>http://www.loveazure.com/archives/486#comments</comments>
		<pubDate>Fri, 23 Oct 2009 08:30:11 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[protected]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=486</guid>
		<description><![CDATA[protected是子类继承和包级访问。对于包外子类，只能通过继承访问protected成员，不能通过使用对超类实例的引用来访问protected成员（换句话说，继承是包外子类访问其超类protected成员的唯一机制）。
对于实例变量和静态变量来说，有一些区别
TestA

package test4;
&#160;
public class TestA &#123;
	protected static int i = 11;
	protected int i2=12;
&#125;

TestB

package test5;
&#160;
import test4.TestA;
&#160;
public class TestB extends TestA&#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		TestA ta=new TestA&#40;&#41;;
		System.out.println&#40;ta.i&#41;;//
		System.out.println&#40;TestA.i&#41;;//
		System.out.println&#40;TestB.i&#41;;//
		//System.out.println(ta.i2); 这行代码不能被编译*
&#160;
		TestB tb=new TestB&#40;&#41;;
		System.out.println&#40;tb.i2&#41;;
		System.out.println&#40;tb.i&#41;;
		new TestA.go&#40;&#41;;
	&#125;
 	public void go&#40;&#41; &#123;
		System.out.println&#40;i&#41;;
		System.out.println&#40;i2&#41;;
	&#125;
&#125;

一开始觉得奇怪，因为在TestA里，System.out.println(ta.i);可以被编译，而System.out.println(ta.i2);不能被编译。
事实是，protected并不是父类的方法能在子类中访问，而是父类方法在子类中被继承，所以子类通过继承访问protected方法。
在TestA中，ta.i可以被访问，是因为静态变量i被继承，而静态变量是class级变量，ta.i相当于TestA.i而TestA.i也就相当于TestB.i(TestB继承了此静态变量),这点和对象不一样
而ta.i2,因为i2只能通过子类继承访问,所以从对象ta中无法访问实例变量i2
因为是继承访问，go方法中的两句代码可以被编译
]]></description>
			<content:encoded><![CDATA[<p>protected是子类继承和包级访问。对于包外子类，只能通过继承访问protected成员，不能通过使用对超类实例的引用来访问protected成员（换句话说，继承是包外子类访问其超类protected成员的唯一机制）。</p>
<p>对于实例变量和静态变量来说，有一些区别</p>
<p>TestA</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test4</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestA <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">int</span> i2<span style="color: #339933;">=</span><span style="color: #cc66cc;">12</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>TestB</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test5</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">test4.TestA</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestB <span style="color: #000000; font-weight: bold;">extends</span> TestA<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		TestA ta<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> TestA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>ta.<span style="color: #006633;">i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>TestA.<span style="color: #006633;">i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>TestB.<span style="color: #006633;">i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//</span>
		<span style="color: #666666; font-style: italic;">//System.out.println(ta.i2); 这行代码不能被编译*</span>
&nbsp;
		TestB tb<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> TestB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>tb.<span style="color: #006633;">i2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>tb.<span style="color: #006633;">i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">new</span> TestA.<span style="color: #006633;">go</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
 	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> go<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>i2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>一开始觉得奇怪，因为在TestA里，System.out.println(ta.i);可以被编译，而System.out.println(ta.i2);不能被编译。</p>
<p>事实是，protected并不是父类的方法能在子类中访问，而是父类方法在子类中被继承，所以子类通过继承访问protected方法。</p>
<p>在TestA中，ta.i可以被访问，是因为静态变量i被继承，而静态变量是class级变量，ta.i相当于TestA.i而TestA.i也就相当于TestB.i(TestB继承了此静态变量),这点和对象不一样</p>
<p>而ta.i2,因为i2只能通过子类继承访问,所以从对象ta中无法访问实例变量i2</p>
<p>因为是继承访问，go方法中的两句代码可以被编译</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/486/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RuntimeException</title>
		<link>http://www.loveazure.com/archives/482</link>
		<comments>http://www.loveazure.com/archives/482#comments</comments>
		<pubDate>Mon, 19 Oct 2009 11:37:10 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[异常]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=482</guid>
		<description><![CDATA[RuntimeException是非检查型异常，所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类。

public class TestA &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		throw new RuntimeException&#40;&#41;;
	&#125;
&#125;

上面代码的编译没有问题。
常见的RuntimeException有：

NullPointerException：空指针异常
&#160;
NumberFormatException：继承IllegalArgumentException，字符串转换为数字时异常。
比如int i= Integer.parseInt&#40;&#34;ab3&#34;&#41;;
&#160;
ArrayIndexOutOfBoundsException:数组越界
比如 int&#91;&#93; a=new int&#91;3&#93;; int b=a&#91;3&#93;; 
&#160;
StringIndexOutOfBoundsException：字符串越界
比如 String s=&#34;hello&#34;; char c=s.chatAt&#40;6&#41;;
&#160;
ClassCastException:类型转换错误
比如 Object obj=new Object&#40;&#41;; String s=&#40;String&#41;obj; 
&#160;
ClassCastException:类型转换错误
比如 Object obj=new Object&#40;&#41;; String s=&#40;String&#41;obj; 
&#160;
UnsupportedOperationException:该***作不被支持，如果我们希望不支持这个方法，可以抛出这个异常。既然不支持还要这个干吗？有可能子类中不想支持父类中有的方法，可以直接抛出这个异常。
&#160;
ArithmeticException：算术错误，典型的就是0作为除数的时候。
&#160;
IllegalArgumentException：非法参数，在把字符串转换成数字的时候经常出现的一个异常，我们可以在自己的程序中好好利用这个异常。

]]></description>
			<content:encoded><![CDATA[<p>RuntimeException是非检查型异常，所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestA <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">RuntimeException</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>上面代码的编译没有问题。</p>
<p>常见的RuntimeException有：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">NullPointerException</span>：空指针异常
&nbsp;
<span style="color: #003399;">NumberFormatException</span>：继承<span style="color: #003399;">IllegalArgumentException</span>，字符串转换为数字时异常。
比如<span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ab3&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">ArrayIndexOutOfBoundsException</span><span style="color: #339933;">:</span>数组越界
比如 <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> a<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">int</span> b<span style="color: #339933;">=</span>a<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #003399;">StringIndexOutOfBoundsException</span>：字符串越界
比如 <span style="color: #003399;">String</span> s<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hello&quot;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">char</span> c<span style="color: #339933;">=</span>s.<span style="color: #006633;">chatAt</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">ClassCastException</span><span style="color: #339933;">:</span>类型转换错误
比如 <span style="color: #003399;">Object</span> obj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #003399;">String</span> s<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>obj<span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #003399;">ClassCastException</span><span style="color: #339933;">:</span>类型转换错误
比如 <span style="color: #003399;">Object</span> obj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #003399;">String</span> s<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>obj<span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #003399;">UnsupportedOperationException</span><span style="color: #339933;">:</span>该<span style="color: #339933;">***</span>作不被支持，如果我们希望不支持这个方法，可以抛出这个异常。既然不支持还要这个干吗？有可能子类中不想支持父类中有的方法，可以直接抛出这个异常。
&nbsp;
<span style="color: #003399;">ArithmeticException</span>：算术错误，典型的就是<span style="color: #cc66cc;">0</span>作为除数的时候。
&nbsp;
<span style="color: #003399;">IllegalArgumentException</span>：非法参数，在把字符串转换成数字的时候经常出现的一个异常，我们可以在自己的程序中好好利用这个异常。</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/482/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java对象中代码的执行顺序</title>
		<link>http://www.loveazure.com/archives/480</link>
		<comments>http://www.loveazure.com/archives/480#comments</comments>
		<pubDate>Mon, 19 Oct 2009 11:34:19 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=480</guid>
		<description><![CDATA[主要涉及到三个方面，静态代码块，基本代码块以及构造方法
1.静态代码块是类在加载到类加载器后即执行的代码块，所以比其他二者都优先执行。
2.在同一个类中，如果碰到有多个静态代码块，则顺序执行各代码块。在父类与子类中，先执行父类的静态代码块，再执行子类的静态代码块。
3.在构建新对象时，先执行基本代码块，后执行构造方法。在父类与子类中，先执行父类的代码块/构造方法，后执行子类的代码块/构造方法
示例代码：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Bird &#123;
	&#123;
		System.out.print&#40;&#34;b1 &#34;&#41;;
	&#125;
&#160;
	public Bird&#40;&#41; &#123;
		System.out.print&#40;&#34;b2 &#34;&#41;;
	&#125;
	static&#123;
		System.out.print&#40;&#34;b3 &#34;&#41;;
	&#125;
&#125;
&#160;
class Raptor extends Bird &#123;
	static &#123;
		System.out.print&#40;&#34;r1 &#34;&#41;;
	&#125;
&#160;
	public Raptor&#40;&#41; &#123;
		System.out.print&#40;&#34;r2 &#34;&#41;;
	&#125;
&#160;
	static &#123;
		System.out.print&#40;&#34;r3 &#34;&#41;;
	&#125;
&#125;
&#160;
class Hawk extends Raptor &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		System.out.print&#40;&#34;pre &#34;&#41;;
		new Hawk&#40;&#41;;
		System.out.print&#40;&#34;hawk &#34;&#41;;
	&#125;
&#125;

Result:b3 r1 r3 pre b1 b2 r2 hawk
]]></description>
			<content:encoded><![CDATA[<p>主要涉及到三个方面，静态代码块，基本代码块以及构造方法</p>
<p>1.静态代码块是类在加载到类加载器后即执行的代码块，所以比其他二者都优先执行。</p>
<p>2.在同一个类中，如果碰到有多个静态代码块，则顺序执行各代码块。在父类与子类中，先执行父类的静态代码块，再执行子类的静态代码块。</p>
<p>3.在构建新对象时，先执行基本代码块，后执行构造方法。在父类与子类中，先执行父类的代码块/构造方法，后执行子类的代码块/构造方法</p>
<p>示例代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Bird <span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;b1 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Bird<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;b2 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">static</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;b3 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Raptor <span style="color: #000000; font-weight: bold;">extends</span> Bird <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;r1 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Raptor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;r2 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;r3 &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Hawk <span style="color: #000000; font-weight: bold;">extends</span> Raptor <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pre &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">new</span> Hawk<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hawk &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Result:b3 r1 r3 pre b1 b2 r2 hawk</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/480/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring AOP</title>
		<link>http://www.loveazure.com/archives/477</link>
		<comments>http://www.loveazure.com/archives/477#comments</comments>
		<pubDate>Mon, 19 Oct 2009 11:30:16 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[aop]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=477</guid>
		<description><![CDATA[AOP是Aspect Oriented Programming的缩写，意思是面向方面编程，一种新兴的编程技术。
AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切（crosscut）问题,如：事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个大问题的时候,AOP就可以很轻松的解决横切关注点这个问题。
Spring主要通过代理来实现AOP
下面是AOP的一些基本概念:
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)
连接点(JoinPoint):被拦截到的点,泛指方法
切入点(CutPoint):对哪些连接点进行拦截的定义
通知(Advice):在特定的连接点，AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)
引入（Introduction）: 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如，你可以使用一个引入使任何对象实现 IsModified接口，来简化缓存。
目标对象（Target Object）: 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理（AOP Proxy）: AOP框架创建的对象，包含通知。 在Spring中，AOP代理可以是JDK动态代理或者CGLIB代理。
织入（Weaving）: 组装方面来创建一个被通知对象。这可以在编译时 完成（例如使用AspectJ编译器），也可以在运行时完成。Spring和其他纯Java AOP框架一样， 在运行时完成织入。
Spring主要通过代理来实现AOP 。
下面是AOP的一些基本概念:
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)
连接点(JoinPoint):被拦截到的点,泛指方法
切入点(CutPoint):对哪些连接点进行拦截的定义
通知(Advice):在特定的连接点，AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)
引入（Introduction）: 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如，你可以使用一个引入使任何对象实现 IsModified接口，来简化缓存。
目标对象（Target Object）: 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理（AOP Proxy）: AOP框架创建的对象，包含通知。 在Spring中，AOP代理可以是JDK动态代理或者CGLIB代理。
织入（Weaving）: 组装方面来创建一个被通知对象。这可以在编译时 完成（例如使用AspectJ编译器），也可以在运行时完成。Spring和其他纯Java AOP框架一样， 在运行时完成织入。
Spring提供两种方式实现AOP，一种是XML配置的方式，一种是annotation注解的方式
总结一下AOP的优点:
面对方法编程并不是要取代面对对象编程，而是要提高它。AOP程序员一般来说都是90％使用OOP来解决问题,而10％是用AOP来解决OOP不能解决的问题。
横切关注点（Cross-cutting Concerns）
很多时候你发现你的类并不能十分清晰和明白的表到你所想表达的功能意义，因为你真正的代码
大多被其它代码所包围了。如果你想很好的扩展或集成你所想表达的功能意义，你最好就用方面
的思想来考虑它了。
开发中的分层(Layering Based on Deployment)
AOP另外一个很有用的地方就是可以用来为你的应用程序分层。很多时候你希望的一些特殊应用或
类是可以很好的配置的，但同时也希望这些东西是不臃肿和可以扩展的。AOP提供了很好的途径来
分层这些复杂的东西。JBOSS AOP提供了XML配置的机制来配置每个方面的开发。最好的例子就是
缓存服务，它提供了不同的锁机制。这些缓存锁机制可以很好的织入你的类，而不影响你的类的
代码，这样你的类就是很好的扩展性了。
透明性(Transparency)
很多时候你都想把你的程序的焦点集中在商务应用和应用逻辑上，而不是关注于中间件的开发。
AOP允许你透明的应用中间件而不再使你的代码收到污染。一个很好的例子就是JBOSS AOP中的
用户认证上面。
异常处理
处理异常是AOP提供给我们另外一个很有用的东西。例如，SQLException异常包含了SQL语句的
异常信息或者数据库的死锁等信息，但这些信息却使用不同错误代码和信息。AOP可以让你拦截
SQL语句信息，并分类处理数据库死锁信息。
参考：http://www.javaeye.com/topic/480860
]]></description>
			<content:encoded><![CDATA[<p>AOP是Aspect Oriented Programming的缩写，意思是面向方面编程，一种新兴的编程技术。</p>
<p>AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切（crosscut）问题,如：事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个大问题的时候,AOP就可以很轻松的解决横切关注点这个问题。</p>
<p>Spring主要通过代理来实现AOP<br />
下面是AOP的一些基本概念:<br />
切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)<br />
连接点(JoinPoint):被拦截到的点,泛指方法<br />
切入点(CutPoint):对哪些连接点进行拦截的定义<br />
通知(Advice):在特定的连接点，AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)<br />
引入（Introduction）: 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如，你可以使用一个引入使任何对象实现 IsModified接口，来简化缓存。<br />
目标对象（Target Object）: 包含连接点的对象。也被称作 被通知或被代理对象。<br />
AOP代理（AOP Proxy）: AOP框架创建的对象，包含通知。 在Spring中，AOP代理可以是JDK动态代理或者CGLIB代理。<br />
织入（Weaving）: 组装方面来创建一个被通知对象。这可以在编译时 完成（例如使用AspectJ编译器），也可以在运行时完成。Spring和其他纯Java AOP框架一样， 在运行时完成织入。<br />
Spring主要通过代理来实现AOP 。</p>
<p>下面是AOP的一些基本概念:</p>
<p>切面(Aspect):对横切关注点的抽象(类似类对对象的抽象)</p>
<p>连接点(JoinPoint):被拦截到的点,泛指方法</p>
<p>切入点(CutPoint):对哪些连接点进行拦截的定义</p>
<p>通知(Advice):在特定的连接点，AOP框架执行的动作.前置/后置/例外/最终/环绕通知(调用方法之前执行,全部执行完毕之后)</p>
<p>引入（Introduction）: 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如，你可以使用一个引入使任何对象实现 IsModified接口，来简化缓存。</p>
<p>目标对象（Target Object）: 包含连接点的对象。也被称作 被通知或被代理对象。</p>
<p>AOP代理（AOP Proxy）: AOP框架创建的对象，包含通知。 在Spring中，AOP代理可以是JDK动态代理或者CGLIB代理。</p>
<p>织入（Weaving）: 组装方面来创建一个被通知对象。这可以在编译时 完成（例如使用AspectJ编译器），也可以在运行时完成。Spring和其他纯Java AOP框架一样， 在运行时完成织入。</p>
<p>Spring提供两种方式实现AOP，一种是XML配置的方式，一种是annotation注解的方式</p>
<p>总结一下AOP的优点:<br />
面对方法编程并不是要取代面对对象编程，而是要提高它。AOP程序员一般来说都是90％使用OOP来解决问题,而10％是用AOP来解决OOP不能解决的问题。</p>
<p>横切关注点（Cross-cutting Concerns）<br />
很多时候你发现你的类并不能十分清晰和明白的表到你所想表达的功能意义，因为你真正的代码<br />
大多被其它代码所包围了。如果你想很好的扩展或集成你所想表达的功能意义，你最好就用方面<br />
的思想来考虑它了。</p>
<p>开发中的分层(Layering Based on Deployment)<br />
AOP另外一个很有用的地方就是可以用来为你的应用程序分层。很多时候你希望的一些特殊应用或<br />
类是可以很好的配置的，但同时也希望这些东西是不臃肿和可以扩展的。AOP提供了很好的途径来<br />
分层这些复杂的东西。JBOSS AOP提供了XML配置的机制来配置每个方面的开发。最好的例子就是<br />
缓存服务，它提供了不同的锁机制。这些缓存锁机制可以很好的织入你的类，而不影响你的类的<br />
代码，这样你的类就是很好的扩展性了。</p>
<p>透明性(Transparency)<br />
很多时候你都想把你的程序的焦点集中在商务应用和应用逻辑上，而不是关注于中间件的开发。<br />
AOP允许你透明的应用中间件而不再使你的代码收到污染。一个很好的例子就是JBOSS AOP中的<br />
用户认证上面。</p>
<p>异常处理<br />
处理异常是AOP提供给我们另外一个很有用的东西。例如，SQLException异常包含了SQL语句的<br />
异常信息或者数据库的死锁等信息，但这些信息却使用不同错误代码和信息。AOP可以让你拦截<br />
SQL语句信息，并分类处理数据库死锁信息。</p>
<p>参考：http://www.javaeye.com/topic/480860</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/477/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring入门</title>
		<link>http://www.loveazure.com/archives/475</link>
		<comments>http://www.loveazure.com/archives/475#comments</comments>
		<pubDate>Fri, 02 Oct 2009 12:28:49 +0000</pubDate>
		<dc:creator>低调の华丽</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.loveazure.com/?p=475</guid>
		<description><![CDATA[1.Spring依赖库
spring.jar,commons-logging.jar,log4j-1.2.14.jar
2.拷贝spring配置文件applicationContext.xml到src下
&#60;bean id=&#8221;UserDao&#8221; class=&#8221;com.spring.dao.UserDao4MySqlImp&#8221;&#62;&#60;/bean&#62;
&#60;bean id=&#8221;UserManage&#8221; class=&#8221;com.spring.manage.UserManageImp&#8221;&#62;
 &#60;property name=&#8221;ud&#8221; ref=&#8221;UserDao&#8221;&#62;&#60;/property&#62;
&#60;/bean&#62;
&#60;bean id=&#8221;UserDao&#8221;&#62;&#60;/bean&#62;
 &#60;bean id=&#8221;UserManage&#8221;&#62;
 &#60;property name=&#8221;ud&#8221; ref=&#8221;UserDao&#8221;&#62;&#60;/property&#62;
 &#60;/bean&#62;
3.在UserManageImp中提供构造函数或setter方法，spring将构造好的UserDao实现注入给我们。
4.让spring管理我们的对象创建和依赖，必须在spring配置中定义
5.编写客户端
 
BeanFactory factory = new ClassPathXmlApplicationContext(&#8220;applicationContext.xml&#8221;);
UserManage um = (UserManage) factory.getBean(&#8220;UserManage&#8221;);
um.save(&#8220;张三&#8221;, &#8220;123456&#8243;);
Spring Ioc容器的关键点
1.必须将被管理的对象定义到spring配置文件中
2.必须定义构造函数或setter方法，让spring将对象注入过来
]]></description>
			<content:encoded><![CDATA[<p>1.Spring依赖库</p>
<p>spring.jar,commons-logging.jar,log4j-1.2.14.jar</p>
<p>2.拷贝spring配置文件applicationContext.xml到src下</p>
<blockquote><p>&lt;bean id=&#8221;UserDao&#8221; class=&#8221;com.spring.dao.UserDao4MySqlImp&#8221;&gt;&lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;UserManage&#8221; class=&#8221;com.spring.manage.UserManageImp&#8221;&gt;</p>
<p><span style="white-space:pre"> </span>&lt;property name=&#8221;ud&#8221; ref=&#8221;UserDao&#8221;&gt;&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p></blockquote>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 25px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;bean id=&#8221;UserDao&#8221;&gt;&lt;/bean&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 25px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>&lt;bean id=&#8221;UserManage&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 25px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>&lt;property name=&#8221;ud&#8221; ref=&#8221;UserDao&#8221;&gt;&lt;/property&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 25px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>&lt;/bean&gt;</div>
<p><span style="background-color: #ffffff; ">3.在UserManageImp中提供构造函数或setter方法，spring将构造好的UserDao实现注入给我们。</span></p>
<p><span style="background-color: #ffffff; ">4.让spring管理我们的对象创建和依赖，必须在spring配置中定义</span></p>
<p><span style="background-color: #ffffff; ">5.编写客户端</span></p>
<p><span style="background-color: #ffffff; "> </span></p>
<blockquote><p>BeanFactory factory = new ClassPathXmlApplicationContext(<span style="background-color: #ffffff; ">&#8220;applicationContext.xml&#8221;);</span></p>
<p>UserManage um = (UserManage) factory.getBean(&#8220;UserManage&#8221;);</p>
<p>um.save(&#8220;张三&#8221;, &#8220;123456&#8243;);</p></blockquote>
<p>Spring Ioc容器的关键点</p>
<p>1.必须将被管理的对象定义到spring配置文件中</p>
<p>2.必须定义构造函数或setter方法，让spring将对象注入过来</p>
]]></content:encoded>
			<wfw:commentRss>http://www.loveazure.com/archives/475/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
