<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=POJO</id>
	<title>POJO - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=POJO"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=POJO&amp;action=history"/>
	<updated>2026-07-16T00:21:43Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=POJO&amp;diff=4827091&amp;oldid=prev</id>
		<title>imported&gt;Wolfch：​/* 透明地增加服務 */</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=POJO&amp;diff=4827091&amp;oldid=prev"/>
		<updated>2025-12-30T00:48:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;透明地增加服務&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA&lt;br /&gt;
| G1 = IT&lt;br /&gt;
}}&lt;br /&gt;
[[软件工程]]裡的&amp;#039;&amp;#039;&amp;#039;POJO&amp;#039;&amp;#039;&amp;#039;（plain old Java object)，也稱為&amp;#039;&amp;#039;&amp;#039;普通老式Java物件&amp;#039;&amp;#039;&amp;#039;、&amp;#039;&amp;#039;&amp;#039;純Java物件&amp;#039;&amp;#039;&amp;#039;、&amp;#039;&amp;#039;&amp;#039;一般Java物件&amp;#039;&amp;#039;&amp;#039;，是沒有受特殊限制的一般[[Java]][[对象 (计算机科学)|物件]]，這是[[马丁·福勒]]（Martin Fowler）、Rebecca Parsons和Josh MacKenzie在2000年9月時所提出&amp;lt;ref name=&amp;quot;bliki&amp;quot;&amp;gt;{{cite web |url=http://www.martinfowler.com/bliki/POJO.html |title=MF Bliki: POJO |work=MartinFowler.com }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{blockquote|我們一直很疑惑為何人們很抗拒在其系統中使用一般的物件，結論是這類物件缺少了有趣的名字。因此我們就取了名字，如今就很受歡迎…}}&lt;br /&gt;
&lt;br /&gt;
「POJO」一詞一開始是指不依循任何主流Java物件模型、約定或框架的Java物件，和複雜的物件模型相對。&lt;br /&gt;
&lt;br /&gt;
此一詞語開啟了一連串[[首字母縮略字]]，針對不使用先進技術的構造建立[[返璞词]]。&lt;br /&gt;
&lt;br /&gt;
* [[JavaScript]]裡的「普通老式JavaScript物件」（Plain old JavaScript object）&amp;lt;ref&amp;gt;{{cite web |url=http://ajaxian.com/archives/return-of-the-pojo-plain-ole-javascript |url-status=dead |archive-url=https://web.archive.org/web/20140913151352/http://ajaxian.com/archives/return-of-the-pojo-plain-ole-javascript |archive-date=2014-09-13 |title=Return of the POJO: Plain &amp;#039;Ole JavaScript |last=Almaer |first=Dion |work=Ajaxian |date=2006-07-17 |access-date=2014-08-19 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Ruby]]裡的「普通老式Ruby物件」（Plain old Ruby object，簡稱PORO）  &lt;br /&gt;
* [[Perl]]裡的「普通老式文件」（Plain old Documentation，簡稱pod）&lt;br /&gt;
* [[.NET框架]]裡的「[[一般CLR物件]]」（Plain old CLR object，簡稱POCO）&amp;lt;ref&amp;gt;{{cite web |url=http://msdn.microsoft.com/en-us/library/cc681329.aspx |title=POCO Support |work=microsoft.com |access-date=2012-05-27 }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
* [[PHP]]裡的「普通老式PHP物件」（Plain old PHP object，簡稱POPO&amp;lt;ref&amp;gt;{{cite web |url=http://jan.kneschke.de/2007/2/19/typesafe-objects-in-php/ |title=typesafe objects in PHP |first=Jan |last=Kneschke |date=2007-02-19 |work=kneschke.de |access-date=2012-05-27 |url-status=dead |archive-url=https://web.archive.org/web/20120326195616/http://jan.kneschke.de/2007/2/19/typesafe-objects-in-php/ |archive-date=2012-03-26 }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://jym.sg/controller-with-bare-bone-plain-old-php-objec |title=Controller with bare-bone Plain Old PHP Object aka POPO |first=Jym |last=Cheong |date=2011-06-26 |work=jym.sg |access-date=2012-05-27 |url-status=dead |archive-url=https://web.archive.org/web/20120326195611/http://jym.sg/controller-with-bare-bone-plain-old-php-objec |archive-date=2012-03-26 }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
* [[电话学]]裡的「[[普通老式电话服务]]」（Plain old telephone service，簡稱POTS）&lt;br /&gt;
==定義==&lt;br /&gt;
理想上，POJO是一種只受Java語言規範所限制，此外不受其他限制的Java物件，因此，POJO不應：&lt;br /&gt;
* 繼承預定義的類型，像是&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.servlet.http.HttpServlet;&lt;br /&gt;
&lt;br /&gt;
public class Foo extends HttpServlet { &lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 實現預定義的介面，像是&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.ejb.EntityBean;&lt;br /&gt;
&lt;br /&gt;
public class Bar implements EntityBean {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 包括預定義的[[Java注解]]（annotations），像是&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
&lt;br /&gt;
@Entity&lt;br /&gt;
public class Baz {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
不過，因為技術問題（例如要讓持久化正常運作）和其他原因，許多宣稱是POJO相容的軟體產品或是框架仍需要用到一些預定義的註解。&lt;br /&gt;
&lt;br /&gt;
POJO的概念是若物件（其實是類別）在加入註解之前是POJO，在移除註解後仍可以視為是POJO。POJO的基本概念是：沒有特殊的特徵（例如實現特定介面），因此不是「特殊Java物件」（Specialized Java Object）。&lt;br /&gt;
==不同環境下的定義==&lt;br /&gt;
===JavaBeans===&lt;br /&gt;
{{main|JavaBeans}}&lt;br /&gt;
[[JavaBeans]]是支援[[序列化]]，具有{{tsl|en|Nullary constructor|无参构造器}}，提供[[赋值方法|getter方法和setter方法]]存取物件的POJO。因為此命名規則，可以對任意JavaBeans的屬性進行簡單的宣告式參考。使用這類宣告式參考的程式碼不需知道有關JavaBean類型的任何資訊，JavaBean可以用在許多的框架中，框架不需知道JavaBeans的實際型態。&lt;br /&gt;
若要完全實現JavaBeans規範，必須實現[[序列化]]介面，因此會稍微打破POJO的規定。因為[[序列化]]是標記介面，不需實現任何方法，在程式碼上的負擔很小。&lt;br /&gt;
&lt;br /&gt;
以下是[[JavaServer Faces]]（JSF）元件和POJO屬性雙方綁定的例子：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h:inputText value=&amp;quot;#{MyBean.someProperty}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POJO的定義如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MyBean {&lt;br /&gt;
    private String someProperty;&lt;br /&gt;
&lt;br /&gt;
    public String getSomeProperty() {&lt;br /&gt;
         return someProperty;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setSomeProperty(String someProperty) {&lt;br /&gt;
        this.someProperty = someProperty;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因為JavaBean的命名原則，單一的&amp;lt;code&amp;gt;someProperty&amp;lt;/code&amp;gt;參考可以自動翻譯成取值的&amp;lt;code&amp;gt;getSomeProperty()&amp;lt;/code&amp;gt;方法（或性質是[[布林 (資料類型)|布林]]，則是&amp;lt;code&amp;gt;isSomeProperty()&amp;lt;/code&amp;gt;方法），以及設定值的&amp;lt;code&amp;gt;setSomeProperty(String)&amp;lt;/code&amp;gt;方法。&lt;br /&gt;
&lt;br /&gt;
Project Lombok函式庫可以動態改變程式碼，在不用寫這些程式碼的情形下進行整合。以下的程式碼會創建相同的JavaBean，再加上空的創建子：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@NoArgsConstructor&lt;br /&gt;
public class MyBean {&lt;br /&gt;
    @Getter &lt;br /&gt;
    @Setter&lt;br /&gt;
    private String someProperty;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
其他這類命名約定的函式庫或是框架會直接產生程式，可減少{{link-en|重覆代碼|Boilerplate code}}（Boilerplate code），也減少了錯誤的出現率以及維護成本。&lt;br /&gt;
&lt;br /&gt;
===透明地增加服務===&lt;br /&gt;
隨著使用POJO的設計越來越普遍，已出現了為POJO提供所有功能，並且可以選擇實際需要哪些功能領域的框架。在此模型下，程式設計者創建的就只有POJO。此POJO只專注在[[业务逻辑]]，不依賴（企業級）框架。[[面向切面的程序设计]]（AOP）框架透明地加入[[横切关注点]]，像是持久性（Persistence）、事务处理、安全性等&amp;lt;ref name=&amp;quot;Martin2008&amp;quot;&amp;gt;Martin, Robert C; (2008); &amp;#039;&amp;#039;Clean Code&amp;#039;&amp;#039;, Chapter 11, &amp;#039;&amp;#039;Pure Java AOP Frameworks&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
[[Spring Framework]]是很早期實現此概念的框架，也是推廣此模型的推進者之一。&lt;br /&gt;
&lt;br /&gt;
以下是一些這類的例子：&lt;br /&gt;
* [[Enterprise JavaBeans]]（EJB） &lt;br /&gt;
* [[Java持久化API]]（JPA，包括[[Hibernate]]）&lt;br /&gt;
* CDI（Java EE平台的上下文和依賴入）&lt;br /&gt;
&lt;br /&gt;
以下的例子是一個全功能的EJB bean，說明EJB3如何善用POJO模型的特點：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class HelloWorldService {&lt;br /&gt;
&lt;br /&gt;
    public String sayHello() {&lt;br /&gt;
        return &amp;quot;Hello, world!&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在以上的範例中，程式碼沒有延伸任何EJB的類別，或是實現任何EJB的介面，也不需要包括EJB的註解。程式開發者會宣告外部的[[XML]]檔，說明哪些EJB服務需加在其中：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;enterprise-beans&amp;gt;&lt;br /&gt;
    &amp;lt;session&amp;gt;&lt;br /&gt;
        &amp;lt;ejb-name&amp;gt;helloWorld&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;
        &amp;lt;ejb-class&amp;gt;com.example.HelloWorldService&amp;lt;/ejb-class&amp;gt;&lt;br /&gt;
        &amp;lt;session-type&amp;gt;stateless&amp;lt;/session-type&amp;gt;&lt;br /&gt;
    &amp;lt;/session&amp;gt;&lt;br /&gt;
&amp;lt;/enterprise-beans&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在實務上，有些人會覺得Java註解比較優雅輕巧，認為XML冗長、醜陋，不容易維護，不過也有人比較在意Java註 解對POJO模型的污染&amp;lt;ref&amp;gt;Panda, Debu; Rahman, Reza; Lane, Derek; (2007). &amp;#039;&amp;#039;EJB 3 in action&amp;#039;&amp;#039;, Manning Publications Co., Shelter Island (NY), {{ISBN|978-1-93-398834-4}} (www.manning.com/books/ejb-3-in-action). Chapter 11, &amp;#039;&amp;#039;Deployment descriptors vs. annotations&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
因此，許多框架（像Spring、EJB和JPA）提供可以不用XML的替代作法，可以不加入XML，改用註解代替。以下程式也是同一個EJB bean，但加入了註解，此例中就不需要XML檔了：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Stateless&lt;br /&gt;
public class HelloWorldService {&lt;br /&gt;
&lt;br /&gt;
    public String sayHello() {&lt;br /&gt;
        return &amp;quot;Hello, world!&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因為有加入註解，此程式已不是真正的純POJO，不過註解只是被動性的元資料，和侵入式的延伸類別和實現介面來說，註解的缺點要少很多&amp;lt;ref name=&amp;quot;Martin2008&amp;quot; /&amp;gt;。此程式開發模型仍很像純POJO模型。&lt;br /&gt;
&lt;br /&gt;
==相關首字母縮略字==&lt;br /&gt;
===POJI===&lt;br /&gt;
POJI（A Plain old Java Interface）是一種基本的Java[[接口 (Java)|介面]]，適用在不允許更複雜Java介面的應用&amp;lt;ref name=&amp;quot;RAD&amp;quot;/&amp;gt;{{rp|57,572,576,579,1340}}。&lt;br /&gt;
&lt;br /&gt;
==相關條目==&lt;br /&gt;
* [[数据传输对象]]（DTO）&lt;br /&gt;
* [[貧血領域模型]]&lt;br /&gt;
* [[KISS原则]]&lt;br /&gt;
==參考資料==&lt;br /&gt;
{{reflist|refs=&lt;br /&gt;
&amp;lt;ref name=&amp;quot;RAD&amp;quot;&amp;gt;{{cite book|title=Rational Application Developer V7.5 Programming Guide|first1=Ueli|last1=Wahli|first2=Miguel|last2=Vieira|first3=Ferreira Lopes|last3=Gomes|first4=Brian|last4=Hainey|first5=Ahmed|last5=Moharram|first6=JuanPablo|last6=Napoli|first7=Marco|last7=Rohr|first8=Henry|last8=Cui|first9=Patrick|last9=Gan|first10=Celso|last10=Gonzalez|first11=Pinar|last11=Ugurlu|first12=Lara|last12=Ziosi|date=29 June 2009|publisher=IBM Redbooks|isbn=978-0738432892 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;br /&gt;
[[Category:计算机行话]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Wolfch</name></author>
	</entry>
</feed>