锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鎴戜滑鐨勬濊礬鏄厛鍐欎竴涓狟aseDao錛屼豢鐓ibernateTemplate錛屽皢鍩烘湰鍔熻兘鍏ㄩ儴瀹炵幇錛?/p>
public class BaseDao extends HibernateDaoSupport{ 聽聽聽 private Log log = LogFactory.getLog(getClass()); 聽聽聽 public Session openSession() { 聽聽聽 public Object get(Class entityClass, Serializable id) throws DataAccessException { 聽聽聽 public Serializable create(Object entity) throws DataAccessException { ... 鍏跺畠鐨凞AO錛屼粠BaseDao緇ф壙鍑烘潵錛岃繖鏍峰啓鍏朵粬鐨凞AO錛屼唬鐮佸氨浼氬緢灝戙?/p>
浠嶣aseDao緇ф壙鍑烘潵EntityDao錛屼笓闂ㄨ礋璐d竴鑸疄浣撶殑鍩烘湰鎿嶄綔錛屼細鏇存柟渚褲?/p>
public interface EntityDao { 聽聽聽 public Object get(Class entityClass, Serializable id) throws DataAccessException; 聽聽聽 public Object load(Class entityClass, Serializable id) throws DataAccessException; 聽聽聽 public Serializable create(Object entity) throws DataAccessException; /** } 涓轟簡Transaction鐨勬帶鍒訛紝閲囩敤AOP鐨勬柟寮忥細 public interface EntityManager { 聽聽聽 public Object get(Class entityClass, Serializable id); 聽聽聽 public Object load(Class entityClass, Serializable id); 聽聽聽 public Serializable create(Object entity); } /** 聽聽聽 private EntityDao entityDao; 聽聽聽 public void setEntityDao(EntityDao entityDao) { 聽聽聽 public Object get(Class entityClass, Serializable id) { 聽聽聽 public Object load(Class entityClass, Serializable id) { } 榪欐牱鎴戜滑灝辨湁浜嗕竴涓氱敤鐨凥ibernate瀹炰綋寮曟搸錛屽彲浠ュ浠諱綍Hibernate瀹炰綋瀹炵幇鍩烘湰鐨勫鍔犮佷慨鏀廣佸垹闄ゃ佹煡璇㈢瓑銆?/p>
鍏跺畠鐨凚usinessService灝卞彲浠ョ戶鎵縀ntityManager錛屽揩閫熷疄鐜頒笟鍔¢昏緫銆?/p>
鍏蜂綋XML閰嶇疆濡備笅錛?/p>
聽<!-- Oracle JNDI DataSource for J2EE environments --> 聽<!-- Hibernate SessionFactory for Oracle --> 聽<!-- AOP DAO Intecepter --> 聽聽聽聽聽聽聽 <bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl"> 聽聽聽聽聽聽聽 <bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 聽<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 聽<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) --> 聽<!-- Transactional proxy for the Application primary business object --> 聽聽聽聽聽聽聽 <bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
Spring鏀寔浠庢暟鎹姩鎬佺敓鎴怭DF鎴朎xcel鏂囦歡
涓嬮潰榪欎釜綆鍗曞疄鐜扮殑渚嬪瓙瀹炵幇浜唖pring杈撳嚭PDF鍜孍xcel鏂囦歡錛屼負浜嗕嬌鐢‥xcel鐢靛瓙琛ㄦ牸錛屼綘闇瑕佸湪浣犵殑classpath涓姞鍏oi-2.5.1.jar搴撴枃浠訛紝鑰屽PDF鏂囦歡錛屽垯闇瑕乮Text.jar鏂囦歡銆傚畠浠兘鍖呭惈鍦⊿pring鐨勪富鍙戝竷鍖呬腑銆?br />
涓嬮潰鏄祴璇曢」鐩唬鐮侊細
1銆佹帶鍒跺櫒閰嶇疆浠g爜<?xml聽version="1.0"聽encoding="UTF-8"?>
<!DOCTYPE聽beans聽PUBLIC聽"-//SPRING//DTD聽BEAN//EN"聽"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
聽聽聽聽<bean聽id="beanNameViewResolver"
聽聽聽聽聽聽聽聽class="org.springframework.web.servlet.view.BeanNameViewResolver"聽/>
聽聽聽聽<bean聽id="viewController"聽class="com.zhupan.spring.ViewController"聽/>
聽聽聽聽<bean聽id="urlMapping"
聽聽聽聽聽聽聽聽class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
聽聽聽聽聽聽聽聽<property聽name="mappings">
聽聽聽聽聽聽聽聽聽聽聽聽<props>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽<prop聽key="/view*.shtml">viewController</prop>
聽聽聽聽聽聽聽聽聽聽聽聽</props>
聽聽聽聽聽聽聽聽</property>
聽聽聽聽</bean>
</beans>
聽3銆佺敤浜嶦xcel瑙嗗浘鐨勮鍥懼瓙綾誨寲
涓轟簡鍦ㄧ敓鎴愯緭鍑烘枃妗g殑榪囩▼涓疄鐜板畾鍒剁殑琛屼負錛屾垜浠皢緇ф壙鍚堥傜殑鎶借薄綾匯傚浜嶦xcel錛岃繖鍖呮嫭鎻愪緵涓涓?org.springframework.web.servlet.view.document.AbstractExcelView鐨勫瓙綾伙紝騫跺疄鐜?buildExcelDocument鏂規硶銆?br />package聽com.zhupan.view;
import聽java.util.Date;
import聽java.util.Map;
import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;
import聽org.apache.poi.hssf.usermodel.HSSFCell;
import聽org.apache.poi.hssf.usermodel.HSSFCellStyle;
import聽org.apache.poi.hssf.usermodel.HSSFDataFormat;
import聽org.apache.poi.hssf.usermodel.HSSFRow;
import聽org.apache.poi.hssf.usermodel.HSSFSheet;
import聽org.apache.poi.hssf.usermodel.HSSFWorkbook;
import聽org.springframework.web.servlet.view.document.AbstractExcelView;
public聽class聽ViewExcel聽extends聽AbstractExcelView聽
{
聽聽public聽void聽buildExcelDocument(
聽聽聽聽聽聽聽聽聽聽聽聽聽Map聽model,聽HSSFWorkbook聽workbook,
聽聽聽聽聽聽聽聽聽聽聽聽聽HttpServletRequest聽request,聽HttpServletResponse聽response)
聽聽聽聽throws聽Exception聽
{
聽聽
聽聽聽聽聽聽聽HSSFSheet聽sheet聽=聽workbook.createSheet("list");
聽聽聽聽聽聽聽sheet.setDefaultColumnWidth((short)聽12);
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽HSSFCell聽cell聽=聽getCell(sheet,聽0,聽0);
聽聽聽聽聽聽聽setText(cell,聽"Spring聽Excel聽test");
聽聽
聽聽聽聽聽聽聽HSSFCellStyle聽dateStyle聽=聽workbook.createCellStyle();
聽聽聽聽聽聽聽dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
聽聽聽聽聽聽聽cell聽=聽getCell(sheet,聽1,聽0);
聽聽聽聽聽聽聽cell.setCellValue(new聽Date());
聽聽聽聽聽聽聽cell.setCellStyle(dateStyle);
聽聽聽聽聽聽聽getCell(sheet,聽2,聽0).setCellValue(458);
聽聽
聽聽聽聽聽聽聽HSSFRow聽sheetRow聽=聽sheet.createRow(3);
聽聽聽聽聽聽聽for聽(short聽i聽=聽0;聽i聽<聽10;聽i++)聽
{
聽聽聽聽聽聽聽聽聽聽聽聽聽sheetRow.createCell(i).setCellValue(i聽*聽10);
聽聽聽聽聽聽聽}
聽聽}
聽聽
}
4銆佺敤浜嶱DF瑙嗗浘鐨勮鍥懼瓙綾誨寲
闇瑕佽薄涓嬮潰涓鏍風戶鎵縪rg.springframework.web.servlet.view.document.AbstractPdfView錛屽茍瀹炵幇buildPdfDocument()鏂規硶銆?package聽com.zhupan.view;
import聽java.util.List;
import聽java.util.Map;
import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;
import聽org.springframework.web.servlet.view.document.AbstractPdfView;
import聽com.lowagie.text.Document;
import聽com.lowagie.text.Paragraph;
import聽com.lowagie.text.pdf.PdfWriter;
public聽class聽ViewPDF聽extends聽AbstractPdfView聽
{
聽聽聽聽public聽void聽buildPdfDocument(Map聽model,聽Document聽document,
聽聽聽聽聽聽聽聽聽聽聽聽PdfWriter聽writer,聽HttpServletRequest聽request,
聽聽聽聽聽聽聽聽聽聽聽聽HttpServletResponse聽response)聽throws聽Exception聽
{
聽聽聽聽聽聽聽聽List聽list聽=聽(List)聽model.get("list");
聽聽聽聽聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽list.size();聽i++)
聽聽聽聽聽聽聽聽聽聽聽聽document.add(new聽Paragraph((String)聽list.get(i)));
聽聽聽聽}
}
package聽com.zhupan.spring;
import聽java.util.ArrayList;
import聽java.util.HashMap;
import聽java.util.List;
import聽java.util.Map;
import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;
import聽org.springframework.web.servlet.ModelAndView;
import聽org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import聽com.zhupan.view.ViewExcel;
import聽com.zhupan.view.ViewPDF;
public聽class聽ViewController聽extends聽MultiActionController
{
聽聽聽聽聽
聽聽聽聽聽public聽ModelAndView聽viewPDF(HttpServletRequest聽request,聽HttpServletResponse聽response)聽throws聽Exception聽
{
聽聽聽聽聽聽聽List聽list聽=聽new聽ArrayList();
聽聽聽聽聽聽聽Map聽model=new聽HashMap();
聽聽聽聽聽聽聽list.add("test1");
聽聽聽聽聽聽聽list.add("test2");
聽聽聽聽聽聽聽model.put("list",list);
聽聽聽聽聽聽聽ViewPDF聽viewPDF=new聽ViewPDF();
聽聽聽聽聽聽聽return聽new聽ModelAndView(viewPDF,model);
聽聽}
聽聽聽聽聽
聽聽聽聽聽聽public聽ModelAndView聽viewExcel(HttpServletRequest聽request,聽HttpServletResponse聽response)聽throws聽Exception聽
{
聽聽聽聽聽聽聽聽聽聽聽聽List聽list聽=聽new聽ArrayList();
聽聽聽聽聽聽聽聽Map聽model=new聽HashMap();
聽聽聽聽聽聽聽聽list.add("test1");
聽聽聽聽聽聽聽聽list.add("test2");
聽聽聽聽聽聽聽聽model.put("list",list);
聽聽聽聽聽聽聽聽ViewExcel聽viewExcel=new聽ViewExcel();
聽聽聽聽聽聽聽聽return聽new聽ModelAndView(viewExcel,model);
聽聽聽聽聽聽}
}
<?xml聽version="1.0"聽encoding="UTF-8"?>
<web-app聽version="2.4"聽xmlns="http://java.sun.com/xml/ns/j2ee"
聽聽聽聽xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
聽聽聽聽xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee聽
聽聽聽聽http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
聽聽聽聽<display-name>springPDFTest</display-name>
聽聽聽聽<servlet>
聽聽聽聽聽聽聽聽<servlet-name>springPDFTest</servlet-name>
聽聽聽聽聽聽聽聽<servlet-class>
聽聽聽聽聽聽聽聽聽聽聽聽org.springframework.web.servlet.DispatcherServlet
聽聽聽聽聽聽聽聽</servlet-class>
聽聽聽聽聽聽聽聽<load-on-startup>1</load-on-startup>
聽聽聽聽</servlet>
聽聽聽聽<servlet-mapping>
聽聽聽聽聽聽聽聽<servlet-name>springPDFTest</servlet-name>
聽聽聽聽聽聽聽聽<url-pattern>*.shtml</url-pattern>
聽聽聽聽</servlet-mapping>
聽聽聽聽<welcome-file-list>
聽聽聽聽聽聽聽聽<welcome-file>index.jsp</welcome-file>
聽聽聽聽</welcome-file-list>
</web-app>
3)index.jsp<%
@聽page聽contentType="text/html;聽charset=gb2312"%>
<a聽href="viewPDF.shtml">PDF瑙嗗浘鎵撳紑聽</a>
<br>
<a聽href="viewExcel.shtml">Excel瑙嗗浘鎵撳紑</a>
]]>
Spring Framework鏈寰椾互鍑哄悕鐨勬槸涓嶩ibernate鐨勬棤緙濋摼鎺ワ紝鍩烘湰涓婄敤Spring錛屽氨浼氱敤Hibernate銆傚彲鎯滅殑鏄疭pring鎻愪緵鐨凥ibernateTemplate鍔熻兘鏄懼緱涓嶅錛屼嬌鐢ㄨ搗鏉ヤ篃涓嶆槸寰堟柟渚褲傛垜浠紪紼嬪簭鏃訛紝涓鑸厛鍐橞usinessService錛岀敱BusinessService璋僁AO鏉ユ墽琛屽瓨鍌紝鍦ㄨ繖鏂歸潰Spring娌℃湁寰堝ソ鐨勪緥瀛愶紝閫犳垚鐪熸鎯崇敤濂藉畠錛屽茍涓嶅鏄撱?/p>
聽聽聽聽聽聽聽 return SessionFactoryUtils.getSession(getSessionFactory(), false);
聽聽聽 }
聽聽聽聽聽聽聽 Session session = openSession();
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 return session.get(entityClass, id);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 catch (HibernateException ex) {
聽聽聽聽聽聽聽聽聽聽聽 throw SessionFactoryUtils.convertHibernateAccessException(ex);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽聽聽聽聽 Session session = openSession();
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 return session.save(entity);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 catch (HibernateException ex) {
聽聽聽聽聽聽聽聽聽聽聽 throw SessionFactoryUtils.convertHibernateAccessException(ex);
聽聽聽聽聽聽聽 }
聽聽聽 }
...}
聽* Base class for Hibernate DAOs.聽 This class defines common CRUD methods for
聽* child classes to inherit. User Sping AOP Inteceptor
聽*/
public class EntityDaoImpl extends BaseDao implements EntityDao{
...
聽* Base class for Entity Service. User Sping AOP Inteceptor
聽*/
public class EntityManagerImpl implements EntityManager {
聽聽聽聽聽聽聽 this.entityDao = entityDao;
聽聽聽 }
聽聽聽聽聽聽聽 return entityDao.get(entityClass, id);
聽聽聽 }
聽聽聽聽聽聽聽 return entityDao.load(entityClass, id);
聽聽聽 }
...
聽<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
聽聽<property name="jndiName"><value>java:comp/env/jdbc/testPool</value></property>
聽</bean>
聽<!-- Choose the dialect that matches your "dataSource" definition -->
聽<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
聽聽<property name="dataSource"><ref local="dataSource"/></property>
聽聽<property name="mappingResources">
聽聽聽<value>user-hbm.xml</value>
聽聽</property>
聽聽<property name="hibernateProperties">
聽聽聽<props>
聽聽聽聽<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
聽聽聽聽<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop>
聽聽聽聽<prop key="hibernate.cache.use_query_cache">true</prop>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <prop key="hibernate.show_sql">false</prop>
聽聽聽</props>
聽聽</property>
聽</bean>
聽聽聽聽聽聽聽 <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
聽聽聽聽聽聽聽聽聽 <property name="sessionFactory">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="sessionFactory"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>
聽聽聽聽聽聽聽聽聽 <property name="sessionFactory">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="sessionFactory"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>
聽聽聽聽聽聽聽聽聽 <property name="proxyInterfaces">
聽聽聽聽聽聽聽聽聽聽聽 <value>com.gpower.services.entity.dao.EntityDao</value>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="interceptorNames">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>hibernateInterceptor</value>
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>entityDaoTarget</value>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>
聽<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
聽聽<property name="sessionFactory"><ref local="sessionFactory"/></property>
聽</bean>
聽<!--
聽<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
聽-->
聽聽聽聽聽聽聽 <bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl">
聽聽聽聽聽聽聽聽聽 <property name="entityDao">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="entityDao"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>
聽聽聽聽聽聽聽聽聽 <property name="transactionManager">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="transactionManager"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="target">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="entityManagerTarget"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="transactionAttributes">
聽聽聽聽 <props>
聽聽聽聽聽聽 <prop key="get*">PROPAGATION_SUPPORTS</prop>
聽聽聽聽聽聽 <prop key="*">PROPAGATION_REQUIRED</prop>
聽聽聽聽 </props>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>
]]>
Spring Framework浠庤癁鐢熶箣鏃ヨ搗錛屽彈鍒頒簡瓚婃潵瓚婂鐨勫叧娉ㄣ傛渶榪戯紝鏂扮殑寮婧愰」鐩ぇ澶氭敮鎸丼pring Framework銆傚浗鍐呯洰鍓嶄篃鏈変笓闂ㄧ殑緗戠珯錛?a >http://spring.jactiongroup.net/錛夈傞偅瀹冧負浠涔堝姝ゅ彈嬈㈣繋鍛紵
鎴戞兂鏈閲嶈鐨勬槸錛孍JB璁╂瘡涓漢閮界棝鎭ㄣ傝緙栧啓涓涓狤JB錛岄渶瑕佸啓LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface錛岄渶瑕佷竴涓爣鍑嗘弿榪扮錛屼竴涓壒孌婂巶鍟嗘弿榪扮錛圵eblogic銆乄ebSphere閮戒笉涓鏍鳳級錛屽鏋滄槸Entity Bean錛岃繕闇瑕丮apping鏂囦歡銆傚姝や箣澶氾紝瀹炲湪楹葷儲銆備絾EJB鏈閲嶈鐨勬槸瑙e喅Transaction闂錛屾病鏈塖pring涔嬪墠錛屾病鏈夊叾浠栨柟娉曡兘澶熸弿榪板紡鐨勮В鍐沖畠銆傛瘡涓漢銆佹瘡涓叕鍙鎬負浜嗚В鍐砊ransaction鐨勯棶棰橈紝緙栫▼鐨勫啓娉曢兘涓嶄竴鏍鳳紝鐧捐姳榻愭斁銆備簬鏄紝鍦ㄦ渶闇瑕佸畠鐨勬椂鍊欙紝Spring鍑虹幇浜嗐?/p>
Spring鐨勫姛鑳介潪甯稿銆備絾瀵逛簬涓涓駭鍝侊紝鏈閲嶈鐨勬槸濡備綍鐢ㄥソ瀹冪殑綺懼崕銆係pring鍖呭惈AOP銆丱RM銆丏AO銆丆ontext銆乄eb銆丮VC鍑犱釜閮ㄥ垎緇勬垚銆俉eb銆丮VC鏆備笉鐢ㄨ冭檻錛岀敤鎴愮啛鐨凷truts銆丣SP鎴朩ebwork鏇村ソ銆侱AO鐢變簬鐩墠Hibernate銆丣DO鐨勬祦琛岋紝涔熷彲涓嶈冭檻銆傚洜姝ゆ渶闇瑕佺敤鐨勬槸AOP銆丱RM銆丆ontext銆?/p>
Context涓紝鏈閲嶈鐨勬槸Beanfactory錛屽畠鏄皢鎺ュ彛涓庡疄鐜板垎寮錛岄潪甯擱噸瑕併備互鍓嶆垜浠啓紼嬪簭錛屽涓涓帴鍙Document錛屼竴涓疄鐜扮被Document1銆傚湪鍐欑▼搴忔椂錛岄渶鍐欐垚IDocument doc = new Document1()錛屼竴鏃︽垜浠殑瀹炵幇綾婚渶鏀瑰彉鏃訛紝鍙樹負Document2錛屽垯紼嬪簭闇鍐欐垚IDocument doc = new Document2()錛屾墍鏈夌敤鍒扮殑鍦版柟鍏ㄩ渶鏀廣侭eanfactory甯垜浠В鍐充簡榪欎釜闂錛岀敤context鍚庯紝鍐欐硶鍙樹負IDocument doc=(IDocument)beanFactory.getBean("doc")銆傚鏋滃疄鐜扮被浠嶥ocument1鏀逛負Document2錛岀洿鎺ュ湪閰嶇疆鏂囦歡鏀瑰氨鍙互浜嗐侰ontext鏄疊ean factory鐨勮繘涓姝ユ娊璞°傚緢澶氫漢閮藉枩嬈㈢敤ApplicationConext錛岀敤Servlet鎶婂畠Load銆傝繖鏍峰氨鎶夿ean Factory涓嶹eb緇戝畾鍦ㄤ竴璧楓傚鏋滄槸Fat Client鎴朢emote璋冪敤錛屽垯榪欎簺Bean factory灝卞緢闅捐皟鐢紝瀹為檯鏄皢琛ㄧ幇灞備笌涓氬姟灞傜粦瀹氱殑澶揣銆傛帹鑽愮殑鏂規硶鏄疭ingletonBeanFactoryLocator銆傚叿浣撲負錛?/p>
聽聽 BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();
聽聽聽BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");
聽聽聽// now use some bean from factory
聽聽聽return bf.getFactory().getBean(name);
聽
聽<beans>
聽聽聽聽 <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
聽聽聽聽 <constructor-arg>
聽聽聽聽聽 <list>
聽聽聽聽聽聽 <value>dataAccessContext.xml</value>
聽聽聽聽聽聽 <value>securityContext.xml</value>
聽聽聽聽聽聽 <value>...</value>
聽聽聽聽聽 </list>
聽聽聽聽 </constructor-arg>
聽聽聽 </bean>
</beans>
榪欐牱錛屽氨鍙殢鏃跺姩鎬佹墿灞曪紝瀹炵幇緇勪歡寮忕殑寮鍙戙?/p>
錛堟湭瀹岋紝寰呯畫錛?/p>
澧炲姞浠ヤ笅鍐呭
UserDAO.java
public interface UserDAO {
聽聽 public abstract boolean isValidUser(String username, String password);
}
UserDAOImp.java
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.test.Hibernate.SessionFactory;
public class UserDAOImp extends HibernateDaoSupport implements UserDAO {
聽聽聽 private SessionFactory sessionFactory;
聽聽聽 private static String hql = "from User u where u.username=? ";
聽聽聽 public boolean isValidUser(String username, String password) {
聽聽聽聽聽聽 List userList = this.getHibernateTemplate().find(hql, username);
聽聽聽聽聽聽 if (userList.size() > 0) {
聽聽聽聽聽聽聽聽聽聽 return true;
聽聽聽聽聽聽 }
聽聽聽聽聽聽 return false;
聽聽聽 }
}
Aspect Oriented Programming(AOP)錛岄潰鍚戝垏闈㈢紪紼嬶紝鏄竴涓瘮杈冪儹闂ㄧ殑璇濋銆侫OP涓昏瀹炵幇鐨勭洰鐨勬槸閽堝涓氬姟澶勭悊榪囩▼涓殑鍒囬潰榪涜鎻愬彇錛屽畠鎵闈㈠鐨勬槸澶勭悊榪囩▼涓殑鏌愪釜姝ラ鎴栭樁孌碉紝浠ヨ幏寰楅昏緫榪囩▼涓悇閮ㄥ垎涔嬮棿浣庤﹀悎鎬х殑闅旂鏁堟灉銆傛瘮濡傛垜浠渶甯歌鐨勫氨鏄棩蹇楄褰曚簡錛屼婦涓緥瀛愶紝鎴戜滑鐜板湪鎻愪緵涓涓湇鍔℃煡璇㈠鐢熶俊鎭殑錛屼絾鏄垜浠笇鏈涜褰曟湁璋佽繘琛屼簡榪欎釜鏌ヨ銆傚鏋滄寜鐓т紶緇熺殑OOP鐨勫疄鐜扮殑璇濓紝閭f垜浠疄鐜頒簡涓涓煡璇㈠鐢熶俊鎭殑鏈嶅姟鎺ュ彛(StudentInfoService)鍜屽叾瀹炵幇綾伙紙StudentInfoServiceImpl.java錛夛紝鍚屾椂涓轟簡瑕佽繘琛岃褰曠殑璇濓紝閭f垜浠湪瀹炵幇綾?StudentInfoServiceImpl.java)涓娣誨姞鍏跺疄鐜拌褰曠殑榪囩▼銆傝繖鏍風殑璇濓紝鍋囧鎴戜滑瑕佸疄鐜扮殑鏈嶅姟鏈夊涓憿錛熼偅灝辮鍦ㄦ瘡涓疄鐜扮殑綾婚兘娣誨姞榪欎簺璁板綍榪囩▼銆傝繖鏍峰仛鐨勮瘽灝變細鏈夌偣綣佺悙錛岃屼笖姣忎釜瀹炵幇綾婚兘涓庤褰曟湇鍔℃棩蹇楃殑琛屼負绱ц﹀悎錛岃繚鍙嶄簡闈㈠悜瀵硅薄鐨勮鍒欍傞偅涔堟庢牱鎵嶈兘鎶婅褰曟湇鍔$殑琛屼負涓庝笟鍔″鐞嗚繃紼嬩腑鍒嗙鍑烘潵鍛紵鐪嬭搗鏉ュソ鍍忓氨鏄煡璇㈠鐢熺殑鏈嶅姟鑷繁鍦ㄨ繘琛岋紝浣嗘槸鑳屽悗鏃ュ織璁板綍瀵硅繖浜涜涓鴻繘琛岃褰曪紝浣嗘槸鏌ヨ瀛︾敓鐨勬湇鍔′笉鐭ラ亾瀛樺湪榪欎簺璁板綍榪囩▼錛岃繖灝辨槸鎴戜滑瑕佽璁篈OP鐨勭洰鐨勬墍鍦ㄣ侫OP鐨勭紪紼嬶紝濂藉儚灝辨槸鎶婃垜浠湪鏌愪釜鏂歸潰鐨勫姛鑳芥彁鍑烘潵涓庝竴鎵瑰璞¤繘琛岄殧紱伙紝榪欐牱涓庝竴鎵瑰璞′箣闂撮檷浣庝簡鑰﹀悎鎬э紝鍙互灝辨煇涓姛鑳借繘琛岀紪紼嬨?br />聽聽聽聽鎴戜滑鐩存帴浠庝唬鐮佸叆鎵嬪惂錛岃瀹炵幇浠ヤ笂鐨勭洰鏍囷紝鎴戜滑鍙互浣跨敤涓涓姩鎬佷唬鐞嗙被(Proxy)錛岄氳繃鎷︽埅涓涓璞$殑琛屼負騫舵坊鍔犳垜浠渶瑕佺殑鍔熻兘鏉ュ畬鎴愩侸ava涓殑java.lang.reflect.Proxy綾誨拰java.lang.reflect.InvocationHandler鎺ュ彛涓烘垜浠疄鐜板姩鎬佷唬鐞嗙被鎻愪緵浜嗕竴涓柟妗堬紝浣嗘槸璇ユ柟妗堥拡瀵圭殑瀵硅薄瑕佸疄鐜版煇浜涙帴鍙o紱濡傛灉閽堝鐨勭洰鐨勬槸綾葷殑璇濓紝cglib涓烘垜浠彁渚涗簡鍙﹀涓涓疄鐜版柟妗堛傜瓑涓嬩細璇存槑涓よ呯殑鍖哄埆銆?br />涓銆佹帴鍙g殑瀹炵幇鏂規錛?br />1錛夐鍏堢紪鍐欐垜浠殑涓氬姟鎺ュ彛錛圫tudentInfoService.java錛夛細
public interface StudentInfoService{
聽void findInfo(String studentName);
}
聽聽聽聽 鍙婂叾瀹炵幇綾伙紙StudentInfoServiceImpl.java錛夛細
public class StudentInfoServiceImpl implements StudentInfoService{
聽public void findInfo(String name){
聽聽System.out.println("浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?"+name);
聽}
}
2錛夌幇鍦ㄦ垜浠渶瑕佷竴涓棩蹇楀姛鑳斤紝鍦╢indInfo琛屼負涔嬪墠鎵ц騫惰褰曞叾琛屼負錛岄偅涔堟垜浠氨棣栧厛瑕佹嫤鎴琛屼負銆傚湪瀹為檯鎵ц鐨勮繃紼嬩腑鐢ㄤ竴涓唬鐞嗙被鏉ユ浛鎴戜滑瀹屾垚銆侸ava涓負鎴戜滑鎻愪緵浜嗗疄鐜板姩鎬佷唬鐞嗙被鐨勬柟妗堬細
1'澶勭悊鎷︽埅鐩殑鐨勭被錛圡yHandler.java錛?br />import org.apache.log4j.Logger;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler{
聽private Object proxyObj;
聽private static Logger log=Logger.getLogger(MyHandler.class);
聽
聽public Object bind(Object obj){
聽聽this.proxyObj=obj;
聽聽return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
聽}
聽
聽public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
聽聽Object result=null;
聽聽try{
聽聽聽//璇峰湪榪欓噷鎻掑叆浠g爜錛屽湪鏂規硶鍓嶈皟鐢?br />聽聽聽log.info("璋冪敤log鏃ュ織鏂規硶"+method.getName());
聽聽聽result=method.invoke(proxyObj,args); //鍘熸柟娉?br />聽聽聽//璇峰湪榪欓噷鎻掑叆浠g爜錛屾柟娉曞悗璋冪敤
聽聽}catch(Exception e){
聽聽聽e.printStackTrace();
聽聽}
聽聽return result;
聽}
}
2'鎴戜滑瀹炵幇涓涓伐鍘傦紝涓轟簡鏂逛究鎴戜滑浣跨敤璇ユ嫤鎴被(AOPFactory.java)錛?br />public class AOPFactory{
聽private static Object getClassInstance(String clzName){
聽聽Object obj=null;
聽聽try{
聽聽聽Class cls=Class.forName(clzName);
聽聽聽obj=(Object)cls.newInstance();
聽聽}catch(ClassNotFoundException cnfe){
聽聽聽System.out.println("ClassNotFoundException:"+cnfe.getMessage());
聽聽}catch(Exception e){
聽聽聽e.printStackTrace();
聽聽}
聽聽return obj;
聽}
聽
聽public static Object getAOPProxyedObject(String clzName){
聽聽Object proxy=null;
聽聽MyHandler handler=new MyHandler();
聽聽Object obj=getClassInstance(clzName);
聽聽if(obj!=null) {
聽聽聽proxy=handler.bind(obj);
聽聽}else{
聽聽聽System.out.println("Can't get the proxyobj");
聽聽聽//throw
聽聽}
聽聽return proxy;
聽}
}
3)鍩烘湰鐨勬嫤鎴笌鍏跺伐鍘傛垜浠兘瀹炵幇浜嗭紝鐜板湪嫻嬭瘯錛圕lientTest.java錛夛細
public class ClientTest{
聽public static void main(String[] args){
聽聽StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");
聽聽studentInfo.findInfo("闃塊");
聽}
}
杈撳嚭緇撴灉錛堢湅浣犵殑log4j璁劇疆錛夛細
[INFO]璋冪敤log鏃ュ織鏂規硶findInfo
浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?闃塊
聽聽聽聽 榪欐牱鎴戜滑闇瑕佺殑鏁堟灉灝卞嚭鏉ヤ簡錛屼笟鍔″鐞嗚嚜宸卞湪榪涜錛屼絾鏄垜浠疄鐜頒簡鏃ュ織鍔熻兘錛岃屼笟鍔″鐞?StudentInfoService)鏍規湰涓嶇煡閬撳瓨鍦ㄨ琛屼負鐨勩備絾鏄疛ava涓彁渚涚殑鍔ㄦ佷唬鐞嗙被鐨勫疄鐜版槸閽堝瀹炵幇浜嗘煇浜涙帴鍙g殑綾伙紝濡傛灉娌℃湁瀹炵幇鎺ュ彛鐨勮瘽錛屼笉鑳藉垱寤轟唬鐞嗙被錛岀湅浠ヤ笂閮ㄥ垎錛?br />return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
鐪嬪埌浜嗘病鏈夛紵obj.getClass().getInterfaces()瑕佹眰瀹炵幇浜嗘煇浜涙帴鍙c備互涓嬫彁渚涘摢浜涙病鏈夊疄鐜版帴鍙g殑瀹炵幇鏂規錛?br />
浜屻佸瓙綾葷殑瀹炵幇鏂規銆?br />聽聽聽聽聽 棣栧厛錛岃涓婄綉涓婥GLib鐨勫寘錛?a >http://sourceforge.net/project/showfiles.php?group_id=56933聽銆傝緗ソclasspath璺緞錛孋GLib涓巎ava鏍囧噯搴撴彁渚涚殑瀹炵幇鏂規涓嶅悓錛宑glib涓昏鏄熀浜庡疄鐜扮被錛堝StudentInfoServiceImpl.java)鎵╁睍涓涓瓙綾繪潵瀹炵幇銆備笌Dynamic Proxy涓殑Proxy鍜孖nvocationHandler鐩稿搴旓紝net.sf.cglib.proxy.Enhancer鍜孧ethodInterceptor鍦–GLib涓礋璐e畬鎴愪唬鐞嗗璞″垱寤哄拰鏂規硶鎴幏澶勭悊,浜х敓鐨勬槸鐩爣綾葷殑瀛愮被鑰屼笉鏄氳繃鎺ュ彛鏉ュ疄鐜版柟娉曟嫤鎴殑錛孍nhancer涓昏鏄敤浜庢瀯閫犲姩鎬佷唬鐞嗗瓙綾繪潵瀹炵幇鎷︽埅錛孧ethodInterceptor錛堟墿灞曚簡Callback鎺ュ彛錛変富瑕佺敤浜庡疄鐜癮round advice錛圓OP涓殑姒傚康錛夛細
聽聽聽聽 1錛夋垜浠殑涓氬姟澶勭悊錛圫tudentInfoServiceImpl.java錛夛細
public class StudentInfoServiceImpl{
聽public void findInfo(String name){
聽聽System.out.println("浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?"+name);
聽}
}
聽聽聽聽 2錛夊疄琛屼竴涓伐鍏鋒潵澶勭悊鏃ュ織鍔熻兘錛圓OPInstrumenter.java錛夛細
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
public class AOPInstrumenter implements MethodInterceptor{
聽private Logger log=Logger.getLogger(AOPInstrumenter.class);
聽private Enhancer enhancer=new Enhancer();
聽
聽public Object getInstrumentedClass(Class clz){
聽聽enhancer.setSuperclass(clz);
聽聽enhancer.setCallback(this);
聽聽return enhancer.create();
聽}
聽
聽public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{
聽聽log.info("璋冪敤鏃ュ織鏂規硶"+method.getName());
聽聽Object result=proxy.invokeSuper(o,args);
聽聽return result;
聽}
聽
}
聽聽聽聽 3錛夋垜浠潵嫻嬭瘯涓涓嬶紙AOPTest.java錛夛細
public class AOPTest{
聽public static void main(String[] args){
聽聽AOPInstrumenter instrumenter=new AOPInstrumenter();
聽聽StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);
聽聽studentInfo.findInfo("闃塊");
聽}
}
聽聽 杈撳嚭緇撴灉涓庝互涓婄浉鍚屻?br />聽CGLib涓負瀹炵幇浠ヤ笂鐩殑錛屼富瑕佹彁渚涚殑綾?br />1)Enhancer錛歴etCallback(Callback) ,setSuperclass(Class) ,create()榪斿洖鍔ㄦ佸瓙綾籓bject
2)MethodInterceptor蹇呴』瀹炵幇鐨勬帴鍙o細intercept(Object,Method,Object[],MethodProxy)榪斿洖鐨勬槸鍘熸柟娉曡皟鐢ㄧ殑緇撴灉銆傚拰Proxy鍘熺悊涓鏍楓?/p>
涓夈佷互涓婄殑涓や釜綆鍗曞疄鐜癆OP鐨勬柟妗堥兘涓轟綘鍑嗗濂戒簡錛屼綘鍙互鑷繁緙栧啓嫻嬭瘯涓涓嬶紝浠ヤ笅綆鍗曚粙緇嶄竴涓婣OP鐨勫熀鏈蹇碉細
1錛塧spect錛堝垏闈級錛氬疄鐜頒簡cross-cutting鍔熻兘錛屾槸閽堝鍒囬潰鐨勬ā鍧椼傛渶甯歌鐨勬槸logging妯″潡錛岃繖鏍鳳紝紼嬪簭鎸夊姛鑳借鍒嗕負濂藉嚑灞傦紝濡傛灉鎸変紶緇熺殑緇ф壙鐨勮瘽錛屽晢涓氭ā鍨嬬戶鎵挎棩蹇楁ā鍧楃殑璇濇牴鏈病鏈変粈涔堟剰涔夛紝鑰岄氳繃鍒涘緩涓涓猯ogging鍒囬潰灝卞彲浠ヤ嬌鐢ˋOP鏉ュ疄鐜扮浉鍚岀殑鍔熻兘浜嗐?br />2錛塲ointpoint錛堣繛鎺ョ偣錛夛細榪炴帴鐐規槸鍒囬潰鎻掑叆搴旂敤紼嬪簭鐨勫湴鏂癸紝璇ョ偣鑳借鏂規硶璋冪敤錛岃屼笖涔熶細琚姏鍑烘剰澶栥傝繛鎺ョ偣鏄簲鐢ㄧ▼搴忔彁渚涚粰鍒囬潰鎻掑叆鐨勫湴鏂癸紝鍙互娣誨姞鏂扮殑鏂規硶銆傛瘮濡備互涓婃垜浠殑鍒囩偣鍙互璁や負鏄痜indInfo(String)鏂規硶銆?br />3錛塧dvice錛堝鐞嗛昏緫錛夛細advice鏄垜浠垏闈㈠姛鑳界殑瀹炵幇錛屽畠閫氱煡紼嬪簭鏂扮殑琛屼負銆傚鍦╨ogging閲岋紝logging advice鍖呮嫭logging鐨勫疄鐜頒唬鐮侊紝姣斿鍍忓啓鏃ュ織鍒頒竴涓枃浠朵腑銆俛dvice鍦╦ointpoint澶勬彃鍏ュ埌搴旂敤紼嬪簭涓備互涓婃垜浠湪MyHandler.java涓疄鐜頒簡advice鐨勫姛鑳?br />4錛塸ointcut錛堝垏鐐癸級錛歱ointcut鍙互鎺у埗浣犳妸鍝簺advice搴旂敤浜巎ointpoint涓婂幓錛岄氬父浣犱嬌鐢╬ointcuts閫氳繃姝e垯琛ㄨ揪寮忔潵鎶婃槑鏄劇殑鍚嶅瓧鍜屾ā寮忚繘琛屽尮閰嶅簲鐢ㄣ傚喅瀹氫簡閭d釜jointpoint浼氳幏寰楅氱煡銆?br />5錛塱ntroduction錛氬厑璁告坊鍔犳柊鐨勬柟娉曞拰灞炴у埌綾諱腑銆?br />6錛塼arget錛堢洰鏍囩被錛夛細鏄寚閭d簺灝嗕嬌鐢╝dvice鐨勭被錛屼竴鑸槸鎸囩嫭绔嬬殑閭d簺鍟嗗姟妯″瀷銆傛瘮濡備互涓婄殑StudentInfoServiceImpl.
7)proxy錛堜唬鐞嗙被錛夛細浣跨敤浜唒roxy鐨勬ā寮忋傛槸鎸囧簲鐢ㄤ簡advice鐨勫璞★紝鐪嬭搗鏉ュ拰target瀵硅薄寰堢浉浼箋?br />8錛墂eaving(鎻掑叆錛夛細鏄寚搴旂敤aspects鍒頒竴涓猼arget瀵硅薄鍒涘緩proxy瀵硅薄鐨勮繃紼嬶細complie time錛宑lassload time錛宺untime
聽聽聽聽 Spring鐨勫姛鑳芥槸寰堝己澶х殑錛屽湪鍏垛滅粷涓嶅彂鏄庤嚜宸辮涓哄ソ鐨勮疆瀛愶紝鑰屽彧鍙戞槑鑷繁璁や負涓嶅ソ鐨勮疆瀛愨濈殑鎸囧鎬濇兂涓嬶紝閫氳繃鍏呭垎瀹炶返浜嗏滀竴鍒囧疄浜嬫眰鏄佲樺驚璇佹灦鏋勨欑殑宸ヤ綔鏂瑰紡鈥濈殑鐞嗚錛屽熀鏈笂鎶婅交閲忕駭鐨凧2EE搴旂敤妗嗘灦錛堝ORM銆丮VC絳夛級榪涜浜嗘暣鍚堬紝騫舵瀯鏋朵簡涓浜涘父鐢ㄧ殑鍔熻兘(濡侱AO)錛屽艦鎴愪簡涓涓姛鑳藉己澶х殑J2EE杞婚噺綰т紒涓氬簲鐢ㄦ鏋躲?br />銆銆鐒惰岋紝鎴栬鏄ぇ瀹跺Spring鎺屾彙寰楄繕涓嶉忓交鐨勭紭鏁呭惂錛岀湅鍒板緢澶氳蔣浠朵紒涓氫腑鐢ㄥ埌鐨凷pring鍔熻兘錛屽熀鏈笂澶у鏁伴兘鍙槸鐢ㄥ叾IOC鍔熻兘錛屾湁鏃跺欓檮甯︾敤浜嗗叾涓殑AOP浜嬪姟綆$悊鍔熻兘銆?br />銆銆IOC鍙夾OP铏界劧涓嶆槸Spring棣栧垱錛岀劧鑰屽叾鍦ㄨ繖涓ゅ潡閮芥槸鍋氬緱寰堜笉閿欑殑錛屽簲璇ヨ鏁翠釜Spring妗嗘灦灝辨槸鍥寸粫鐫鍏禝OC瀹炵幇鍙夾OP瀹炵幇鏋惰璧鋒潵鐨勩傛垜鎯籌紝娣卞叆鎸栨帢IOC銆丄OP浠ュ強Spring涓殑瀹炵幇錛屼嬌鐢ㄧ瓑錛屽浜庡垵瀛﹁呭府鍔╀細闈炲父澶э紝鍥犳錛屼粠鏈湡寮濮嬶紝澶у場鐨勩婄帺鐜㏒pring緋誨垪銆嬪皢浼撮殢澶у涓璧瘋蛋榪汭OC鍙夾OP鐨勪笘鐣屻?br />銆銆鐢變簬鏈漢姘村鉤鏈夐檺錛屾枃涓毦鍏嶆湁寰堝涓嶈凍鐢氳嚦閿欒涔嬪錛岃繕璇峰悇浣嶆湅鍙嬩笉鍚濇壒璇勬寚鏁欍?br />聽 涓銆両OC綆浠?/b> 銆銆IOC-鍏ㄧОInversion聽of聽Control錛屼腑鏂囪В閲婏細鎺у埗鍙嶈漿銆傚彟澶栵紝IOC鍙堢ОDI(鍏ㄧО)Dependency聽Injection錛屼腑鏂囪В閲婏細渚濊禆娉ㄥ叆銆?br />銆銆鍛靛懙錛岃繖浜涘悕璇嶆悶寰楁湁鐐瑰儚瀛﹀彜鏂囩殑鍛抽亾鍝堛傚緢澶氬ぇ甯堣繕閮借IOC涓湁涓涓憲鍚嶇殑濂借幈鍧炵悊璁猴細浣犲憜鐫鍒姩錛屽埌鏃舵垜浼氭壘浣犮備綘鍛嗙潃鍒姩錛屽埌鏃舵垜浼氭壘浣犮傜敱浜庢湰浜烘湭鍒拌繃濂借幈鍧炲弬鍔犺繃紺句細瀹炶返錛屽洜姝わ紝榪欏彞璇濈悊瑙f湁鐐瑰洶闅俱?br />銆銆IOC鏄竴縐嶆柊鐨勮璁℃ā寮忥紝鍗矷OC妯″紡錛岀郴緇熶腑閫氳繃寮曞叆瀹炵幇浜咺OC妯″紡鐨処OC瀹瑰櫒錛屽嵆鍙敱IOC瀹瑰櫒鏉ョ鐞嗗璞$殑鐢熷懡鍛ㄦ湡銆佷緷璧栧叧緋葷瓑錛屼粠鑰屼嬌寰楀簲鐢ㄧ▼搴忕殑閰嶇疆鍜屼緷璧栨ц鑼冧笌瀹為檯鐨勫簲鐢ㄧ▼搴忎唬鐮佸垎寮銆傚叾涓竴涓壒鐐瑰氨鏄氳繃鏂囨湰鐨勯厤浠舵枃浠惰繘琛屽簲鐢ㄧ▼搴忕粍浠墮棿鐩鎬簰鍏崇郴鐨勯厤緗紝鑰屼笉鐢ㄩ噸鏂頒慨鏀瑰茍緙栬瘧鍏蜂綋鐨凧ava浠g爜銆?br />銆銆褰撳墠姣旇緝鐭ュ悕鐨処OC瀹瑰櫒鏈夛細Pico聽Container銆丄valon聽銆丼pring銆丣Boss銆丠iveMind銆丒JB絳夛紝鍥藉唴鐢辨澘妗ラ噷浜鴻礋璐g殑鍥戒駭寮婧愰」鐩甁don妗嗘灦錛屼篃鏄叿鏈塈OC瀹瑰櫒鍔熻兘(鐢變簬娌℃潵寰楀強璁ょ湡鐮旇鍏舵簮鐮侊紝浼間箮jdon涓璉OC閮ㄤ喚鏄皟鐢≒ico鐨処OC瀹瑰櫒鍔熻兘鏉ュ疄鐜扮殑)銆?br />銆銆鍦ㄤ笂闈㈢殑鍑犱釜IOC瀹瑰櫒涓紝杞婚噺綰х殑鏈塒ico聽Container銆丄valon銆丼pring銆丠iveMind絳夛紝瓚呴噸閲忕駭鐨勬湁EJB錛岃屽崐杞誨崐閲嶇殑鏈夊鍣ㄦ湁JBoss錛孞don絳夈?br />銆銆 銆銆IOC絀剁珶鏄粈涔堬紵IOC鏄浣曚駭鐢熺殑?鐢ㄥ湪浠涔堝満鍚?涓轟粈涔堟垜浠互鍓嶄笉鐢↖OC錛岃岀幇鍦ㄨ鐢↖OC錛熲滅墿鏈夋湰鏈紝浜嬫湁緇堝鈥濓紝涓轟簡鏇村姞閫忓交鐨勭悊瑙h繖涓闂錛屽ぇ宄℃墦綆椾粠鑷繁鎵鐞嗚В鐨勯潰鍚戝璞?OO)璁捐鍙婄紪紼嬪彂灞曞巻紼嬫潵榪涜鍒嗘瀽錛屼篃璁歌繖鏍瘋兘璁㊣OC鐨勫垵瀛﹁呮洿鍔犱簡瑙OC鐨勫彂灞曠殑鍓嶅洜鍚庢灉錛屼簤鍙栧仛鍒扳滅煡鍏剁劧錛岀煡鍏舵墍浠ョ劧錛屼嬌鍏剁劧!鈥濄?br />銆銆鑻ュぇ瀹剁瓑涓嶆ヤ簡錛屽氨鐩存帴鐧懼害涓涓嬫湁鍏矷OC鐨勫叾瀹冩枃绔狅紝榪欐柟闈㈠浗鍐呭緢澶氬厛椹變滑宸茬粡浣滀簡寰堝浠嬬粛銆傚鍐頒簯鐨勩奍OC璇﹁В銆嬨佹澘妗ラ噷浜虹殑璁捐妯″紡鍙奍OC鐞嗚絳夈?br />聽 浜屻伮犳渶鑰佺殑OO緙栫▼ 銆銆璁板緱鏇劇粡鐪嬨奣hink聽in聽Java銆嬫渶鏃╃増鏈殑鏃跺欙紝閲岄潰鏈夎繖涔堜竴鍙ヨ浜烘尟濂嬭瘽錛氫竴鍒囬兘鏄璞°傝繖鏃舵垜浠琌O緙栫▼鐨勬牳蹇冩槸鍥寸粫鐫闈㈠悜瀵硅薄緙栫▼鐨勪笁涓壒鎬у嵆鈥滅戶鎵庫濄佲滃皝瑁呪濄佲滃鎬佲濇潵灞曞紑鐨勩?br />2.1聽灝佽 銆銆閭f椂鎴戜滑瀛︿細浜嗗鐜板疄灝辯殑浜嬬墿鍙婅蔣浠舵ā鍨嬭繘琛屼簡鎶借薄銆傛瘮濡傝鎻忚堪涓鍙尗錛岄偅涔堣繖鏀尗搴旇鏈夆滈鑹測濄佲滈噸閲忊濄佲滃叕姣嶁濄佲滆劸姘斺濄佲滃嚭鐢熸棩鏈熲濈瓑灞炴э紝鍙﹀榪樻湁鈥滆窇鈥濄佲滃悆鈥濄佲滃彨鈥濄佲滅尗鎹夎侀紶鈥濈瓑鏂規硶銆傚Java浠g爜鏉ヨ〃紺猴紝澶ц嚧灝辨槸濡備笅錛?br />public聽Class聽Cat { private聽String聽color;//棰滆壊 private聽String聽weight;//閲嶉噺 private聽String聽sex;//鍏瘝 private聽String聽temper;//鑴炬皵 private聽String聽birthday;//鍑虹敓鏃ユ湡 private聽void聽run聽();//璺?br />private聽void聽eat聽(Food聽food);聽//鍚?椋熺墿) private聽void聽shout(int聽type);//鍙?綾誨埆) private聽boolean聽chase(Mice聽mice);//鐚崏鑰侀紶 } 聽 2.2聽緇ф壙 銆銆鏈鏃╃殑OO緙栫▼鏃舵湡錛屾垜浠繕浼氬紩鍏ョ戶鎵匡紝榪樼粡甯擱紦鍔卞ぇ瀹跺鐢ㄧ戶緇紝璁や負緇ф壙灝辨槸OO緙栫▼鎬濇兂鐨勬牳蹇冦傜戶鎵跨殑鏍稿績灝辨槸鍥寸粫鐫濡備綍鎶婄被涓庣被涔嬮棿鍏鋒湁鍏卞悓鐗規х殑閮ㄤ喚鎶借薄鍒板熀綾諱腑銆傝涓鴻繖鏍蜂笉浣嗚兘浣跨敤浜哋O鐨勭壒鎬э紝榪樺噺灝戜簡寰堝瀛愮被鐨勪唬鐮併?br />銆銆鎴戜滑閫氳繃鏃ュ父鐢熸椿鐨勫父璇嗙煡閬擄紝鐚槸涓縐嶅姩鐗╋紝鍥犳鍔ㄧ墿鏈夌殑鐗規т粬鍩烘湰涓婇兘鏈夈備簬鏄紝濡傛灉鎴戜滑鐨勭郴緇熶腑涓嶄絾鏈夌尗錛岃繕浼氭湁寰堝鍏跺畠鐨勫姩鐗╁嚭鐜般傛垜浠氨浼氳璁′竴涓姩鐗╃被錛屾妸鎵鏈夊姩鐗╃殑鍏辨ф娊璞″埌涓涓熀綾諱腑銆傝繖閲岋紝鐚強鍔ㄧ墿鍩虹被鐨勪唬鐮佸ぇ鑷村涓嬶細 public聽abstract聽Class聽Animal{ private聽String聽color;//棰滆壊 private聽String聽weight;//閲嶉噺 private聽String聽sex;//鍏瘝 private聽String聽temper;//鑴炬皵 private聽String聽birthday;//鍑虹敓鏃ユ湡 private聽void聽run聽();//璺?br />private聽void聽eat聽(Food聽food);聽//鍚?椋熺墿) private聽void聽shout(int聽type);//鍙?綾誨埆) } public聽Class聽Cat聽extends聽Animal 聽private聽int聽power;//鑳藉姏 聽private聽int聽agility;//鏁忔嵎搴?br />聽聽聽//聽聽鐚崏鑰侀紶鏄壒鏈夌殑鏂規硶 聽private聽boolean聽chase(Mice聽mice)聽{ 聽聽return聽true; 聽}; } 聽 聽 2.3聽澶氭?/b> 銆銆榪欐椂鎴戜滑榪樹細涓嶆椂浣跨敤鍒癘O鐨勫彟澶栦竴涓壒鎬у鎬併傚鎬佹槸寰堥噸瑕佺殑涓闂ㄦ妧鏈紝鐒惰屽緢澶氭椂鍊欏嵈娌℃湁寰堝ソ鐨勭悊瑙e茍浣跨敤錛屽洖澶寸湅浠ュ墠鐨勪唬鐮侊紝鎴戜滑鐪嬪埌鏈夊緢澶氬湴鏂瑰睘浜庢晠寮勭巹铏氱殑瀚岀枒銆?br />銆銆鎺ヤ笂闈㈢殑渚嬪瓙錛屽亣濡傛垜浠鍐欎竴涓杺鍏誨疇鐗?鏈夌尗銆佺嫍銆佺尓銆佽憊銆佽侀紶絳?鐨勭▼搴忋傚埄鐢↗ava鐨勫鎬佺壒鎬э紝鎴戜滑鐨勫ぇ鑷翠唬鐮佸涓嬶細 public聽class聽PetManage聽{ 聽//鍠傞鎴戠殑瀹犵墿 聽public聽void聽feeding(Animal聽a) 聽{聽聽 聽}聽 聽/** 聽聽*聽@param聽args 聽聽*/ 聽public聽static聽void聽main(String[]聽args)聽{聽 聽聽Animal聽myPet=new聽Cat(); 聽聽PetManage聽pm=new聽PetManage();聽聽聽聽聽 聽聽pm.feeding(myPet); 聽} } 銆銆閫氳繃浣跨敤澶氭佺壒鎬э紝鍝竴澶╄嫢鎴戜滑鐨勪笉鍠滄鐚紝鑰屾槸鍠滄鍏葷尓鐨勬椂鍊欙紝鍙鎶妌ew聽Cat()鍙樻垚new聽Pig()錛屽嵆鍙?br />聽 2.4聽瀵硅薄鐢熷懡鍛ㄦ湡 銆銆榪欎竴闃舵鐨凮O紼嬪簭涓紝鎴戜滑鐭ラ亾瑕佺敤涓涓璞$殑鏃跺欙紝灝辮浣跨敤Java涓殑鍏抽敭瀛梟ew鏉ョ敓鎴愪竴涓潵鐢ㄥ嵆鍙侽O瀵逛簬鎴戜滑鏉ヨ錛屼竴鍒囬兘鏄偅涔堢畝鍗曪紝寰堝鏃跺欑敋鑷蟲劅瑙塐O璺烵P鐨勭紪紼嬫柟娉曚篃娌″お澶у尯鍒備唬鐮佸涓嬶細 Cat聽myCat=new聽Cat();//鍒涘緩涓鏀叿浣撶殑鐚?br />myCat.shout();//鍙竴澹?br />銆銆姝ゆ椂錛屾垜浠Java铏氭嫙鏄潪甯鎬俊浠葷殑錛屾垜浠殑鎬濇兂涔熷緢鍗曠函錛屾垜浠煡閬揓ava瀵硅薄鐨勭敓鍛藉紑濮嬩簬new鍏抽敭璇嶃傛垜浠笉澶叧蹇冨璞$敓鍛界殑緇撴潫錛屾垜浠煡閬揓ava鏈変竴涓瘮C璇█鍘嗗銆佹櫤鑳藉寲鐨勫瀮鍦炬敹闆嗗櫒錛屼粬浼氬府鎴戜滑鑷繁鐨勬竻鐞嗗唴瀛樹腑涓嶇敤鐨勫璞°?br />銆銆褰撶劧錛屼篃鏈夌殑浜虹敱浜庡鍨冨溇鏀墮泦鍣ㄥ繝璇氬害鐨勬鐤戯紝涓嶆斁蹇冨瀮鍦炬敹闆嗗櫒鐨勮兘鍔涳紝浜庢槸鍦ㄧ▼搴忎腑緇忓父瑕佸姞涓鍙ョ被浼尖渕yPet=null鈥濈殑浠g爜鏉ョ粨鏉熷璞$殑鐢熷懡銆?br />銆銆褰撶劧錛屾垜浠篃鐭ラ亾鏈変竴浜涘閮ㄨ祫婧愬鏁版嵁搴撹繛鎺ョ瓑錛岄渶瑕佹墜鍔ㄧ啛鎮夎祫婧愩備簬鏄煡閬撳湪浣跨敤綾諱技璧勬簮鐨勬椂鍊欏繀欏婚兘鍔犱笂涓鍙ワ細conn.close()錛屾湁鏃跺欒繕瑕佸湪close()鍚庨潰鍐嶅姞涓鍙ワ細conn=null銆傚懙鍛碉紝闈炲父鏈夋剰鎬濄?br />聽 2.5灝忕粨 銆銆鐜板湪鐪嬫潵錛屽叾瀹為偅鏃剁‘瀹炵姱浜嗗緢澶氬辜紼氱殑閿欒錛屼篃璧頒簡涓嶅皯鐨勫集璺紝鍋氫簡寰堝鐢昏泧娣昏凍鐨勫伐浣滐紝鍐欎簡寰堝闅句笌緇存姢鐨勪唬鐮併?br />銆銆瀵規瘮浠婂ぉ鐨処OC妯″紡錛岃嫢瑕佷粠鏃╃殑OO鏂規硶涓‖瑕佹壘涓涓被浼糞pring鐨勫鍣ㄧ殑璇濓紝閭e氨鏄細鈥滅▼搴忓憳錛婮VM鏈韓鈥濄傛槸紼嬪簭鍛樹互鍙奐VM涓璧鋒垜浠鐞嗗璞$殑鐢熷懡鍛ㄦ湡銆佸璞′箣闂寸殑鍏崇郴絳夈傞偅鏃跺欒嫢鏈変換浣曞彉鍔ㄩ兘闇瑕佹敼浠g爜錛岋紙铏界劧濂界殑璁捐浠g爜淇敼浼氶潪甯稿皯錛屼絾涔熷緱鏀癸紒錛夛紝鐒跺悗緙栬瘧錛岀劧鍚庢嬁鍒版祴璇曠幆澧冨強鐢ㄦ埛鐜涓墽琛屻傚姝ゅ弽澶嶏紝騫存棩澶嶄竴鏃ャ佸勾澶嶄竴騫淬?br />銆銆閭f椂鎴戜滑鐨勪唬鐮佸鐢ㄧ敤寰楁渶澶氱殑灝辨槸OO鐨勭戶鎵垮姛鑳斤紝鍙﹀榪樻湁寰堝OP鏂規硶涓甫榪囨潵鐨勫嚱鏁般?br />銆銆鏈枃涓秹鍙婂埌鐨勫嚑涓畝鍗曟簮鐮侊紝璇峰埌EasyJF寮婧愬洟闃熷畼緗戜笅杞斤紝鍦板潃錛?br />銆銆http://www.easyjf.com/html/bbs/20060602/12718636-1843943.htm?ejid=1287314863003738 聽 銆銆 |