ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>成人精品影院,亚洲不卡一区二区三区,中文字幕亚洲欧美一区二区三区http://www.aygfsteel.com/brock/category/53326.htmlzh-cnSat, 25 Feb 2017 05:35:40 GMTSat, 25 Feb 2017 05:35:40 GMT60在同一台机器上安装多个版本jdkåQŒä¿®æ”¹çŽ¯å¢ƒå˜é‡ä¸ç”Ÿæ•ˆhttp://www.aygfsteel.com/brock/archive/2015/01/06/422073.htmlbrockbrockTue, 06 Jan 2015 03:45:00 GMThttp://www.aygfsteel.com/brock/archive/2015/01/06/422073.htmlhttp://www.aygfsteel.com/brock/comments/422073.htmlhttp://www.aygfsteel.com/brock/archive/2015/01/06/422073.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/422073.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/422073.html

    本机已经安装了jdk1.6åQŒè€Œæ¯”较早期的™å¹ç›®éœ€è¦ä¾èµ–jdk1.5åQŒäºŽæ˜¯åŒæ—¶åœ¨æœ¬æœºå®‰è£…了jdk1.5å’Œjdk1.6. 

 å®‰è£…jdk1.5前,执行java -version得到

java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)


安装完jdk1.5,òq¶ä¿®æ”¹çŽ¯å¢ƒå˜é‡JAVA_HOME为D:\devSoftware\jdk1.5.再执è¡?nbsp;java -versionæ—Óž¼Œä¾ç„¶æ˜„¡¤ºåQ?/p>

java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)


看上去,新的环境变量JAVA_HOME=D:\devSoftware\jdk1.5òq¶æ²¡æœ‰ç”Ÿæ•ˆã€?在网上找了很多资料才发现åQ?/p>

      在安装JDK1.6æ—Óž¼ˆæœ¬æœºå…ˆå®‰è£…jdk1.6再安装的jdk1.5åQ‰ï¼Œè‡ªåЍž®†java.exe、javaw.exe、javaws.exe三个可执行文件复制到了C:\Windows\System32目录åQŒç”±äºŽè¿™ä¸ªç›®å½•在WINDOWS环境变量中的优先¾U§é«˜äºŽJAVA_HOME讄¡½®çš„环境变量优先çñ”


解决æ–ÒŽ(gu¨©)¡ˆåQšå°†java.exe,javaw.exe,javaws.exe删除卛_¯ã€‚开启新的命令行½H—口åQŒå†æ‰§è¡Œjava -versionæ—Óž¼Œž®±å¾—åˆîCº†æœŸæœ›ä¸­çš„¾l“æžœ

java version "1.5.0_17"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_17-b04, mixed mode)




]]>
Calendar.getInstance() 不要攑֜¨å¾ªçޝé‡? 当心OutOfMemoryError: Java heap spacehttp://www.aygfsteel.com/brock/archive/2014/01/08/408673.htmlbrockbrockWed, 08 Jan 2014 03:26:00 GMThttp://www.aygfsteel.com/brock/archive/2014/01/08/408673.htmlhttp://www.aygfsteel.com/brock/comments/408673.htmlhttp://www.aygfsteel.com/brock/archive/2014/01/08/408673.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/408673.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/408673.html List<Calendar> l = new ArrayList<Calendar>();
while (true) {
l.add(Calendar.getInstance());
System.out.println(l.size());
}
605473
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Calendar.<init>(Unknown Source)
at java.util.GregorianCalendar.<init>(Unknown Source)
at java.util.Calendar.createCalendar(Unknown Source)
at java.util.Calendar.getInstance(Unknown Source)
at jodatestmemory.Main.main(Main.java:25)

]]>
lucene½Iºé—´ç´¢å¼•http://www.aygfsteel.com/brock/archive/2013/11/29/407021.htmlbrockbrockFri, 29 Nov 2013 08:15:00 GMThttp://www.aygfsteel.com/brock/archive/2013/11/29/407021.htmlhttp://www.aygfsteel.com/brock/comments/407021.htmlhttp://www.aygfsteel.com/brock/archive/2013/11/29/407021.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/407021.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/407021.html1、创建烦å¼?  
-------------------------------------------------------------------------------------------
GeohashPrefixTree grid = new GeohashPrefixTree(ctx, 12);//< 1 meter == 11 maxLevels
        this.strategy = new RecursivePrefixTreeStrategy(grid, "shape");
        ((RecursivePrefixTreeStrategy) this.strategy).setDistErrPct(LUCENE_4464_distErrPct);//1% radius (small!)

 String wktstr = clobtoString(map.get("wkt"));//囑ÖŞ信息
                String objectid = map.get("objectid").toString();//对象id
                String name = map.get("name").toString();//对象名称
                Shape shape = wktGeoRect(wktstr);
                Document doc = new Document();
                doc.add(new StringField("objectidtable", objectid + tableName, Field.Store.YES));
                doc.add(new StringField("objectid", objectid, Field.Store.YES));
                doc.add(new StringField("tableName", tableName, Field.Store.YES));
                doc.add(new StringField("metadataid", mid.toString(), Field.Store.YES));
                doc.add(new TextField ("title", name, Field.Store.YES));
                if (shape != null) {
                    for (Field f : strategy.createIndexableFields(shape)) {
                        doc.add(f);
                    }
                    doc.add(new StoredField(strategy.getFieldName(), ctx.toString(shape)));
                }
  indexWriter.addDocument(doc);
---------------------------------------------------------------
    public Shape wktGeoRect(String wktStr) {
        JtsGeometry jtsGeom = null;
        try {
            if (StringUtils.trim(wktStr.substring(0, wktStr.indexOf("("))).equalsIgnoreCase("POINT")) {
                wktStr = wktStr.substring(wktStr.indexOf("(") + 1, wktStr.lastIndexOf(")"));
                String[] point = wktStr.split(" ");
                return ctx.makePoint(Double.parseDouble(point[0]), Double.parseDouble(point[1]));
            } else {
                jtsGeom = (JtsGeometry) ctx.readShape(wktStr);
            }
        } catch (Exception e) {
        }
        return jtsGeom;
    }
2、查询空间烦�br />
   @Test
    public void testshape() throws Exception {
                JtsSpatialContext ctx = JtsSpatialContext.GEO;
        Directory directory = new SimpleFSDirectory(new File("D:/platform/spatiallucence"));
        IndexReader[] indexReaders1 = new IndexReader[]{IndexReader.open(directory)};
        MultiReader multiReader = new MultiReader(indexReaders1);
        indexSearcher = new IndexSearcher(multiReader);
        indexSearcher.setSimilarity(new NoScoreSimilarity());
        GeohashPrefixTree grid = new GeohashPrefixTree(ctx, 12);//< 1 meter == 11 maxLevels
        strategy = new RecursivePrefixTreeStrategy(grid, "shape");
        ((RecursivePrefixTreeStrategy) strategy).setDistErrPct(0.025);//1% radius (small!)
        //POINT (121.591953019118 28.7566972164043)
        //Shape shape = ctx.readShape("POINT (121.454715099823 28.860595871703)");
        Shape shape = ctx.readShape("POLYGON(" +
                "(121.10836126349 28.84450508816,\n" +
                "121.12569906256 28.84450508816,\n" +
                "121.12569906256 28.856950537989,\n" +
                "121.10836126349 28.856950537989,\n" +
                "121.10836126349 28.84450508816))");
        shape = ctx.makeRectangle(121.10836126349d ,121.12569906256d, 28.84450508816d ,28.856950537989d);
        SpatialArgs args = new SpatialArgs(SpatialOperation.Intersects, shape);
        args.setDistErrPct(0.025);
        Query query = strategy.makeQuery(args);
        TopDocs results = indexSearcher.search(query, 1000);
        int numTotalHits = results.totalHits;
        System.out.println("å…?" + numTotalHits + " 完全匚w…çš„æ–‡æ¡?);
        ScoreDoc[] hits = results.scoreDocs;
        for (int i = 0; i < hits.length; i++) {
            Document document = indexSearcher.doc(hits[i].doc);
            System.out.println("Id: " + document);
        }
    }



]]>
java 获取cpu 使用çŽ?/title><link>http://www.aygfsteel.com/brock/archive/2013/08/19/403021.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Mon, 19 Aug 2013 02:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/08/19/403021.html</guid><wfw:comment>http://www.aygfsteel.com/brock/comments/403021.html</wfw:comment><comments>http://www.aygfsteel.com/brock/archive/2013/08/19/403021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/brock/comments/commentRss/403021.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/brock/services/trackbacks/403021.html</trackback:ping><description><![CDATA[<div>  private static double getCpuRateForLinux(){</div><div>        InputStream is = null;</div><div>        InputStreamReader isr = null;</div><div>        BufferedReader brStat = null;</div><div>        StringTokenizer tokenStat = null;</div><div>        try{</div><div>            System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);</div><div></div><div>            Process process = Runtime.getRuntime().exec("top -b -n 1");</div><div>            is = process.getInputStream();</div><div>            isr = new InputStreamReader(is);</div><div>            brStat = new BufferedReader(isr);</div><div></div><div>            if(linuxVersion.equals("2.4")){</div><div>                brStat.readLine();</div><div>                brStat.readLine();</div><div>                brStat.readLine();</div><div>                brStat.readLine();</div><div></div><div>                tokenStat = new StringTokenizer(brStat.readLine());</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                String user = tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                String system = tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                String nice = tokenStat.nextToken();</div><div></div><div>                System.out.println(user+" , "+system+" , "+nice);</div><div></div><div>                user = user.substring(0,user.indexOf("%"));</div><div>                system = system.substring(0,system.indexOf("%"));</div><div>                nice = nice.substring(0,nice.indexOf("%"));</div><div></div><div>                float userUsage = new Float(user).floatValue();</div><div>                float systemUsage = new Float(system).floatValue();</div><div>                float niceUsage = new Float(nice).floatValue();</div><div></div><div>                return (userUsage+systemUsage+niceUsage)/100;</div><div>            }else{</div><div>                brStat.readLine();</div><div>                brStat.readLine();</div><div></div><div>                tokenStat = new StringTokenizer(brStat.readLine());</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                tokenStat.nextToken();</div><div>                String cpuUsage = tokenStat.nextToken();</div><div></div><div></div><div>                System.out.println("CPU idle : "+cpuUsage);</div><div>                Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));</div><div></div><div>                return (1-usage.floatValue()/100);</div><div>            }</div><div></div><div></div><div>        } catch(IOException ioe){</div><div>            System.out.println(ioe.getMessage());</div><div>            freeResource(is, isr, brStat);</div><div>            return 1;</div><div>        } finally{</div><div>            freeResource(is, isr, brStat);</div><div>        }</div><div></div><div>    }</div><div>    private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){</div><div>        try{</div><div>            if(is!=null)</div><div>                is.close();</div><div>            if(isr!=null)</div><div>                isr.close();</div><div>            if(br!=null)</div><div>                br.close();</div><div>        }catch(IOException ioe){</div><div>            System.out.println(ioe.getMessage());</div><div>        }</div><div>    }</div><div></div><div></div><div>    /**</div><div>     * 获得CPU使用çŽ?   </div><div>     * @return ˜q”回cpu使用çŽ?/div><div>     * @author GuoHuang</div><div>     */</div><div>    private double getCpuRatioForWindows() {</div><div>        try {</div><div>            String procCmd = System.getenv("windir")</div><div>                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"</div><div>                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";</div><div>            // 取进½E‹ä¿¡æ?   </div><div>            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));</div><div>            Thread.sleep(CPUTIME);</div><div>            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));</div><div>            if (c0 != null && c1 != null) {</div><div>                long idletime = c1[0] - c0[0];</div><div>                long busytime = c1[1] - c0[1];</div><div>                return Double.valueOf(</div><div>                        PERCENT * (busytime) / (busytime + idletime))</div><div>                        .doubleValue();</div><div>            } else {</div><div>                return 0.0;</div><div>            }</div><div>        } catch (Exception ex) {</div><div>            ex.printStackTrace();</div><div>            return 0.0;</div><div>        }</div><div>    }</div><div></div><div>    /**</div><div></div><div>     * è¯Õd–CPU信息.</div><div>     * @param proc</div><div>     * @return</div><div>     * @author GuoHuang</div><div>     */</div><div>    private long[] readCpu(final Process proc) {</div><div>        long[] retn = new long[2];</div><div>        try {</div><div>            proc.getOutputStream().close();</div><div>            InputStreamReader ir = new InputStreamReader(proc.getInputStream());</div><div>            LineNumberReader input = new LineNumberReader(ir);</div><div>            String line = input.readLine();</div><div>            if (line == null || line.length() < FAULTLENGTH) {</div><div>                return null;</div><div>            }</div><div>            int capidx = line.indexOf("Caption");</div><div>            int cmdidx = line.indexOf("CommandLine");</div><div>            int rocidx = line.indexOf("ReadOperationCount");</div><div>            int umtidx = line.indexOf("UserModeTime");</div><div>            int kmtidx = line.indexOf("KernelModeTime");</div><div>            int wocidx = line.indexOf("WriteOperationCount");</div><div>            long idletime = 0;</div><div>            long kneltime = 0;</div><div>            long usertime = 0;</div><div>            while ((line = input.readLine()) != null) {</div><div>                if (line.length() < wocidx) {</div><div>                    continue;</div><div>                }</div><div>                // 字段出现™åºåºåQšCaption,CommandLine,KernelModeTime,ReadOperationCount,    </div><div>                // ThreadCount,UserModeTime,WriteOperation    </div><div>                String caption = Bytes.substring(line, capidx, cmdidx - 1)</div><div>                        .trim();</div><div>                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();</div><div>                if (cmd.indexOf("wmic.exe") >= 0) {</div><div>                    continue;</div><div>                }</div><div>                // log.info("line="+line);    </div><div>                if (caption.equals("System Idle Process")</div><div>                        || caption.equals("System")) {</div><div>                    idletime += Long.valueOf(</div><div>                            Bytes.substring(line, kmtidx, rocidx - 1).trim())</div><div>                            .longValue();</div><div>                    idletime += Long.valueOf(</div><div>                            Bytes.substring(line, umtidx, wocidx - 1).trim())</div><div>                            .longValue();</div><div>                    continue;</div><div>                }</div><div></div><div>                kneltime += Long.valueOf(</div><div>                        Bytes.substring(line, kmtidx, rocidx - 1).trim())</div><div>                        .longValue();</div><div>                usertime += Long.valueOf(</div><div>                        Bytes.substring(line, umtidx, wocidx - 1).trim())</div><div>                        .longValue();</div><div>            }</div><div>            retn[0] = idletime;</div><div>            retn[1] = kneltime + usertime;</div><div>            return retn;</div><div>        } catch (Exception ex) {</div><div>            ex.printStackTrace();</div><div>        } finally {</div><div>            try {</div><div>                proc.getInputStream().close();</div><div>            } catch (Exception e) {</div><div>                e.printStackTrace();</div><div>            }</div><div>        }</div><div>        return null;</div><div>    }<br /><span style="color: red; ">上面æ–ÒŽ(gu¨©)³•不行åQŒä¸‹é¢çš„可以</span><br /><div>  String result = "";</div><div></div><div>        try {</div><div></div><div>            File file = File.createTempFile("tmp", ".vbs");</div><div></div><div>            file.deleteOnExit();</div><div></div><div>            FileWriter fw = new java.io.FileWriter(file);</div><div></div><div>            String vbs ="Set objProc = GetObject(\"winmgmts:\\\\.\\root\\cimv2:win32_processor='cpu0'\")\n" +</div><div>                    "WScript.Echo  \"CPU Load Percentage: \"& chr(13) & chr(10) & Round(objProc.LoadPercentage,2) & \"%\"";</div><div></div><div></div><div></div><div>            fw.write(vbs);</div><div></div><div>            fw.close();</div><div></div><div>            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());</div><div></div><div>            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));</div><div></div><div>            String line;</div><div></div><div>            while ((line = input.readLine()) != null) {</div><div></div><div>                result += line;</div><div></div><div>            }</div><div></div><div>            input.close();</div><div></div><div>            file.delete();</div><div></div><div>        } catch (Exception e) {</div><div></div><div>            e.fillInStackTrace();</div><div></div><div>        }</div><div></div><div>        if (result.trim().length() < 1 || result == null) {</div><div></div><div></div><div></div><div>        }else{</div><div></div><div>            System.out.println(result.trim());</div><div></div><div>        }</div><br /><br /><br /><br /></div><img src ="http://www.aygfsteel.com/brock/aggbug/403021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-08-19 10:40 <a href="http://www.aygfsteel.com/brock/archive/2013/08/19/403021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 注册åˆ?windows 服务http://www.aygfsteel.com/brock/archive/2013/08/09/402627.htmlbrockbrockFri, 09 Aug 2013 06:20:00 GMThttp://www.aygfsteel.com/brock/archive/2013/08/09/402627.htmlhttp://www.aygfsteel.com/brock/comments/402627.htmlhttp://www.aygfsteel.com/brock/archive/2013/08/09/402627.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/402627.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/402627.html#encoding=UTF-8
# Configuration files must begin with a line specifying the encoding
#  of the the file.
#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
#  License Key to start.  Licenses can be purchased or a trial license
#  requested on the following pages:
# http://wrapper.tanukisoftware.com/purchase
# http://wrapper.tanukisoftware.com/trial
# Include file problems can be debugged by removing the first '#'
#  from the following line:
##include.debug
# The Wrapper will look for either of the following optional files for a
#  valid License Key.  License Key properties can optionally be included
#  directly in this configuration file.
#include ../conf/wrapper-license.conf
#include ../conf/wrapper-license-%WRAPPER_HOST_NAME%.conf
# The following property will output information about which License Key(s)
#  are being found, and can aid in resolving any licensing problems.
#wrapper.license.debug=TRUE
#********************************************************************
# Wrapper Localization
#********************************************************************
# Specify the locale which the Wrapper should use.  By default the system
#  locale is used.
#wrapper.lang=en_US # en_US or ja_JP
# Specify the location of the Wrapper's language resources.  If these are
#  missing, the Wrapper will default to the en_US locale.
wrapper.lang.folder=../lang
#********************************************************************
# Wrapper Java Properties
#********************************************************************
# Java Application
#  Locate the java binary on the system PATH:
wrapper.java.command=java
#  Specify a specific java binary:
#set.JAVA_HOME=/java/path
set.LIB=D:/MonitorApp/lib
#wrapper.java.command=%JAVA_HOME%/bin/java
# Tell the Wrapper to log the full generated Java command line.
#wrapper.java.command.loglevel=INFO
# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
echo %LIB%
wrapper.java.classpath.1=%LIB%/wrapper.jar
wrapper.java.classpath.2=%LIB%/commons-beanutils-1.8.3.jar
wrapper.java.classpath.3=%LIB%/commons-codec-1.4.jar
wrapper.java.classpath.4=%LIB%/commons-collections-3.1.jar
wrapper.java.classpath.5=%LIB%/commons-collections-3.2.1.jar
wrapper.java.classpath.6=%LIB%/commons-dbcp-1.3.jar
wrapper.java.classpath.7=%LIB%/commons-dbcp-1.4.jar
wrapper.java.classpath.8=%LIB%/commons-fileupload-1.2.1.jar
wrapper.java.classpath.9=%LIB%/commons-httpclient-3.0.1.jar
wrapper.java.classpath.10=%LIB%/commons-io-1.4.jar
wrapper.java.classpath.11=%LIB%/commons-io-2.0.1.jar
wrapper.java.classpath.12=%LIB%/commons-jexl-1.1.jar
wrapper.java.classpath.13=%LIB%/commons-lang-2.5.jar
wrapper.java.classpath.14=%LIB%/commons-logging-1.1.1.jar
wrapper.java.classpath.15=%LIB%/commons-logging-api-1.1.jar
wrapper.java.classpath.16=%LIB%/commons-management-1.0.jar
wrapper.java.classpath.17=%LIB%/commons-pool-1.5.4.jar
wrapper.java.classpath.18=%LIB%/jedis-2.0.0.jar
wrapper.java.classpath.19=%LIB%/log4j-1.2.14.jar
wrapper.java.classpath.20=%LIB%/quartz-all-1.6.3.jar
wrapper.java.classpath.21=%LIB%/spring-aop-3.0.2.RELEASE.jar
wrapper.java.classpath.22=%LIB%/spring-asm-3.0.2.RELEASE.jar
wrapper.java.classpath.23=%LIB%/spring-beans-3.0.2.RELEASE.jar
wrapper.java.classpath.24=%LIB%/spring-binding-2.0.8.RELEASE.jar
wrapper.java.classpath.25=%LIB%/spring-context-3.0.2.RELEASE.jar
wrapper.java.classpath.26=%LIB%/spring-context-support-3.0.2.RELEASE.jar
wrapper.java.classpath.27=%LIB%/spring-core-3.0.2.RELEASE.jar
wrapper.java.classpath.28=%LIB%/spring-expression-3.0.2.RELEASE.jar
wrapper.java.classpath.29=%LIB%/springside-3.3.2.jar
wrapper.java.classpath.30=%LIB%/spring-test-3.0.2.RELEASE.jar
wrapper.java.classpath.31=%LIB%/spring-tx-3.0.2.RELEASE.jar
wrapper.java.classpath.32=%LIB%/slf4j-api-1.5.8.jar
wrapper.java.classpath.33=%LIB%/slf4j-log4j12-1.5.8.jar
wrapper.java.classpath.34=%LIB%/monitor.jar
wrapper.java.classpath.35=%LIB%   #可以è¯Õdˆ°˜q™é‡Œçš„æ–‡ä»?xml pro ½{?      
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=../bin
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Java Additional Parameters
wrapper.java.additional.1=-Dlog4j.configuration=file:%LIB%/log4j.xml
wrapper.java.additional.2=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=TRUE
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512
# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=com.zjasm.tomcat.TomcatStat
#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Enables Debug output from the Wrapper.
#wrapper.debug=TRUE
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM
# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO
# Log file to use for wrapper output logging.
wrapper.logfile=../logs/wrapper.log
# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM
# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO
# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=0
# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=0
# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Do not start if the pid file already exists.
wrapper.pidfile.strict=TRUE
# Title to use when running as a console
wrapper.console.title=Test Wrapper Sample Application
#********************************************************************
# Wrapper JVM Checks
#********************************************************************
# Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=10
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL
# Out Of Memory detection.
# (Ignore output from dumping the configuration to the console.  This is only needed by the TestWrapper sample application.)
wrapper.filter.trigger.999=wrapper.filter.trigger.*java.lang.OutOfMemoryError
wrapper.filter.allow_wildcards.999=TRUE
wrapper.filter.action.999=NONE
#  Ignore -verbose:class output to avoid false positives.
wrapper.filter.trigger.1000=[Loaded java.lang.OutOfMemoryError
wrapper.filter.action.1000=NONE
# (Simple match)
wrapper.filter.trigger.1001=java.lang.OutOfMemoryError
# (Only match text in stack traces if -XX:+PrintClassHistogram is being used.)
#wrapper.filter.trigger.1001=Exception in thread "*" java.lang.OutOfMemoryError
#wrapper.filter.allow_wildcards.1001=TRUE
wrapper.filter.action.1001=RESTART
wrapper.filter.message.1001=The JVM has run out of memory.
#********************************************************************
# Wrapper Email Notifications. (Requires Professional Edition)
#********************************************************************
# Common Event Email settings.
#wrapper.event.default.email.debug=TRUE
#wrapper.event.default.email.smtp.host=<SMTP_Host>
#wrapper.event.default.email.smtp.port=25
#wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
#wrapper.event.default.email.sender=<Sender email>
#wrapper.event.default.email.recipient=<Recipient email>
# Configure the log attached to event emails.
#wrapper.event.default.email.attach_log=TRUE
#wrapper.event.default.email.maillog.lines=50
#wrapper.event.default.email.maillog.format=LPTM
#wrapper.event.default.email.maillog.loglevel=INFO
# Enable specific event emails.
#wrapper.event.wrapper_start.email=TRUE
#wrapper.event.jvm_prelaunch.email=TRUE
#wrapper.event.jvm_start.email=TRUE
#wrapper.event.jvm_started.email=TRUE
#wrapper.event.jvm_deadlock.email=TRUE
#wrapper.event.jvm_stop.email=TRUE
#wrapper.event.jvm_stopped.email=TRUE
#wrapper.event.jvm_restart.email=TRUE
#wrapper.event.jvm_failed_invocation.email=TRUE
#wrapper.event.jvm_max_failed_invocations.email=TRUE
#wrapper.event.jvm_kill.email=TRUE
#wrapper.event.jvm_killed.email=TRUE
#wrapper.event.jvm_unexpected_exit.email=TRUE
#wrapper.event.wrapper_stop.email=TRUE
# Specify custom mail content
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.
# Name of the service
wrapper.name=testwrapper
# Display name of the service
wrapper.displayname=Test Wrapper Sample Application
# Description of the service
wrapper.description=Test Wrapper Sample Application Description
# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=
# Mode in which the service is installed.  AUTO_START, DELAY_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false


]]>
哥把Tengine改回NGINXhttp://www.aygfsteel.com/brock/archive/2013/05/16/399366.htmlbrockbrockThu, 16 May 2013 08:54:00 GMThttp://www.aygfsteel.com/brock/archive/2013/05/16/399366.htmlhttp://www.aygfsteel.com/brock/comments/399366.htmlhttp://www.aygfsteel.com/brock/archive/2013/05/16/399366.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/399366.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/399366.html阅读全文

]]>
关于产品¾lç†çš„å››ç‚ÒŽ(gu¨©)€è€?/title><link>http://www.aygfsteel.com/brock/archive/2013/03/22/396844.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Fri, 22 Mar 2013 03:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/03/22/396844.html</guid><description><![CDATA[<p style="line-height:18.0pt;background:#F8F7F5"><span style="font-family:"Helvetica","sans-serif";color:#3E3E3E">1 </span><span style="color:#3E3E3E">做äñ”品经理,而不是功能经理;</span></p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-family:"Helvetica","sans-serif";color:#3E3E3E">2 </span><span style="color:#3E3E3E">做äñ”品需求,而不是用户需求;</span></p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="color:#3E3E3E">3 </span><span style="color:#3E3E3E">要锦上添花,而不是画蛇添­‘»I¼›</span></p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="color:#3E3E3E">4 </span><span style="color:#3E3E3E">˜q½æ±‚人性化åQŒè€Œä¸æ˜¯è¿½æ±‚完¾ŸŽã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">产品¾lç†æ˜¯ä¸ªå¾ˆå¥‡æ€ªçš„岗位åQŒå¥½åƒå¤§å¤šæ•°äººéƒ½èƒ½åšåQŒå› ä¸ºæ¯ä¸ªähå¯ÒŽ(gu¨©)Ÿä¸ªäñ”品都有自å·Þqš„看法åQŒéƒ½èƒ½æå‡ÞZ¸€äº›æ„è§å’ŒæƒÏx³•åQŒç”šè‡Œ™ƒ½è®¾è®¡å®žçŽ°åŽŸç†åQ›ä¹Ÿå¥½åƒå¤§å¤šæ•îCh都做不好产品¾lç†åQŒå› ä¸ÞZº’联网上成千上万个产品åQŒå¤§éƒ¨åˆ†æ˜¯åžƒåœ¾ï¼Œæ²¡å‡ ä¸ªäñ”品是用户真心觉得很不错的ã€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">我做产品¾lç†åQŒè¿˜ä¸åˆ°ä¸¤å¹´åQŒä»¥å‰åæ¥å¹´ä¸€ç›´åœ¨åšæŠ€æœ¯ã€‚之前做技术的时候,我很看不上äñ”品经理。当时想åQšäñ”品经理自å·×ƒ»€ä¹ˆéƒ½å®žçŽ°ä¸äº†åQŒæ¯å¤©å°±æ˜¯æç‚ÒŽ(gu¨©)ƒ³æ³•,而且æƒÏx³•˜q˜ç»å¸æ€¸é è°±åQŒå¦‚果哪天裁员,产品¾lç†çš„位¾|®æœ€å±é™©äº†ï¼›ä½†ç­‰æˆ‘è{来做了äñ”品经理,æƒÏx³•发生了根本的变化åQšå—¯åQŒäñ”品经理太重要的,一个äñ”品的未来ž®±å†³å®šåœ¨äº§å“¾lç†íw«ä¸Šã€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">你问我现在如何看待技术äh员?嘿嘿åQŒæˆ‘现在觉得åQŒæŠ€æœ¯å°±æ˜¯ä¸€æŠŠåˆ€åQŒè®©å®ƒæ€è°å°±æ€è°ï¼å½“ç„¶åQŒè¿™åªæ˜¯å¼€çŽ©ç¬‘ã€‚ä¸€ä¸ªå¥½çš„æŠ€æœ¯å›¢é˜Ÿå¯¹äºŽäñ”品经理来è¯ß_¼Œé‚£æ˜¯ç›¸å½“重要ã€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">对如何做产品¾lç†åQŒæˆ‘˜q˜çœŸçš„æ˜¯ž®å­¦ç”Ÿï¼Œè‡ªå·±è´Ÿè´£çš„æ·˜å®æœç´¢æœ€˜q‘两òq´ä¹Ÿæ²¡ä»€ä¹ˆå¤§æå‡ã€‚特别是看了周é¿`¼œŽã€å¼ ž®é¾™å…³äºŽå¯¹äñ”品的一些访谈以后,我更发现自己在这斚w¢çš„差距ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">不过我有个优点,ž®±æ˜¯å–„于学习、思考、æ€È»“òq¶åˆ†äº«ã€‚è€Œä¸”ä½œäØ“ä¸€ä¸ªå¤–è¡Œè¿›å…¥åˆ°˜q™ä¸ªé¢†åŸŸåQŒè§‚察的角度也会不一栗÷€‚这一òq´å¤šä¸‹æ¥åQŒä¹Ÿæ‰‘Öˆ°ä¸€äº›æ„Ÿè§‰ï¼Œå‘现周围的一些äñ”品经理,å®ÒŽ(gu¨©)˜“走入一些误区,分äín¾l™å¤§å®¶ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">1 </span><span style="font-size:13.5pt;color:#3E3E3E">做äñ”品经理,而不是功能经理ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">˜q™å¥è¯æˆ‘最早是听天猫总裁逍遥子说的,当时没有感觉åQŒçŽ°åœ¨å‘çŽ°éžå¸¸æœ‰é“ç†åQŒå› ä¸ºå‘¨å›´å¤ªå¤šçš„产品¾lç†å®žé™…上是在做一名功能经理ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">他们只是不停的在接äñ”品功能需求,然后不停实现产品功能。缺ç™Õd½•åQŒè®¾è®¡ä¸€ä¸ªç™»å½•框åQ›æ²¡æœ‰æ•°æ®ï¼Œæ‰¾æŸä¸ªåã^台打通一下;½Ž¡ç†ä¸æ–¹ä¾¿ï¼Œè®¾è®¡ä¸€ä¸ªå·¥å…äh¥½Ž¡ç†åQ›é¡µé¢ä¸¾ŸŽè§‚åQŒé‡æ–°è§„划一下页面结æž?#8230;…</span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">功能¾lç†åQŒæ¯å¤©éƒ½å¾ˆå¿™åQŒå…³æ³¨è¿˜æœ‰å¤šž®‘需求在后面排队åQŒéœ€æ±‚方是否得到满èƒö。而用户体验到底如何,功能是否真的真有价å€û|¼Œæ˜¯å¦å¯ä»¥æ›´åŠ å®Œç¾ŽåQŒåŠŸèƒ½ç»ç†å¾ˆž®‘关心。当有äh抱怨某个功能不爽的时候,他会è¯ß_¼š</span></p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:13.5pt;font-family:宋体;color:#3E3E3E">˜q™ä¸ªåŠŸèƒ½æˆ‘å·²¾læœ‰äº†å•ŠåQŒä½ è¯´ä½“验不太好åQŸæ²¡åŠžæ³•åQŒå·¥½E‹å¸ˆèµ„源太紧张啊åQŒä½ è¯´äؓ啥设计的˜q™ä¹ˆåˆ«æ‰­åQŸkaoåQŒæƒ³èµäh¥ž®±æ¥æ°”,大老板非要求这样啊åQŒæˆ‘们也只能˜q™æ ·è®¾è®¡åQŒæ²¡åŠžæ³•åQ?/span></strong></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">他经常表辄¡š„è¯­æ°”æ˜¯ä»–ä¹Ÿä¸å¾—å·²è€ŒäØ“ä¹‹ï¼ŒæŠŠè´£ä»»éƒ½æŽ¨åˆ°å…¶ä»–äºø™ín上ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">然而做一个合格的产品¾lç†åQŒéœ€è¦å…³æ³¨ç”¨æˆïLš„体验åQŒçœŸæ­£å…³æ³¨ç”¨æˆïLš„反馈åQŒå…³æ³¨æ•°æ®çš„质量åQŒå…³æ³¨æ¯ä¸€ä¸ªç»†èŠ‚ã€‚å°±åƒä¹°ä¸€åŒéž‹ä¸€æ øP¼Œä¸åªæ˜¯èƒ½½I¿ï¼Œ˜q˜è¦è€ƒè™‘是否合脚åQŒæ˜¯å¦èˆ’服,‹Æ‘Ö¼æ˜¯å¦æ¼‚亮ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">有一‹Æ¡å¼€ä¼šï¼Œæ·˜å®çš„æ€»è£è¯­å«£å§å§è¯´äº†ä¸€å¥å¾ˆæœ´ç´ ä½†å¾ˆæœ‰é“理的一句话åQšäñ”品能用和好用完全不是一回事åQ?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">(</span><span style="font-size:13.5pt;color:#3E3E3E">大家不用批评淘宝搜烦啊,我知道很多地方还不好用。大家再¾l™æˆ‘ç‚ÒŽ(gu¨©)—¶é—ß_¼Œæˆ‘也认识到这个问题不æ˜?.....)</span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">2 </span><span style="font-size:13.5pt;color:#3E3E3E">实现产品需求,而不是用户需求ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">˜q™ä¸ªè¯é¢˜å¾ˆæœ‰æ„æ€ã€‚当你问用户需要什么的时候,他会回答他需要一åŒÒŽ(gu¨©)›´å¿«çš„马。乔布斯è¯ß_¼Œæ°¸è¿œä¸è¦é—®ç”¨æˆähƒ³è¦ä»€ä¹ˆï¼å› äؓ用户都是å‚ȝ“œåQŒä¸çŸ¥é“自己惌™¦ä»€ä¹ˆã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">˜q™å…¶å®žæ˜¯äº§å“¾lç†¾lå¸¸æŠŠç”¨æˆ·éœ€æ±‚当成äñ”品需求。对所有用戯‚¯´çš„,他们没错åQŒæçš„都是自å·Þqš„æœŸæœ›åQŒä¸æ˜¯ä¸€ä¸ªäñ”品需求。前些天有张ž®é¾™çš„采访,张小龙说他不看用æˆïLš„æ•°æ®ã€‚其实张ž®é¾™å¾ˆå…³å¿ƒç”¨æˆïLš„需求,我和张小龙在一个群里,如果有äh在群里提一些微信ä‹É用不爽的功能åQŒå¼ ž®é¾™ä¼šå¾ˆå¿«ç»™å‡ºåé¦ˆã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">˜q™äº›äº§å“å¤§ç¥žä»¬ï¼ŒèƒŒåŽçš„æ„æ€æ˜¯åQŒä¸åº”该½Ž€å•满­‘³ç”¨æˆ·éœ€æ±‚,而应该思考把用户需求提炼成产品需求。当一个äñ”品的用户有上百万上千万的时候,产品需求的理解和提ç‚û|¼Œž®Þq›¸å½“重要ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">˜q™ä¸ªé“理比较å®ÒŽ(gu¨©)˜“理解åQŒä¸åšå¤šè§£é‡Šã€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">3 </span><span style="font-size:13.5pt;color:#3E3E3E">要锦上添花,而不是画蛇添­‘Ÿë€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">互联¾|‘的发展åQŒè®©å¾ˆå¤šäº’联¾|‘äñ”品经理有个惯性:做äñ”品è„P代要快。快速上¾U¿ï¼Œå¿«é€Ÿä¿®æ”V€‚这里也有误区,对于一些基本功能,¼‹®å®žè¦å¿«é€Ÿä¸Š¾U¿ï¼Œå¿«é€Ÿè„P代。因为有市场竞争åQŒéœ€è¦å¿«é€Ÿåˆ‡å…¥å¸‚场,获得用户。然而大部分的äñ”品经理,没有æœÞZ¼šä»Žé›¶å¼€å§‹è®¾è®¡ä¸€ä¸ªæ–°äº§å“åQŒå¤§éƒ¨åˆ†æ—¶å€™åœ¨çŽ°æœ‰çš„äñ”品上做升¾U§æˆ–优化。这时设计的很多功能åQŒéƒ½æ˜¯é”¦ä¸Šæ·»èŠÞqš„功能åQŒè¿˜çœŸä¸èƒ½å¤ªå¿«ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">锦上添花的功能,同样重要åQŒä¼šè®©äñ”品更好玩åQŒæ›´æœ‰æ„æ€ï¼Œæ›´æœ‰ç‰¹ç‚¹ã€‚例如微信最早设计的摇一摇功能、朋友圈功能。微博的微刊功能、之前的送礼物的功能ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">问题在于åQŒé”¦ä¸Šæ·»èŠ±ï¼Œæ·ÖM¸ŠåŽÈš„一定是一朵花åQŒè¯´å¾—俗一点,不能æ·ÖM¸ŠåŽÀL˜¯ä¸€å¨å±Žã€‚如果是后者,那么ž®±æœ‰ç‚¹ç”»è›‡æ·»­‘³äº†åQŒæˆ–者成了鸡肋功能ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">什么是一朵花åQŸå°±æ˜¯åŠŸèƒ½æ·»åŠ ä¸ŠåŽÖM»¥åŽï¼Œä¼šè®©ç”¨æˆ·çœ¼å‰ä¸€äº®ã€‚给人有“哇!åQï¼”的感è§?#8230;…</span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">遗憾的是淘宝搜烦之前的很多功能添上去的都不是一朵花åQŒä¸Š¾U¿äº†å¤ªå¤šçš„画蛇添­‘³çš„功能。这些功能一旦上¾U¿ï¼Œž®±å¾ˆéš¾ä¸‹¾Uѝ€‚因为当你äñ”品的用户¾Ÿ¤æœ‰ä¸Šäº¿çš„æ—¶å€™ï¼Œå†çƒ‚的一个功能,每天也会有几十万用户在ä‹É用。一旦你下线åQŒä¼šæœ‰å¾ˆå¤šäh很不爽ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">淘宝搜烦的同店购ž®±æœ‰ç‚¹è¿™ä¸ªå‘³é“。技术实现成本高åQŒä½“验一般,用的äºÞZ¹Ÿä¸å¤šã€‚有一ŒD‰|—¶é—´æˆ‘们把˜q™ä¸ªåŠŸèƒ½éšè—èµäh¥äº†ï¼Œæœ‰äh在微博上è¯ß_¼š</span></p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:13.5pt;font-family:宋体;color:#3E3E3E">妈的åQŒæˆ‘现在最惛_šçš„事情,ž®±æ˜¯æ‰¾æŠŠåˆ€æ€ä¸ªæ·˜å®æœç´¢çš„产品¾lç†æ¥è§£è§£æ¨åQŒæˆ‘å±…ç„¶æ­ÀL´»æ‰¾ä¸åˆ°æˆ‘最常用的同店购了!</span></strong></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">画蛇添èƒö的功能越多,让äñ”品背负的垃圾ž®Þp¶Šå¤šï¼Œé€ æˆå¥½çš„功能没有资源做,差的功能又无法下¾Uѝ€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">4 </span><span style="font-size:13.5pt;color:#3E3E3E">˜q½æ±‚人性化åQŒè€Œä¸æ˜¯è¿½æ±‚完¾ŸŽã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">很多产品¾lç†åQŒè¿½æ±‚完¾ŸŽã€‚这是作ä¸ÞZñ”品经理很好的品质åQŒç„¶è€Œï¼Œæœ‰ä¸€ç‚¹å´¾lå¸¸è¢«äñ”品经理忽视,产品的äh性化ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">永远没有完美的äñ”品,特别是当一个äñ”品的用户量到达上百万上千万的时候。用æˆïLš„喜好千差万别。如何让用户能喜‹Æ¢äñ”品的优点的同时能容忍产品的缺点?</span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">大家看选美大赛莯‚ƒœçš„美奻I¼Œ¾lå¸¸ä¼šæœ‰æ„Ÿå¹åQŒäؓ什么这么丑˜q˜èƒ½å¾—前三啊åQæ˜¯å› äؓ评委的口呛_¤ªç‰¹åˆ«åQŸå½“然有一部分评委原因åQŒä½†æ›´å¤šåŽŸå› åœ¨äºŽåQŒå¤§å®¶æ¯ä¸ªäh的审¾ŸŽè§‚不一栗÷€‚å¤§å®¶æ˜¯æŠŠé€‰ç¾Žå† å†›ä½œäØ“ä¸€ä¸ªå®Œ¾ŸŽçš„人来评判ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">实际上,无论选出谁是冠军åQŒéƒ½ä¼šæœ‰äºø™§‰å¾—难看。ä“Q何一个äñ”品,无论产品¾lç†æŽ¨å‡ºå¤šä¹ˆå¥½ç”¨çš„功能,都会有äh不喜‹Æ¢ï¼</span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">然而,大家对待周围的朋友,ž®×ƒ¸ä¼šç”¨é€‰ç¾Žçš„æ ‡å‡†è¦æ±‚他们,他们有明昄¡š„¾~ºç‚¹åQŒä½†ä¹Ÿæœ‰å¾ˆå¤šå€¼å¾—‹Æ£èµçš„地斏V€‚大家订阅鬼脚七的微信,¾lå¤§éƒ¨åˆ†äºÞZ¸ä¼šæœŸæœ›ï¼Œé¬ÆD„šä¸ƒæ¯å¤©çš„æ–‡ç« éƒ½ä¼š½W¦åˆè‡ªå·±çš„口呟뀂有äºÞZ¸çœ‹æ–‡ç« ï¼Œåªçœ‹çœ‹ã€?å“¥é—²è°ˆã€‘ä¹Ÿä¼šè§‰å¾—å¾ˆæœ‰æ„æ€ã€‚äØ“ä»€ä¹ˆï¼Ÿå› äØ“å¤§å®¶ä¸ä¼šæœŸå¾…é¬ÆD„šä¸ƒè¿™ä¸ªèÌŽåäh˜¯ä¸ªå®Œ¾ŸŽçš„账号åQŒæŠŠé¬ÆD„šä¸ƒä½œä¸ÞZ¸€ä¸ªæœ‹å‹åœ¨çœ‹å¾…。鬼脚七有缺点,也有优点ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">如果能让用户把我们的产品当成周围的朋友来看待呢?感觉会完全不一栗÷€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">淘宝有个做运营的同事有一天跟我感叹说åQšæˆ‘å¿½ç„¶è§‰å¾—æ”ÕdŸŽç‹®ä»¬¼›ÀLˆ‘好近åQŒæ¯ä¸ªæ”»åŸŽç‹®å†…心都住着个诗人!我问ä¸ÞZ»€ä¹ˆä¼šå¿½ç„¶æœ‰è¿™¿Uæ„Ÿè§‰ï¼Ÿå¥¹è¯´æœ‰ä¸€å¤©æ™šä¸Šï¼Œå‘现在淘宝内部一个TMS¾pȝ»Ÿçš„æ ‡é¢˜æ ä¸Šå¿½ç„¶å¤šäº†ä¸€å¥è¯åQ?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:13.5pt;font-family:宋体;color:#3E3E3E">每个人的压力åQŒå°‘部分来自生存åQŒå¤§éƒ¨åˆ†æ¥è‡ªæ”€æ¯”ã€?/span></strong></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">ž®Þp¿™ä¸€å¥è¯åQŒè®©ç”¨æˆ·æ„Ÿè§‰åˆîCº†äº§å“èƒŒåŽçš„那位工½E‹å¸ˆã€‚还记得微信有个版本的欢˜qŽé¡µé¢ä¸Šçš„æ–‡å­—吗åQ?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:13.5pt;font-family:宋体;color:#3E3E3E">ž®‘发微信åQŒå¤šå’Œæœ‹å‹è§è§é¢åQ?/span></strong></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">ž®Þp¿™ä¸€å¥è¯åQŒè®©æˆ‘感觉到产品背后的那¾Ÿ¤äh的心理活动。微信的一些小瑕疵åQŒæˆ‘也能容忍ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">ž®±æ˜¯˜q™å¥è¯ï¼Œæˆ‘å–œ‹Æ¢ä¸Šäº†å¾®ä¿¡ã€?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">人性化åQŒæ˜¯ä¸æ˜¯è®©äñ”品开始具有了灵魂åQ?/span></p> <p style="line-height:18.0pt;background:#F8F7F5"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">如何让äñ”品更加äh性化åQŸå¦‚何让淘宝搜烦更加人性化åQŸæ˜¯æˆ‘最˜q‘一直在思考的问题。我定义2013òq´æœç´¢çš„关键词:专业和有­‘£ã€‚希æœ?013òq´èƒ½è®©æ›´å¤šçš„人把淘宝搜烦当成一个朋友,而不是一个工兗÷€?/span></p> <p style="margin: 0cm 0cm 0.0001pt; line-height: 18pt; background-color: #f8f7f5; min-height: 1.5em; orphans: 2; widows: 2; background-position: initial initial; background-repeat: initial initial;"> </p> <p style="line-height:18.0pt;background:#F8F7F5"><span style="font-size:13.5pt;color:#3E3E3E">写了˜q™ä¹ˆå¤šï¼Œå›žå¤´çœ‹çœ‹æˆ‘è¿™½‹‡æ–‡ç« ï¼Œå¥½åƒæ²¡æœ‰ä»€ä¹ˆäñ”品设计方法,只是一些思考,仅此而已ã€?/span></p> <p> </p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:10.5pt;font-family:宋体;color:#3E3E3E">作者介¾lï¼š</span></strong></p> <p style="line-height:18.0pt;background:#F8F7F5"><strong><span style="font-size:10.5pt;font-family:宋体;color:#3E3E3E">鬯D„šä¸ƒï¼Œä¸€ä¸ªç®€å•的人,分äín电商资讯、搜索变化、淘宝动态、äñ”品设计、管理心得、生‹zÀL„Ÿæ‚(zh¨¨n)Ÿï¼›å¶å°”文艺åQŒå¶ž®”深沉。做一个有思想的ähåQå¾®ä¿¡èÌŽå?/span></strong><strong><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif"; color:#3E3E3E">: taobaoguijiaoqi </span></strong><strong><span style="font-size:10.5pt;font-family:宋体;color:#3E3E3E">åŠ äØ“å¥½å‹åŽå›žå¤?/span></strong><strong><span style="font-size:10.5pt;font-family:"Helvetica","sans-serif"; color:#3E3E3E"> m </span></strong><strong><span style="font-size:10.5pt; font-family:宋体;color:#3E3E3E">可以看到作者之前的所有文章ã€?/span></strong></p><img src ="http://www.aygfsteel.com/brock/aggbug/396844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-03-22 11:16 <a href="http://www.aygfsteel.com/brock/archive/2013/03/22/396844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet生命周期http://www.aygfsteel.com/brock/archive/2013/03/05/396076.htmlbrockbrockTue, 05 Mar 2013 06:09:00 GMThttp://www.aygfsteel.com/brock/archive/2013/03/05/396076.htmlhttp://www.aygfsteel.com/brock/comments/396076.htmlhttp://www.aygfsteel.com/brock/archive/2013/03/05/396076.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/396076.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/396076.html
http://sunnylocus.iteye.com/blog/342996
   å¤§å¤šæ•°ç¨‹åºå‘˜éƒ½çŸ¥é“Servlet的生命周期,½Ž€å•的概括˜q™å°±åˆ†äؓ四步åQšservlet¾cÕdŠ è½?-->实例åŒ?-->服务--->销毁。对˜q™ä¸ª˜q‡ç¨‹åªæ˜¯è‚¤æµ…了解下,对于servlet何时被销毁,˜q˜æ˜¯ä¸å¤ªæƒ…楚。下面我们描˜qîC¸€ä¸‹Tomcat与Servlet是如何工作的,首先看下面的时序å›?

1、Web Client 向Servlet容器åQˆTomcatåQ‰å‘出Httpè¯äh±‚

2、Servlet容器接收Web Client的请�/span>

3、Servlet容器创徏一个HttpRequest对象åQŒå°†Web Clientè¯äh±‚的信息封装到˜q™ä¸ªå¯¹è±¡ä¸?/span>

4、Servlet容器创徏一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的serviceæ–ÒŽ(gu¨©)³•åQŒæŠŠHttpRequest对象与HttpResponseå¯¹è±¡ä½œäØ“å‚æ•°

     ä¼ ç»™ HttpServlet对象

6、HttpServlet调用HttpRequest对象的有å…Ïx–¹æ³•,获取Httpè¯äh±‚信息

7、HttpServlet调用HttpResponse对象的有å…Ïx–¹æ³•,生成响应数据

8、Servlet容器把HttpServlet的响应结果传¾l™Web Client

 

对于Servlet容器(Tomcat)与HttpServlet是怎样˜q›è¡Œäº¤äº’的呢åQŒçœ‹ä¸‹ç±»å›?/p>

Servlet的框架是ç”׃¸¤ä¸ªJava包组成的åQšjavax.servlet与javax.servlet.http。在javax.servlet包中定义了所有的Servlet¾c»éƒ½å¿…须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的HttpServlet¾c…R€‚Servlet的框架的核心是javax.servlet.Servlet接口åQŒæ‰€æœ‰çš„Servlet都必™åÕd®žçŽ°è¿™ä¸ªæŽ¥å£ã€?/p>

在Servlet接口中定义了5个方法,

其中3个方法代表了Servlet的生命周期:

1、initæ–ÒŽ(gu¨©)³•åQšè´Ÿè´£åˆå§‹åŒ–Servlet对象ã€?/span>

2、serviceæ–ÒŽ(gu¨©)³•åQšè´Ÿè´£å“åº”客æˆïLš„è¯äh±‚ã€?/span>

3、destroyæ–ÒŽ(gu¨©)³•åQšå½“Servlet对象退出生命周期时åQŒè´Ÿè´£é‡Šæ”‘֍ ç”¨çš„资源ã€?/span>

 

一、创建Servlet对象的时�/strong>

1、Servlet容器启动æ—Óž¼šè¯Õd–web.xml配置文äšg中的信息åQŒæž„造指定的Servlet对象åQŒåˆ›å»ºServletConfig对象åQŒåŒæ—¶å°†ServletConfigå¯¹è±¡ä½œäØ“å‚æ•°æ¥è°ƒç”¨Servlet对象的initæ–ÒŽ(gu¨©)³•ã€?/p>

2、在Servlet容器启动后:客户首次向Servlet发出è¯äh±‚åQŒServlet容器会判断内存中是否存在指定的Servlet对象åQŒå¦‚果没有则创徏它,然后æ ÒŽ(gu¨©)®å®¢æˆ·çš„请求创建HttpRequestã€?nbsp;      HttpResponse对象åQŒä»Žè€Œè°ƒç”¨Servlet

     对象的serviceæ–ÒŽ(gu¨©)³•ã€?/p>

3、Servlet的类文äšg被更新后åQŒé‡æ–°åˆ›å»ºServlet

      Servlet容器在启动时自动创徏ServletåQŒè¿™æ˜¯ç”±åœ¨web.xmlæ–‡äšg䏭䨓Servlet讄¡½®çš?lt;load-on-startup>属性决å®?/p>

      的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的åŞ式存在ã€?/p>

二、销毁Servlet对象的时�/strong>

1ã€?span style="color: #ff0000;">Servlet容器停止或者重新启åŠ?/span>åQšServlet容器调用Servlet对象的destroyæ–ÒŽ(gu¨©)³•来释放资源。以上所讲的ž®±æ˜¯Servlet对象的生命周期。那么Servlet容器如何知道创徏哪一个Servlet对象åQ?/p>

Servlet对象如何配置åQŸå®žé™…上˜q™äº›ä¿¡æ¯æ˜¯é€šè¿‡è¯Õd–web.xml配置文äšg来实现的ã€?/p>

我们来看一下web.xmlæ–‡äšg中的Servlet对象的配¾|®èŠ‚ä¿¡æ¯

åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?/p>

<servlet>

    <servlet-name>action<servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <init-param>

        <param-name>config</param-name>

        <param-value>/WEB-INF/struts-config.xml</param-value>

    </init-param>

    <init-param>

        <param-name>detail</param-name>

        <param-value>2</param-value>

    </init-param>

    <init-param>

        <param-name>debug</param-name>

        <param-value>2</param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼

下面对上面的配置节信息进行解�/p>

servlet-nameåQšServlet对象的名¿U?/p>

servlet-classåQšåˆ›å»ºServlet对象所要调用的¾c?/p>

param-nameåQšå‚数名¿U?/p>

param-valueåQšå‚æ•°å€?/p>

load-on-startupåQšServlet容器启动时加载Servlet对象的顺åº?/p>

servlet-mapping/servlet-nameåQšè¦ä¸Žservlet中的servlet-name配置节内容对åº?/p>

url-patternåQšå®¢æˆ¯‚®¿é—®çš„Servlet的相对URL路径

 

       当Servlet容器启动的时候读å?lt;servlet>配置节信息,æ ÒŽ(gu¨©)®<servlet-class>配置节信息创建Servlet对象åQŒåŒæ—¶æ ¹æ?lt;init-param>配置节信息创建HttpServletConfig对象åQŒç„¶åŽæ‰§è¡ŒServlet对象的initæ–ÒŽ(gu¨©)³•åQŒåƈ且根æ?lt;load-on-startup>配置节信息来军_®šåˆ›å¾Servlet对象的顺序,如果此配¾|®èŠ‚ä¿¡æ¯ä¸ø™´Ÿæ•°æˆ–者没有配¾|®ï¼Œé‚£ä¹ˆåœ¨Servlet容器启动æ—Óž¼Œž®†ä¸åŠ è²æ­¤Servlet对象。当客户讉K—®Servlet容器æ—Óž¼ŒServlet容器æ ÒŽ(gu¨©)®å®¢æˆ·è®‰K—®çš„URL地址åQŒé€šè¿‡<servlet-mapping>配置节中çš?lt;url-pattern>配置节信息找到指定的Servlet对象åQŒåƈ调用此Servlet对象的serviceæ–ÒŽ(gu¨©)³•ã€?/p>

 

ä¸ÞZº†éªŒè¯ä¸‹ï¼Œæˆ‘æ–°å»ÞZº†ä¸€ä¸ªweb app工程åQŒæ–°å»ÞZ¸€ä¸ªServletåQŒå¦‚ä¸?

Java代码  æ”¶è—ä»£ç 
  1. package com.tdt.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class TestServlet extends HttpServlet {  
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.         this.doPost(request, response);  
  14.     }  
  15.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  16.             throws ServletException, IOException {  
  17.   
  18.         response.setContentType("text/html");  
  19.         PrintWriter out = response.getWriter();  
  20.         out.println("Hello,this is a test");  
  21.       
  22.         out.flush();  
  23.         out.close();  
  24.     }  
  25.   
  26.     public void destroy() {  
  27.         System.err.println(getServletName()+"生命周期¾l“束");;  
  28.     }  
  29.       
  30.     public void init() throws ServletException {  
  31.         System.out.println(getServletName()+"执行初始åŒ?);  
  32.     }  
  33. }  

 å½“servlet被销毁时会在控制åîC¸Šæ‰“印提示语句åQŒä¸˜q‡æˆ‘发现在tomcat中,只要不停止web容器åQŒservlet是不会被销毁的。有没有什么方法,当serviceæ–ÒŽ(gu¨©)³•执行完毕ž®±é”€æ¯è¿™ä¸ªservlet呢,我问了下老师åQŒä»–说写一个监听器åQŒä¸˜q‡æˆ‘不知道怎么åŽÕd®žçŽ°å®ƒåQŒå¦‚果有朋友知道实现的过½E‹ï¼Œ˜q˜è¯·èµæ•™ã€?/p>

]]>
【Spring】IOC核心源码学习åQˆäºŒåQ‰ï¼šå®¹å™¨åˆå§‹åŒ–过½E?/title><link>http://www.aygfsteel.com/brock/archive/2013/02/28/395832.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Thu, 28 Feb 2013 03:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/02/28/395832.html</guid><wfw:comment>http://www.aygfsteel.com/brock/comments/395832.html</wfw:comment><comments>http://www.aygfsteel.com/brock/archive/2013/02/28/395832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/brock/comments/commentRss/395832.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/brock/services/trackbacks/395832.html</trackback:ping><description><![CDATA[     摘要: http://singleant.iteye.com/blog/1177358 æŽ¥ä¸Šæ–?nbsp;啃啃老菜åQ?Spring IOC核心源码学习åQˆä¸€åQ?nbsp;åQŒæœ¬æ–‡å°†ä»?nbsp;ClassPathXmlApplicationContext ˜q™ä¸ªå®¹å™¨çš„实çŽîC½œä¸ºåŸº¼‹€åQŒå­¦ä¹ å®¹å™¨çš„初始化过½E‹ã€‚ClassPathXmlApplicationContext ¾cÖM½“¾pȝ»“构以下是&...  <a href='http://www.aygfsteel.com/brock/archive/2013/02/28/395832.html'>阅读全文</a><img src ="http://www.aygfsteel.com/brock/aggbug/395832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-02-28 11:04 <a href="http://www.aygfsteel.com/brock/archive/2013/02/28/395832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring IOC核心源码学习åQˆä¸€åQ?/title><link>http://www.aygfsteel.com/brock/archive/2013/02/28/395830.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Thu, 28 Feb 2013 02:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/02/28/395830.html</guid><wfw:comment>http://www.aygfsteel.com/brock/comments/395830.html</wfw:comment><comments>http://www.aygfsteel.com/brock/archive/2013/02/28/395830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/brock/comments/commentRss/395830.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/brock/services/trackbacks/395830.html</trackback:ping><description><![CDATA[<p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">本文主要ä»?span style="font-size: 11pt; font-family: 'Courier New';">spring ioc</span>容器基本代码骨架为切入点åQŒç†è§?span style="font-size: 11pt; font-family: 'Courier New';">ioc</span>容器的基本代码组件结构,各代码组件细节剖析将攑֜¨åŽé¢çš„学习文章里ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> <span style="font-family: verdana, 'courier new'; line-height: 21px;">http://www.iteye.com/topic/1113459</span></p><h1><span style="font-size: 11pt; font-family: 'Courier New';"><span style="font-size: large;">关于IOC容器</span></span></h1><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">IoC</span>容器åQšæœ€ä¸»è¦æ˜¯å®Œæˆäº†å®Œæˆå¯¹è±¡çš„åˆ›å»ºå’Œä¾èµ–çš„ç®¡ç†æ³¨å…¥ç­‰½{‰ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong>先从我们自己设计˜q™æ ·ä¸€ä¸ªè§†è§’来考虑åQ?/strong><strong></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">所谓控制反转,ž®±æ˜¯æŠŠåŽŸå…ˆæˆ‘ä»¬ä»£ç é‡Œé¢éœ€è¦å®žçŽ°çš„å¯¹è±¡åˆ›å¾ã€ä¾èµ–çš„ä»£ç åQŒåè½¬ç»™å®¹å™¨æ¥å¸®å¿™å®žçŽ°ã€‚é‚£ä¹ˆå¿…ç„¶çš„æˆ‘ä»¬éœ€è¦åˆ›å»ÞZ¸€ä¸ªå®¹å™¨ï¼ŒåŒæ—¶éœ€è¦ä¸€¿Uæ˜q°æ¥è®©å®¹å™¨çŸ¥é“需要创建的对象与对象的关系。这个描˜q°æœ€å…·ä½“表现ž®±æ˜¯æˆ‘们可配¾|®çš„æ–‡äšgã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>对象和对象关¾pÀL€Žä¹ˆè¡¨ç¤ºåQ?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>可以ç”?/em><em><span style="font-size: 11pt; font-family: 'Courier New';">xml</span></em><em>åQ?/em><em><span style="font-size: 11pt; font-family: 'Courier New';">properties</span></em><em>æ–‡äšg½{‰è¯­ä¹‰åŒ–配置文äšg表示ã€?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>描述对象关系的文件存攑֜¨å“ªé‡ŒåQ?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>可能æ˜?/em><em><span style="font-size: 11pt; font-family: 'Courier New';">classpath</span></em><em>åQ?/em><em><span style="font-size: 11pt; font-family: 'Courier New';">filesystem</span></em><em>åQŒæˆ–者是</em><em><span style="font-size: 11pt; font-family: 'Courier New';">URL</span></em><em>¾|‘络资源åQ?/em><em><span style="font-size: 11pt; font-family: 'Courier New';">servletContext</span></em><em>½{‰ã€?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">回到正题åQŒæœ‰äº†é…¾|®æ–‡ä»Óž¼Œ˜q˜éœ€è¦å¯¹é…ç½®æ–‡äšg解析ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>不同的配¾|®æ–‡ä»¶å¯¹å¯¹è±¡çš„æ˜qîC¸ä¸€æ øP¼Œå¦‚标准的åQŒè‡ªå®šä¹‰å£°æ˜Žå¼çš„åQŒå¦‚何统一åQ?/em><em> </em><em>在内部需要有一个统一的关于对象的定义åQŒæ‰€æœ‰å¤–部的描述都必™å»è{化成¾lŸä¸€çš„æ˜q°å®šä¹‰ã€?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><em>如何对不同的配置文äšg˜q›è¡Œè§£æžåQŸéœ€è¦å¯¹ä¸åŒçš„配¾|®æ–‡ä»¶è¯­æ³•,采用不同的解析器ã€?/em><em></em></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="color: #ff0000;"><strong>åŸÞZºŽä»¥ä¸Šé—®é¢˜åQŒå¯¹åº”过来,刚好æ˜?nbsp;</strong><strong><span style="font-size: 11pt; font-family: 'Courier New';">spring ioc</span> </strong><strong>容器抽象的的几个主要接口åQ?/strong></span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">Resource</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinition</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinitionReader</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">以上五个都是接口åQŒéƒ½æœ‰å„式各æ ïLš„实现åQŒæ­£æ˜¯è¿™<span style="font-size: 11pt; font-family: 'Courier New'; color: red;">5</span>个接口定义了<span style="font-size: 11pt; font-family: 'Courier New'; color: red;">spring ioc</span>容器的基本代码组件结构。而其¾l„äšg各种实现的组合关¾pȝ»„成了一个运行时的具体容器ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><h1><span style="font-size: 11pt; font-family: 'Courier New';"><strong><span style="font-size: large;">各代码组件详è§?/span></strong></span></h1><h1><strong><span style="font-size: 11pt; font-family: 'Courier New';">1.Resource</span></strong></h1><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">是对资源的抽象,每一个接口实现类都代表了一¿Uèµ„源类型,å¦?span style="font-size: 11pt; font-family: 'Courier New';">ClasspathResource</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">URLResource</span>åQ?span style="font-size: 11pt; font-family: 'Courier New';">FileSystemResource</span>½{‰ã€‚每一个资源类型都ž®è£…了对某一¿Uç‰¹å®šèµ„源的讉K—®½{–略。它æ˜?span style="font-size: 11pt; font-family: 'Courier New';">spring</span>资源讉K—®½{–略的一个基¼‹€å®žçްåQŒåº”用在很多场景ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> <br /><img alt="" src="http://dl.iteye.com/upload/attachment/536177/ead09fcb-3c6c-3740-9e36-6de33fd65cca.jpg" style="border: 0px;" /></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">具体可以参考文ç«?span style="font-size: 11pt; font-family: 'Courier New';">:</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">Spring </span>资源讉K—®å‰–析和策略模式应ç”?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';"><a style="color: #006699;">http://www.ibm.com/developerworks/cn/java/j-lo-spring-resource/index.html</a></span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong><span style="font-size: 11pt; font-family: 'Courier New';">2.BeanDefinition</span></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">用来抽象和描˜qîC¸€ä¸ªå…·ä½?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>对象。是描述一ä¸?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>对象的基本数据结构ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong><span style="font-size: 11pt; font-family: 'Courier New';">3.BeanDefinitionReader</span></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinitionReader</span>ž®†å¤–部资源对象描˜q°çš„<span style="font-size: 11pt; font-family: 'Courier New';">bean</span>定义¾lŸä¸€è½¬åŒ–为统一的内部数据结æž?span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinition</span>。对应不同的描述需要有不同çš?span style="font-size: 11pt; font-family: 'Courier New';">Reader</span>。如<span style="font-size: 11pt; font-family: 'Courier New';">XmlBeanDefinitionReader</span>用来è¯Õd–<span style="font-size: 11pt; font-family: 'Courier New';">xml</span>描述配置çš?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>对象ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';"><br /><img alt="" src="http://dl.iteye.com/upload/attachment/536179/c4143d16-02e2-3d7b-9734-4d19a9a984dd.jpg" style="border: 0px;" /><br /> </span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong><span style="font-size: 11pt; font-family: 'Courier New';">4.BeanFactory</span></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">用来定义一个很¾U¯çÑaçš?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>容器。它是一ä¸?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>容器的必备结构。同时和外部应用环境½{‰é𔼛…R€?span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinition</span>是它的基本数据结构。它¾l´æŠ¤ä¸€ä¸?span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinitions Map,</span>òq¶å¯æ ÒŽ(gu¨©)®<span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinition</span>的描˜q°è¿›è¡?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>的创建和½Ž¡ç†ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';"><br /><img alt="" src="http://dl.iteye.com/upload/attachment/536181/24095923-75cd-363b-bc2f-9fbc603c341f.jpg" style="border: 0px;" /><br /> </span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong><span style="font-size: 11pt; font-family: 'Courier New';">5.ApplicationContext</span></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">从名字来看叫应用上下文,是和应用环境息息相关的。没错这个就是我们åã^时开发中¾lå¸¸ç›´æŽ¥ä½¿ç”¨æ‰“交道的一个类åQŒåº”用上下文åQŒæˆ–者也叫做<span style="font-size: 11pt; font-family: 'Courier New';">spring</span>容器。其实它的基本实现是会持有一ä¸?span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span>对象åQŒåƈåŸÞZºŽæ­¤æä¾›ä¸€äº›åŒ…è£…å’ŒåŠŸèƒ½æ‰©å±•ã€‚äØ“ä»€ä¹ˆè¦˜q™ä¹ˆåšå‘¢åQŸå› ä¸?span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span>实现了一个容器基本结构和功能åQŒä½†æ˜¯ä¸Žå¤–部环境隔离。那么读取配¾|®æ–‡ä»Óž¼Œòq¶å°†é…ç½®æ–‡äšg解析æˆ?span style="font-size: 11pt; font-family: 'Courier New';">BeanDefinition</span>åQŒç„¶åŽæ³¨å†Œåˆ°<span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span>的这一个过½E‹çš„ž®è£…自然ž®±éœ€è¦?span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span>和应用环境细¾l†ç›¸å…»I¼Œå¸¸è§å®žçްæœ?span style="font-size: 11pt; font-family: 'Courier New';">ClasspathXmlApplicationContext,FileSystemXmlApplicationContext,WebApplicationContext</span>½{‰ã€?span style="font-size: 11pt; font-family: 'Courier New';">Classpath</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">xml</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">FileSystem</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">Web</span>½{‰è¯éƒ½ä»£è¡¨äº†åº”用和环境相关的一些意思,从字面上不难理解各自代表的含义ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">当然<span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span>å’?span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span>的区别远不止于此åQŒæœ‰åQ?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">1.<span style="font-family: 'Times New Roman';">  </span></span>资源讉K—®åŠŸèƒ½åQšåœ¨<span style="font-size: 11pt; font-family: 'Courier New';">Resource</span>å’?span style="font-size: 11pt; font-family: 'Courier New';">ResourceLoader</span>的基¼‹€ä¸Šå¯ä»¥çµ‹zȝš„讉K—®ä¸åŒçš„资源ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">2.<span style="font-family: 'Times New Roman';">  </span></span>支持不同的信息源ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">3.<span style="font-family: 'Times New Roman';">  </span></span>支持应用事äšgåQšç‘ô承了接口<span style="font-size: 11pt; font-family: 'Courier New';">ApplicationEventPublisher</span>åQŒè¿™æ ·åœ¨ä¸Šä¸‹æ–‡ä¸­ä¸?span style="font-size: 11pt; font-family: 'Courier New';">bean</span>之间提供了事件机制ã€?/p><p style="margin: 0cm 0cm 0pt 18pt; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">……</span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';"><br /><img alt="" src="http://dl.iteye.com/upload/attachment/536183/c456f949-7b9c-34db-ad1a-ca3141219b6d.jpg" style="border: 0px;" /><br /> </span></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">以上<span style="font-size: 11pt; font-family: 'Courier New';">5</span>个组件基本代表了<span style="font-size: 11pt; font-family: 'Courier New';">ioc</span>容器的一个最基本¾l„成åQŒè€Œç»„ä»¶çš„¾l„合是放åœ?span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span>的实现这一层来完成ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><strong><span style="color: #ff0000;">以ClasspathXmlApplicationContext 容器实现ä¸ÞZ¾‹åQŒå…¶¾l„合关系如下åQ?/span></strong></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><br /><img alt="" src="http://dl.iteye.com/upload/attachment/536932/ae2612a4-5840-3b00-a585-037a5a4980ac.jpg" style="border: 0px;" /></p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">ClassPathXmlApplicationContextçš„refresh() æ–ÒŽ(gu¨©)³•负责完成了整个容器的初始化ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">ä¸ÞZ»€ä¹ˆå«refreshåQŸä¹Ÿž®±æ˜¯è¯´å…¶å®žæ˜¯åˆäh–°çš„æ„æ€ï¼Œè¯¥IOC容器里面¾l´æŠ¤äº†ä¸€ä¸ªå•例的BeanFactoryåQŒå¦‚æžœbean的配¾|®æœ‰ä¿®æ”¹åQŒä¹Ÿå¯ä»¥ç›´æŽ¥è°ƒç”¨refreshæ–ÒŽ(gu¨©)³•åQŒå®ƒ?y¨­u)®†é”€æ¯ä¹‹å‰çš„BeanFactoryåQŒé‡æ–°åˆ›å»ÞZ¸€ä¸ªBeanFactory。所以叫refresh也是能理解的ã€?/p><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">以下是Refresh的基本步骤:<br /><strong>1.把配¾|®xmlæ–‡äšg转换成resource。resourceçš„è{换是先通过ResourcePatternResolver来解析可识别格式的配¾|®æ–‡ä»¶çš„路径<br />(å¦?classpath*:"½{?åQŒå¦‚果没有指定格式,默认会按照类路径的资源来处理ã€?nbsp;<br />2.利用XmlBeanDefinitionReader完成对xml的解析,ž®†xml Resource里定义的bean对象转换成统一的BeanDefinitionã€?br />3.ž®†BeanDefinition注册到BeanFactoryåQŒå®Œæˆå¯¹BeanFactory的初始化。BeanFactory里将会维护一个BeanDefinitionçš„Mapã€?br /></strong><br />当getBean的时候就会根据调用BeanFactoryåQŒæ ¹æ®beançš„BeanDifinition来实例化一个bean。当然根据beançš„lazy-init、protetype½{‰å±žæ€§è®¾¾|®ä¸åŒä»¥ä¸Šè¿‡½E‹ç•¥æœ‰å·®åˆ«ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> </p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;">refresh()代码如下åQ?/p><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #efefef; width: 766.2847290039063px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.19097328186035px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=%09public%20void%20refresh()%20throws%20BeansException%2C%20IllegalStateException%20%7B%0A%09%09synchronized%20(this.startupShutdownMonitor)%20%7B%0A%09%09%09%2F%2F%20Prepare%20this%20context%20for%20refreshing.%0A%09%09%09prepareRefresh()%3B%0A%0A%09%09%09%2F%2F%20Tell%20the%20subclass%20to%20refresh%20the%20internal%20bean%20factory.%0A%09%09%09ConfigurableListableBeanFactory%20beanFactory%20%3D%20obtainFreshBeanFactory()%3B%0A%0A%09%09%09%2F%2F%20Prepare%20the%20bean%20factory%20for%20use%20in%20this%20context.%0A%09%09%09prepareBeanFactory(beanFactory)%3B%0A%0A%09%09%09try%20%7B%0A%09%09%09%09%2F%2F%20Allows%20post-processing%20of%20the%20bean%20factory%20in%20context%20subclasses.%0A%09%09%09%09postProcessBeanFactory(beanFactory)%3B%0A%0A%09%09%09%09%2F%2F%20Invoke%20factory%20processors%20registered%20as%20beans%20in%20the%20context.%0A%09%09%09%09invokeBeanFactoryPostProcessors(beanFactory)%3B%0A%0A%09%09%09%09%2F%2F%20Register%20bean%20processors%20that%20intercept%20bean%20creation.%0A%09%09%09%09registerBeanPostProcessors(beanFactory)%3B%0A%0A%09%09%09%09%2F%2F%20Initialize%20message%20source%20for%20this%20context.%0A%09%09%09%09initMessageSource()%3B%0A%0A%09%09%09%09%2F%2F%20Initialize%20event%20multicaster%20for%20this%20context.%0A%09%09%09%09initApplicationEventMulticaster()%3B%0A%0A%09%09%09%09%2F%2F%20Initialize%20other%20special%20beans%20in%20specific%20context%20subclasses.%0A%09%09%09%09onRefresh()%3B%0A%0A%09%09%09%09%2F%2F%20Check%20for%20listener%20beans%20and%20register%20them.%0A%09%09%09%09registerListeners()%3B%0A%0A%09%09%09%09%2F%2F%20Instantiate%20all%20remaining%20(non-lazy-init)%20singletons.%0A%09%09%09%09finishBeanFactoryInitialization(beanFactory)%3B%0A%0A%09%09%09%09%2F%2F%20Last%20step%3A%20publish%20corresponding%20event.%0A%09%09%09%09finishRefresh()%3B%0A%09%09%09%7D%0A%0A%09%09%09catch%20(BeansException%20ex)%20%7B%0A%09%09%09%09%2F%2F%20Destroy%20already%20created%20singletons%20to%20avoid%20dangling%20resources.%0A%09%09%09%09beanFactory.destroySingletons()%3B%0A%0A%09%09%09%09%2F%2F%20Reset%20'active'%20flag.%0A%09%09%09%09cancelRefresh(ex)%3B%0A%0A%09%09%09%09%2F%2F%20Propagate%20exception%20to%20caller.%0A%09%09%09%09throw%20ex%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #006699;"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">void</span> refresh() <span style="color: #7f0055;">throws</span> BeansException, IllegalStateException {  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">synchronized</span> (<span style="color: #7f0055;">this</span>.startupShutdownMonitor) {  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">// Prepare this context for refreshing.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        prepareRefresh();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">// Tell the subclass to refresh the internal bean factory.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">// Prepare the bean factory for use in this context.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        prepareBeanFactory(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">try</span> {  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Allows post-processing of the bean factory in context subclasses.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            postProcessBeanFactory(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Invoke factory processors registered as beans in the context.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            invokeBeanFactoryPostProcessors(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Register bean processors that intercept bean creation.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            registerBeanPostProcessors(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Initialize message source for this context.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            initMessageSource();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Initialize event multicaster for this context.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            initApplicationEventMulticaster();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Initialize other special beans in specific context subclasses.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            onRefresh();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Check for listener beans and register them.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            registerListeners();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Instantiate all remaining (non-lazy-init) singletons.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            finishBeanFactoryInitialization(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Last step: publish corresponding event.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            finishRefresh();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        }  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">catch</span> (BeansException ex) {  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Destroy already created singletons to avoid dangling resources.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            beanFactory.destroySingletons();  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Reset 'active' flag.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            cancelRefresh(ex);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="width: auto; border-width: 0px;">// Propagate exception to caller.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">            <span style="color: #7f0055;">throw</span> ex;  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        }  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> ä»¥ä¸Šçš„obtainFreshBeanFactory是很关键的一个方法,里面会调用loadBeanDefinitionæ–ÒŽ(gu¨©)³•åQŒå¦‚下:</p><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #efefef; width: 766.2847290039063px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.19097328186035px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=%09protected%20void%20loadBeanDefinitions(DefaultListableBeanFactory%20beanFactory)%20throws%20IOException%20%7B%0A%09%09%2F%2F%20Create%20a%20new%20XmlBeanDefinitionReader%20for%20the%20given%20BeanFactory.%0A%09%09XmlBeanDefinitionReader%20beanDefinitionReader%20%3D%20new%20XmlBeanDefinitionReader(beanFactory)%3B%0A%0A%09%09%2F%2F%20Configure%20the%20bean%20definition%20reader%20with%20this%20context's%0A%09%09%2F%2F%20resource%20loading%20environment.%0A%09%09beanDefinitionReader.setResourceLoader(this)%3B%0A%09%09beanDefinitionReader.setEntityResolver(new%20ResourceEntityResolver(this))%3B%0A%0A%09%09%2F%2F%20Allow%20a%20subclass%20to%20provide%20custom%20initialization%20of%20the%20reader%2C%0A%09%09%2F%2F%20then%20proceed%20with%20actually%20loading%20the%20bean%20definitions.%0A%09%09initBeanDefinitionReader(beanDefinitionReader)%3B%0A%09%09loadBeanDefinitions(beanDefinitionReader)%3B%0A%09%7D" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #006699;"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">protected</span> <span style="color: #7f0055;">void</span> loadBeanDefinitions(DefaultListableBeanFactory beanFactory) <span style="color: #7f0055;">throws</span> IOException {  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">// Create a new XmlBeanDefinitionReader for the given BeanFactory.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    XmlBeanDefinitionReader beanDefinitionReader = <span style="color: #7f0055;">new</span> XmlBeanDefinitionReader(beanFactory);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">// Configure the bean definition reader with this context's</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">// resource loading environment.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    beanDefinitionReader.setResourceLoader(<span style="color: #7f0055;">this</span>);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    beanDefinitionReader.setEntityResolver(<span style="color: #7f0055;">new</span> ResourceEntityResolver(<span style="color: #7f0055;">this</span>));  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">// Allow a subclass to provide custom initialization of the reader,</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">// then proceed with actually loading the bean definitions.</span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    initBeanDefinitionReader(beanDefinitionReader);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    loadBeanDefinitions(beanDefinitionReader);  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> LoadBeanDifinitionæ–ÒŽ(gu¨©)³•很关键,˜q™é‡Œç‰¹å®šäºŽæ•´ä¸ªIOC容器åQŒå®žä¾‹åŒ–了一个XmlBeanDefinitionReader来解析Resourceæ–‡äšg。关于Resourceæ–‡äšg如何初始化和xmlæ–‡äšg如何解析都在</p><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #efefef; width: 766.2847290039063px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.19097328186035px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=loadBeanDefinitions(beanDefinitionReader)%3B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #006699;"><img src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">loadBeanDefinitions(beanDefinitionReader);  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"> é‡Œé¢çš„层层调用完成,˜q™é‡Œä¸åœ¨ç´¯è¿°ã€?/p><h1>ž®ç»“ </h1><p style=" padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">Spring</span>的扩展性是毋庸¾|®ç–‘的,学习<span style="font-size: 11pt; font-family: 'Courier New';">spring</span>的设计是一个很好的实践理论¾l“åˆã€‚ä¸»è¦ä¸ªäºø™§‰å¾—有几点åQ?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">1.<span style="font-family: 'Times New Roman';">  </span></span>框架™å¶å±‚的设计有着很好的抽象,遵åó@面向接口¾~–程的规范ã€?span style="font-size: 11pt; font-family: 'Courier New';">Resource</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">BeanFactory</span>ã€?span style="font-size: 11pt; font-family: 'Courier New';">ApplicationContext</span>都是非常好的接口抽象åQŒéžå¸¸æ˜Ž¼‹®çš„定义了该¾l„äšg的一些功能ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">2.<span style="font-family: 'Times New Roman';">  </span></span>利用¾l„合模式ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">3.<span style="font-family: 'Times New Roman';">  </span></span>个组件的实现里大量ä‹É用了模板æ–ÒŽ(gu¨©)³•模式åQŒæå‡äº†åŒä¸€¾l„äšg代码的复用性ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">4.<span style="font-family: 'Times New Roman';">  </span></span>各种设计保留了扩展的接口åQŒå¾ˆå¤šåŸºäº?span style="font-size: 11pt; font-family: 'Courier New';">spring</span>的框枉™ƒ½å¯ä»¥å¾ˆå®¹æ˜“的介入实现了自å·Þqš„一些扩展ã€?/p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14.44444465637207px; line-height: 25.19097328186035px; background-color: #efefef;"><span style="font-size: 11pt; font-family: 'Courier New';">5.<span style="font-family: 'Times New Roman';">  </span></span>框架里采用里很多¾lå…¸çš„设计模式,如代理、装饰、策略等½{‰ã€?br /><br /></p><img src ="http://www.aygfsteel.com/brock/aggbug/395830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-02-28 10:46 <a href="http://www.aygfsteel.com/brock/archive/2013/02/28/395830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jvm 调优http://www.aygfsteel.com/brock/archive/2013/02/27/395796.htmlbrockbrockWed, 27 Feb 2013 06:25:00 GMThttp://www.aygfsteel.com/brock/archive/2013/02/27/395796.htmlhttp://www.aygfsteel.com/brock/comments/395796.htmlhttp://www.aygfsteel.com/brock/archive/2013/02/27/395796.html#Feedback0http://www.aygfsteel.com/brock/comments/commentRss/395796.htmlhttp://www.aygfsteel.com/brock/services/trackbacks/395796.html先来看下一Xå®?/span>¾lå…¸é…ç½®åQ?/span>

 

/opt/taobao/java/bin/java -Dprogram.name=run.sh –server

 -Xms4g           //指定 jvm 的最ž®?/span> heap 大小 åQ?Xms默认是物理内存的1/4)

 -Xmx4g           //指定 jvm 的最å¤?/span> heap 大小

 -Xmn2g

 -Xss1m

 -XX:PermSize=96m

 -XX:MaxPermSize=256m

 -XX:SurvivorRatio=10

 -XX:+HeapDumpOnOutOfMemoryError    //

 -XX:HeapDumpPath=/home/admin/logs/java.hprof -verbose:gc -Xloggc:/home/admin/logs/gc.log

 -XX:+PrintGCDetails

 -XX:+PrintGCDateStamps

 -XX:+UseConcMarkSweepGC

 -XX:+UseCMSCompactAtFullCollection

 -XX:CMSInitiatingOccupancyFraction=80

 -XX:+UseCompressedOops

 -XX:+DisableExplicitGC

 -Djava.awt.headless=true

 -Dsun.net.client.defaultConnectTimeout=10000

 -Dsun.net.client.defaultReadTimeout=30000

 -Djava.net.preferIPv4Stack=true

 -Djava.endorsed.dirs=/opt/taobao/jboss/lib/endorsed

 -classpath /opt/taobao/jboss/bin/run.jar:/opt/taobao/java/lib/tools.jar org.jboss.Main -b 0.0.0.0 -Djboss.server.home.dir=/home/admin/purdecision/.default -Djboss.server.home.url=file:/home/admin/purdecision/.default

 

 

˜q™äºŒòq´æ¥˜q™ä¸€å †ä¸œè¥¿æˆ‘从来没有怀疑过åQ?#8220;¾lå¯¹æ­£ç¡®å®Œç¾Ž”åQŒæ®è¯´æ˜¯X宝的标配。以至于从来没有åŽÕdˆ†æžäº†è§£è¿‡åQˆä¸€çŸ¥åŠè§£ï¼‰åQŒå¯èƒ½çœŸçš„æ˜¯æƒ°æ€§ä‹Éç„Óž¼Œä¹Ÿå¯èƒ?#8220;å¿?#8221;吧。无意中看到有äh在博客里写到 “温故知新”åQŒå°±åƒæœ‰äºø™¯´è¯?/span>think in java一æ äh¯ä¸€å›žéƒ½æœ‰æ–°çš„å‘çŽ°ã€‚ä¸‹é¢å°±åˆ†æžä¸€ä¸‹äØ“ä»€ä¹ˆè¦è®„¡½®˜q™äº›å‚æ•°åQŒæœ‰ä½•意义ã€?/span>

 

 

上面参数说明åQ?/span>

-Xmx4g :

 æŒ‡å®š jvm 的最å¤?/span> heap 大小åQŒé»˜è®¤å€égؓ物理内存çš?/span>1/4åQŒæœ€ä½Œ™®¾å€¼åº”该视物理内存大小及计½Ž—机内其他内存开销而定

 

-Xms4g :

 æŒ‡å®š jvm 的最ž®?/span> heap å¤§å°ã€‚äº›å€ÆD®¾¾|®ä¸Ž-Xmx相同åQŒä»¥é¿å…æ¯æ¬¡åžƒåœ¾å›žæ”¶å®Œæˆå?/span>JVM重新分配内存

 

-Xmn2g :

讄¡½®òq´è½»ä»£å¤§ž®äØ“2G。整个堆大小=òq´è½»ä»£å¤§ž®?/span> + òq´è€ä»£å¤§å° + 持久代大ž®ã€‚持久代一èˆ?/span>

固定大小ä¸?/span>64måQŒæ‰€ä»¥å¢žå¤§å¹´è½ÖM»£åŽï¼Œž®†ä¼šå‡å°òq´è€ä»£å¤§å°ã€?span style="color:red">此值对¾pȝ»Ÿæ€§èƒ½å½±å“è¾ƒå¤§åQ?/span>Sun官方æŽ?/span>

荐配¾|®äؓ整个堆的3/8ã€?/span>(按此说应讄¡½®ä¸?/span>1.5G)

-Xss1m

每个¾U¿ç¨‹å †æ ˆå¤§å°ä¸?/span>1M. æ ÒŽ(gu¨©)®åº”用的线½E‹æ‰€éœ€å†…存大小˜q›è¡Œè°ƒæ•´ã€‚在相同物理内存ä¸?/span>,减小˜q™ä¸ªå€ÆDƒ½ç”Ÿæˆæ›´å¤šçš„线½E‹ã€‚(本机ç”׃ºŽforest的原å›?/span>-Xss2måQŒåŽŸå›?/span>1åQšç‰©ç†å†…存过ž®?/span> 2åQ?/span>window¾U¿ç¨‹ä¸èƒ½å¤ªå¤š 猜的åQ?/span>

 

-XX:PermSize=96m

用于存放静态文ä»Óž¼Œå¦‚今Java¾c…R€æ–¹æ³•等。持久代对垃圑֛žæ”¶æ²¡æœ‰æ˜¾è‘—媄响,但是有些应用可能动态生成或

者调用一äº?/span>classåQŒä¾‹å¦?/span>Hibernate½{‰ï¼Œåœ¨è¿™¿Uæ—¶å€™éœ€è¦è®¾¾|®ä¸€ä¸ªæ¯”较大的持久代½Iºé—´æ¥å­˜æ”¾è¿™äº›è¿è¡Œè¿‡½E‹ä¸­æ–?/span>

增的¾c…R€‚持久代大小通过-XX:MaxPermSize=<N>˜q›è¡Œè®„¡½®

-XX:PermSize=64MB
最ž®å°ºå¯¸ï¼Œåˆå§‹åˆ†é…
-XX:MaxPermSize=256MB
最大允许分配尺寸,按需分配
˜q‡å°ä¼šå¯¼è‡ß_¼šjava.lang.OutOfMemoryError: PermGen space

MaxPermSize
¾~ºçœå€¼å’Œ-server -client选项相关ã€?/span>
-server
选项下默�/span>MaxPermSize�/span>64m
-client
选项下默�/span>MaxPermSize�/span>32m

 

åQˆäؓ什么不æ˜?/span>64M 可能æ˜?/span>webx讄¡½®çš„æŒä¹…代½Iºé—´æ¯”较多)

 

 

-XX:SurvivorRatio=10

åQ?/span>SurvivorRatio=4讄¡½®òq´è½»ä»£ä¸­EdenåŒÞZ¸ŽSurvivor区的大小比倹{€‚设¾|®äØ“4åQŒåˆ™ä¸¤ä¸ªSurvivor

åŒÞZ¸Žä¸€ä¸?/span>Eden区的比å€égØ“2:4åQŒä¸€ä¸?/span>Survivor区占整个òq´è½»ä»£çš„1/6åQ?/span>

˜q™é‡Œè®„¡½®ä¸?/span>10也就是说一ä¸?/span>Survivor区占整个òq´è½»ä»£çš„1/12åQŒè¿™ä¸ªå‚数是否能ž®ä¸€ç‚¹ï¼Œæ¯•竟我们的应用中没有创徏很大的对像ã€?/span>

 

 

˜q™ä¸ªå€ÆD®¾äº†æœ‰ä»€ä¹ˆç”¨åQ?/span>

上面配置ä¸?/span>-Xmn2g òq´è½»ä»£å¤§ž®ï¼ŒSurvivorRatioä¸?/span>10æ—?/span> åQ?/span>Eden­‘…过1.66G时触å?/span>minor gc(young generation)

我的应用gc 日志一直在young gc ž®±æ˜¯å¦‚æ­¤åQŒçœ‹æ¥æˆ‘的应ç”?/span> edenåŒø™¿˜æ˜¯è®¾çš„很大的ã€?/span>

 


 -XX:+HeapDumpOnOutOfMemoryError

参数表示å½?/span>JVM发生OOMæ—Óž¼Œè‡ªåŠ¨ç”ŸæˆDUMPæ–‡äšgã€?/span> 

 

-XX:HeapDumpPath=${目录}参数表示生成DUMPæ–‡äšgçš„èµ\径,也可以指定文件名¿UŽÍ¼Œä¾‹å¦‚åQ?/span>-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文äšg名,默认为:java_<pid>_<date>_<time>_heapDump.hprofã€?/span>

 

-XX:+PrintGCDetailsåQ?/span>

输出形式åQ?/span>[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured:

112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

 

-XX:+PrintGCTimeStamps -XX:+PrintGCåQ?/span>PrintGCTimeStamps可与上面两个混合使用

输出形式åQ?/span>11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

 

 

-XX:+UseConcMarkSweepGC  

讄¡½®òq¶å‘攉™›†å™?/span>

 

可以保证大部分工作都òq¶å‘˜q›è¡ŒåQˆåº”用不停止åQ‰ï¼Œåžƒåœ¾å›žæ”¶åªæš‚停很ž®‘的旉™—´åQŒæ­¤æ”‰™›†å™¨é€‚合对响应时间要æ±?/span>

比较高的中、大规模应用。ä‹Éç”?/span>-XX:+UseConcMarkSweepGC打开ã€?/span>

òq¶å‘攉™›†å™¨ä¸»è¦å‡ž®‘年老代的暂停时é—ß_¼Œä»–在应用不停止的情况下ä‹É用独立的垃圾回收¾U¿ç¨‹åQŒè·Ÿítªå¯è¾‘Ö¯¹

象。在每个òq´è€ä»£åžƒåœ¾å›žæ”¶å‘¨æœŸä¸­ï¼Œåœ¨æ”¶é›†åˆæœŸåƈ发收集器 会对整个应用˜q›è¡Œ½Ž€çŸ­çš„æš‚停åQŒåœ¨æ”‰™›†ä¸­è¿˜ä¼šå†æš?/span>

停一‹Æ¡ã€‚第二次暂停会比½W¬ä¸€‹Æ¡ç¨é•¿ï¼Œåœ¨æ­¤˜q‡ç¨‹ä¸­å¤šä¸ªçº¿½E‹åŒæ—¶è¿›è¡Œåžƒåœ‘Ö›žæ”¶å·¥ä½œã€?/span>

 

CMS采用的基¼‹€½Ž—法是:标记—清除 所æœ?/span>CMS不会整理、压¾~©å †½Iºé—´ã€‚这样就会有一个问题:¾lè¿‡CMS攉™›†çš„堆会äñ”生空间碎ç‰?/span>

 

 

-XX:CMSInitiatingOccupancyFraction=80

 

启动òq¶å‘攉™›†å™¨ï¼šå› äØ“òq¶å‘攉™›†åœ¨åº”用运行时˜q›è¡Œæ”‰™›†åQŒæ‰€ä»¥å¿…™åÖM¿è¯æ”¶é›†å®Œæˆä¹‹å‰æœ‰­‘›_¤Ÿçš„内存空间供½E?/span>

序ä‹É用,否则会出çŽ?#8220;Concurrent Mode Failure”。通过讄¡½®-XX:CMSInitiatingOccupancyFraction=<N>

指定˜q˜æœ‰å¤šå°‘å‰©ä½™å †æ—¶å¼€å§‹æ‰§è¡ŒåÆˆå‘æ”¶é›?/span>

 

-XX:+UseCMSCompactAtFullCollectionåQ?/span>

打开对年老代的压¾~©ã€‚可能会影响性能åQŒä½†æ˜¯å¯ä»¥æ¶ˆé™¤ç¢Žç‰?/span>

 

XX:+UseCompressedOops

通常64ä½?/span>JVM消耗的内存会比32位的å¤?/span>1.5倍,˜q™æ˜¯å› äؓ对象指针åœ?/span>64位架构下åQŒé•¿åº¦ä¼š¾˜Õd€ï¼ˆæ›´å®½çš„寻址åQ‰ã€?/span>
对于那些ž®†è¦ä»?/span>32位åã^台移植到64位的应用来说åQŒåã^白无辜多äº?/span>1/2的内存占用,˜q™æ˜¯å¼€å‘者不愿意看到的ã€?/span>
òq¸è¿çš„æ˜¯åQŒä»ŽJDK 1.6 update14开始,64 bit JVM正式支持äº?/span> -XX:+UseCompressedOops ˜q™ä¸ªå¯ä»¥åŽ‹ç¾ƒæŒ‡é’ˆåQŒè“v到节¾U¦å†…存占用的新参æ•?/span>

 

-XX:-DisableExplicitGC

ž®†ä¼šå¿½ç•¥æ‰‹åŠ¨è°ƒç”¨GC的代码,如:System.gc()åQŒå°†-DisableExplicitGCåQ?/span> æ”ÒŽ(gu¨©)ˆ+DisableExplicitGCå³äØ“å¯ç”¨åQŒé»˜è®¤äؓ启用åQŒä»€ä¹ˆä¹Ÿä¸å†™åQŒé»˜è®¤æ˜¯åŠ å·åQŒä½†æ˜¯ç³»¾lŸå†…部默认的òq¶ä¸æ˜¯ä»€ä¹ˆéƒ½å¯ç”¨

 

 

è‡Ïx­¤ä¸ÞZ»€ä¹?/span>Xmxä¸?/span>xms ä¸€æ øP¼Œä¸ÞZ»€ä¹ˆç”¨CMSåQˆåƈ发收集器åQ‰ï¼Œä¸ÞZ»€ä¹ˆç”¨äº?/span>cms 要ä‹Éç”?/span>-XX:+UseCMSCompactAtFullCollectionåQŒäؓ什么用XX:+UseCompressedOops½{‰ç­‰åQŒç›¸ä¿¡å¤§å®¶å’Œæˆ‘一æ ähœ‰æ‰€äº†è§£ã€‚不˜q‡å¯¹äºŽæœ‰äº›è¿˜æ˜¯ä¸æ¸…楚理解有误åQŒå¯èƒ½è¿˜è¦æ¥æ¥å›žå›žæ£è…¾ï¼Œä¸èƒö之处请大家补充ã€?/span>

 

 



]]>
Java 静态代理和动态代ç?/title><link>http://www.aygfsteel.com/brock/archive/2013/02/21/395513.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Thu, 21 Feb 2013 04:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/02/21/395513.html</guid><description><![CDATA[<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">1. 代理模式主要有两¿Uï¼šé™æ€ä»£ç†å’ŒåŠ¨æ€ä»£ç?nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">2. 静态代理: </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">比如要在输出“HelloWorld”前打åîC¸€ä¸ªå­—½W¦ä¸²“Welcome” </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">A:先定义一个接口类 </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%0A%20%20%20%0Apublic%20interface%20HelloWorld%20%7B%20%20%20%20%0A%20%20%20%20public%20void%20print()%3B%20%20%20%20%0A%2F%2F%20%20public%20void%20say()%3B%20%20%20%20%0A%7D%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">interface</span> HelloWorld {      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> <span style="color: #7f0055;">void</span> print();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//  public void say();    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}   </li></ol></div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">   </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">B: 定义一个该接口的实现类 </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">java 代码 </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%0A%20%20%20%0Apublic%20class%20HelloWorldImpl%20implements%20HelloWorld%7B%20%20%20%20%0A%20%20%20%0A%20%20%20%20public%20void%20print()%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20System.out.println(%22HelloWorld%22)%3B%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%0A%2F%2F%20%20public%20void%20say()%7B%20%20%20%20%0A%2F%2F%20%20%20%20%20%20System.out.println(%22Say%20Hello!%22)%3B%20%20%20%20%0A%2F%2F%20%20%7D%20%20%20%20%0A%7D%20%20%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> HelloWorldImpl <span style="color: #7f0055;">implements</span> HelloWorld{      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> <span style="color: #7f0055;">void</span> print(){      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        System.out.println("HelloWorld");      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//  public void say(){    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//      System.out.println("Say Hello!");    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//  }    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}      </li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">C:定义一个静态代理类 </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%0A%20%20%20%0Apublic%20class%20StaticProxy%20implements%20HelloWorld%7B%20%20%20%20%0A%20%20%20%0A%20%20%20%20public%20HelloWorld%20helloWorld%20%3B%20%20%20%20%0A%20%20%20%20public%20StaticProxy(HelloWorld%20helloWorld)%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20this.helloWorld%20%3D%20helloWorld%3B%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20public%20void%20print()%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20System.out.println(%22Welcome%22)%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F%2F%E7%9B%B8%E5%BD%93%E4%BA%8E%E5%9B%9E%E8%B0%83%20%20%20%20%0A%20%20%20%20%20%20%20%20helloWorld.print()%3B%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%0A%20%20%20%20%20%20%20%20%0A%2F%2F%20%20public%20void%20say()%7B%20%20%20%20%0A%2F%2F%20%20%20%20%20%20%2F%2F%E7%9B%B8%E5%BD%93%E4%BA%8E%E5%9B%9E%E8%B0%83%20%20%20%20%0A%2F%2F%20%20%20%20%20%20helloWorld.say()%3B%20%20%20%20%0A%2F%2F%20%20%7D%20%20%20%20%0A%7D%20%20%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> StaticProxy <span style="color: #7f0055;">implements</span> HelloWorld{      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> HelloWorld helloWorld ;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> StaticProxy(HelloWorld helloWorld){      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">this</span>.helloWorld = helloWorld;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> <span style="color: #7f0055;">void</span> print(){      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        System.out.println("Welcome");      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">//相当于回è°?nbsp;   </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        helloWorld.print();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//  public void say(){    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//      //相当于回è°?nbsp;   </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//      helloWorld.say();    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//  }    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}      </li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">D: 一个测试类: </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%0A%20%20%20%0Apublic%20class%20TestStaticProxy%20%7B%20%20%20%20%0A%20%20%20%0A%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%7B%20%20%20%20%0A%20%20%20%20%20%20%20%20HelloWorld%20helloWorld%20%3D%20new%20HelloWorldImpl()%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20StaticProxy%20staticProxy%20%3D%20new%20StaticProxy(helloWorld)%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20staticProxy.print()%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%2F%2F%20%20%20%20%20%20staticProxy.say()%3B%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%0A%7D%20%20%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> TestStaticProxy {      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">     </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> <span style="color: #7f0055;">static</span> <span style="color: #7f0055;">void</span> main(String[] args){      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        HelloWorld helloWorld = <span style="color: #7f0055;">new</span> HelloWorldImpl();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        StaticProxy staticProxy = <span style="color: #7f0055;">new</span> StaticProxy(helloWorld);      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        staticProxy.print();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">              </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//      staticProxy.say();    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}      </li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给åŽÀLމåQ‰ï¼Œæ‰€æœ‰çš„实现¾cÕd’Œä»£ç†¾c»é‡Œéƒ½éœ€è¦åšä¸ªå®žçŽ°ã€‚è¿™ž®±å¢žåŠ äº†ä»£ç çš„å¤æ‚åº¦ã€‚åŠ¨æ€ä»£ç†å°±å¯ä»¥é¿å…˜q™ä¸ª¾~ºç‚¹ã€?nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">3 。动态代ç?nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被è{¿UÕdˆ°ä¸€ä¸ªé›†ä¸­çš„æ–ÒŽ(gu¨©)³•中处理(invokeåQ‰ï¼Œ˜q™æ ·åQŒåœ¨æŽ¥å£æ–ÒŽ(gu¨©)³•数量比较多的时候,我们可以˜q›è¡Œç‰|´»å¤„理åQŒè€Œä¸éœ€è¦åƒé™æ€ä»£ç†é‚£æ äh¯ä¸€ä¸ªæ–¹æ³•进行中转ã€?nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">动态代理类只能代理接口åQŒä»£ç†ç±»éƒ½éœ€è¦å®žçްInvocationHandler¾c»ï¼Œå®žçްinvokeæ–ÒŽ(gu¨©)³•。该invokeæ–ÒŽ(gu¨©)³•ž®±æ˜¯è°ƒç”¨è¢«ä»£ç†æŽ¥å£çš„æ‰€æœ‰æ–¹æ³•时需要调用的åQŒè¯¥invokeæ–ÒŽ(gu¨©)³•˜q”回的值是被代理接口的一个实现类 </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">代理¾c»ï¼š </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%0Aimport%20java.lang.reflect.InvocationHandler%3B%20%20%20%20%20%20%20%20%0Aimport%20java.lang.reflect.Method%3B%20%20%20%20%20%20%20%20%0Aimport%20java.lang.reflect.Proxy%3B%20%20%20%20%20%20%20%20%0A%2F%2F%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E7%B1%BB%E5%8F%AA%E8%83%BD%E4%BB%A3%E7%90%86%E6%8E%A5%E5%8F%A3%EF%BC%8C%E4%BB%A3%E7%90%86%E7%B1%BB%E9%83%BD%E9%9C%80%E8%A6%81%E5%AE%9E%E7%8E%B0InvocationHandler%E7%B1%BB%EF%BC%8C%E5%AE%9E%E7%8E%B0invoke%E6%96%B9%E6%B3%95%E3%80%82%E8%AF%A5invoke%E6%96%B9%E6%B3%95%E5%B0%B1%E6%98%AF%E8%B0%83%E7%94%A8%E8%A2%AB%E4%BB%A3%E7%90%86%E6%8E%A5%E5%8F%A3%E7%9A%84%E6%89%80%E6%9C%89%E6%96%B9%E6%B3%95%E6%97%B6%E9%9C%80%E8%A6%81%E8%B0%83%E7%94%A8%E7%9A%84%EF%BC%8C%E8%AF%A5invoke%E6%96%B9%E6%B3%95%E8%BF%94%E5%9B%9E%E7%9A%84%E5%80%BC%E6%98%AF%E8%A2%AB%E4%BB%A3%E7%90%86%E6%8E%A5%E5%8F%A3%E7%9A%84%E4%B8%80%E4%B8%AA%E5%AE%9E%E7%8E%B0%E7%B1%BB%20%20%20%20%20%20%20%20%0Apublic%20class%20DynamicProxy%20implements%20InvocationHandler%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20private%20Object%20object%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%2F%2F%E7%BB%91%E5%AE%9A%E5%85%B3%E7%B3%BB%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E5%85%B3%E8%81%94%E5%88%B0%E5%93%AA%E4%B8%AA%E6%8E%A5%E5%8F%A3%EF%BC%88%E4%B8%8E%E5%85%B7%E4%BD%93%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%B1%BB%E7%BB%91%E5%AE%9A%EF%BC%89%E7%9A%84%E5%93%AA%E4%BA%9B%E6%96%B9%E6%B3%95%E5%B0%86%E8%A2%AB%E8%B0%83%E7%94%A8%E6%97%B6%EF%BC%8C%E6%89%A7%E8%A1%8Cinvoke%E6%96%B9%E6%B3%95%E3%80%82%20%20%20%20%0A%20%20%20%20%2F%2FProxy.newProxyInstance%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0%E6%98%AF%E8%A1%A8%E6%98%8E%E8%BF%99%E4%BA%9B%E8%A2%AB%E6%8B%A6%E6%88%AA%E7%9A%84%E6%96%B9%E6%B3%95%E6%89%A7%E8%A1%8C%E6%97%B6%E9%9C%80%E8%A6%81%E6%89%A7%E8%A1%8C%E5%93%AA%E4%B8%AAInvocationHandler%E7%9A%84invoke%E6%96%B9%E6%B3%95%20%20%20%20%0A%20%20%20%20public%20Object%20bindRelation(Object%20object)%7B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20this.object%20%3D%20object%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20return%20Proxy.newProxyInstance(object.getClass().getClassLoader()%2C%20object.getClass().getInterfaces()%2Cthis)%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%2F%2F%E6%8B%A6%E6%88%AA%E5%85%B3%E8%81%94%E7%9A%84%E8%BF%99%E4%B8%AA%E5%AE%9E%E7%8E%B0%E7%B1%BB%E7%9A%84%E6%96%B9%E6%B3%95%E8%A2%AB%E8%B0%83%E7%94%A8%E6%97%B6%E5%B0%86%E8%A2%AB%E6%89%A7%E8%A1%8C%20%20%20%20%20%20%20%20%0A%20%20%20%20public%20Object%20invoke(Object%20proxy%2C%20Method%20method%2C%20Object%5B%5D%20args)%20throws%20Throwable%20%7B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20System.out.println(%22Welcome%22)%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20Object%20result%20%3D%20method.invoke(object%2C%20args)%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20return%20result%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%0A%7D%20%20%20%20%20%20%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">         </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">import</span> java.lang.reflect.InvocationHandler;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">import</span> java.lang.reflect.Method;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">import</span> java.lang.reflect.Proxy;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//动态代理类只能代理接口åQŒä»£ç†ç±»éƒ½éœ€è¦å®žçްInvocationHandler¾c»ï¼Œå®žçްinvokeæ–ÒŽ(gu¨©)³•。该invokeæ–ÒŽ(gu¨©)³•ž®±æ˜¯è°ƒç”¨è¢«ä»£ç†æŽ¥å£çš„æ‰€æœ‰æ–¹æ³•时需要调用的åQŒè¯¥invokeæ–ÒŽ(gu¨©)³•˜q”回的值是被代理接口的一个实现类        </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> DynamicProxy <span style="color: #7f0055;">implements</span> InvocationHandler{          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">              </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">private</span> Object object;           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">//¾l‘定关系åQŒä¹Ÿž®±æ˜¯å…Œ™”到哪个接口(与具体的实现¾cȝ»‘定)的哪些方法将被调用时åQŒæ‰§è¡Œinvokeæ–ÒŽ(gu¨©)³•ã€?nbsp;   </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">//Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandlerçš„invokeæ–ÒŽ(gu¨©)³•    </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> Object bindRelation(Object object){           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">this</span>.object = object;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">return</span> Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),<span style="color: #7f0055;">this</span>);           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="width: auto; border-width: 0px;">//拦截兌™”的这个实现类的方法被调用时将被执è¡?nbsp;       </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> Object invoke(Object proxy, Method method, Object[] args) <span style="color: #7f0055;">throws</span> Throwable {           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        System.out.println("Welcome");          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        Object result = method.invoke(object, args);           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="color: #7f0055;">return</span> result;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">         </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}          </li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">‹¹‹è¯•¾c»ï¼š </span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div class="wmqeeuq" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码 <embed wmode="transparent" src="http://kuangbaoxu.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=package%20ttitfly.proxy%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%0Apublic%20class%20TestDynamicProxy%20%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%7B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20HelloWorld%20helloWorld%20%3D%20new%20HelloWorldImpl()%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20DynamicProxy%20dp%20%3D%20new%20DynamicProxy()%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F%2F%E5%9C%A8%E8%BF%99%E9%87%8C%E7%BB%91%E5%AE%9A%E7%9A%84%E6%98%AFHelloWorld%2C%E4%B9%9F%E5%B0%B1%E6%98%AFHelloWorld%E6%98%AF%E8%A2%AB%E4%BB%A3%E7%90%86%E6%8E%A5%E5%8F%A3%E3%80%82%E6%89%80%E4%BB%A5%E7%BB%91%E5%AE%9A%E5%85%B3%E7%B3%BB%E6%97%B6%EF%BC%8C%E9%9C%80%E8%A6%81%E4%BC%A0%E9%80%92%E4%B8%80%E4%B8%AAHelloWorld%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%B1%BB%E7%9A%84%E5%AE%9E%E4%BE%8B%E5%8C%96%E5%AF%B9%E8%B1%A1%E3%80%82%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20HelloWorld%20helloWorld1%20%3D%20(HelloWorld)dp.bindRelation(helloWorld)%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20helloWorld1.print()%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20helloWorld1.say()%3B%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F%2FhelloWorld2%E5%B0%86%E4%B8%8D%E8%A2%AB%E6%8B%A6%E6%88%AA%20%20%20%20%0A%20%20%20%20%20%20%20%20HelloWorld%20helloWorld2%20%3D%20new%20HelloWorldImpl()%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20helloWorld2.print()%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20helloWorld2.say()%3B%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%7D%20%20%20%20%20%20%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> <a href="" title="收藏˜q™æ®µä»£ç " style="color: #108ac6;"><img src="http://kuangbaoxu.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">package</span> ttitfly.proxy;          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">         </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span> <span style="color: #7f0055;">class</span> TestDynamicProxy {          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    <span style="color: #7f0055;">public</span> <span style="color: #7f0055;">static</span> <span style="color: #7f0055;">void</span> main(String[] args){          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        HelloWorld helloWorld = <span style="color: #7f0055;">new</span> HelloWorldImpl();          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        DynamicProxy dp = <span style="color: #7f0055;">new</span> DynamicProxy();          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">//在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关¾pÀL—¶åQŒéœ€è¦ä¼ é€’一个HelloWorld的实现类的实例化对象ã€?nbsp;       </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        helloWorld1.print();           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        helloWorld1.say();          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">              </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        <span style="width: auto; border-width: 0px;">//helloWorld2ž®†ä¸è¢«æ‹¦æˆ?nbsp;   </span>  </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        HelloWorld helloWorld2 = <span style="color: #7f0055;">new</span> HelloWorldImpl();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        helloWorld2.print();           </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">        helloWorld2.say();      </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">              </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">    }          </li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}          </li></ol></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">在测试类里调用实现类的printå’Œsayæ–ÒŽ(gu¨©)³•åQŒå› ä¸ÞZ»£ç†ç±»é‡Œä»£ç†äº†HelloWorld的所有方法。所以就不需要像静态代理类那样一一实现了ã€?nbsp;</span><img src ="http://www.aygfsteel.com/brock/aggbug/395513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-02-21 12:01 <a href="http://www.aygfsteel.com/brock/archive/2013/02/21/395513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解Java对象序列åŒ?åŽ?http://www.aygfsteel.com/brock/archive/2013/02/21/395512.htmlbrockbrockThu, 21 Feb 2013 03:41:00 GMThttp://www.aygfsteel.com/brock/archive/2013/02/21/395512.html阅读全文

]]>
Java泛型½Ž€æ˜Žæ•™½E?/title><link>http://www.aygfsteel.com/brock/archive/2013/02/21/395509.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Thu, 21 Feb 2013 03:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/02/21/395509.html</guid><description><![CDATA[     摘要: 泛型是Java SE 5.0中引入的一™å¹ç‰¹å¾ï¼Œè‡ªä»Ž˜q™é¡¹è¯­è¨€ç‰¹å¾å‡ºçŽ°å¤šå¹´æ¥ï¼Œæˆ‘ç›¸ä¿¡ï¼Œå‡ ä¹Žæ‰€æœ‰çš„Java½E‹åºå‘˜ä¸ä»…听说过åQŒè€Œä¸”使用˜q‡å®ƒã€‚关于Java泛型的教½E‹ï¼Œå…è´¹çš„,不免费的åQŒæœ‰å¾ˆå¤šã€‚我遇到的最好的教材有:The Java TutorialJava Generics and Collections, by Maurice Naftalin and Philip WadlerEffective Jav...  <a href='http://www.aygfsteel.com/brock/archive/2013/02/21/395509.html'>阅读全文</a><img src ="http://www.aygfsteel.com/brock/aggbug/395509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-02-21 11:31 <a href="http://www.aygfsteel.com/brock/archive/2013/02/21/395509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>‹¹…拷贝和深拷è´?/title><link>http://www.aygfsteel.com/brock/archive/2013/02/21/395508.html</link><dc:creator>brock</dc:creator><author>brock</author><pubDate>Thu, 21 Feb 2013 03:03:00 GMT</pubDate><guid>http://www.aygfsteel.com/brock/archive/2013/02/21/395508.html</guid><description><![CDATA[     摘要: ‹¹…拷贝就比如像引用类型,而深拯‚´ž®±æ¯”如值类型ã€?nbsp; ‹¹…拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同åQˆå¿UîC¸åŒï¼‰ã€‚对其中ä»ÖM½•一个对象的改动都会影响另外一个对象。ä‹D个例子,一个äh一开始叫张三åQŒåŽæ¥æ”¹åå«æŽå››äº†ï¼Œå¯æ˜¯˜q˜æ˜¯åŒä¸€ä¸ªähåQŒä¸½Ž¡æ˜¯å¼ ä¸‰¾~ø™ƒ³è†Šå°‘腿还是李四缺背™†Šž®‘è…¿åQŒéƒ½æ˜¯è¿™ä¸ªäh倒霉。深拯‚´æ˜¯æŒ‡æºå¯¹è±¡ä¸Žæ‹¯‚´å¯¹è±¡äº’相独立åQŒå…¶ä¸­ä“Q何一个对象的改动都不会对另外一个对象造成影响ã€?..  <a href='http://www.aygfsteel.com/brock/archive/2013/02/21/395508.html'>阅读全文</a><img src ="http://www.aygfsteel.com/brock/aggbug/395508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/brock/" target="_blank">brock</a> 2013-02-21 11:03 <a href="http://www.aygfsteel.com/brock/archive/2013/02/21/395508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">·ö·çÏØ</a>| <a href="http://" target="_blank">·Ê¶«ÏØ</a>| <a href="http://" target="_blank">×ÊÐËÊÐ</a>| <a href="http://" target="_blank">ñçÑôÊÐ</a>| <a href="http://" target="_blank">·¨¿âÏØ</a>| <a href="http://" target="_blank">¸£ÇåÊÐ</a>| <a href="http://" target="_blank">ÄþÇ¿ÏØ</a>| <a href="http://" target="_blank">ÌÒÔ´ÏØ</a>| <a href="http://" target="_blank">²×Ô´</a>| <a href="http://" target="_blank">ÄþÁêÏØ</a>| <a href="http://" target="_blank">ƽ½­ÏØ</a>| <a href="http://" target="_blank">³Î³ÇÏØ</a>| <a href="http://" target="_blank">лͨÃÅÏØ</a>| <a href="http://" target="_blank">¶¨ÏåÏØ</a>| <a href="http://" target="_blank">ÑôÔ­ÏØ</a>| <a href="http://" target="_blank">¹±É½</a>| <a href="http://" target="_blank">ÓñϪÊÐ</a>| <a href="http://" target="_blank">ÂåÄþÏØ</a>| <a href="http://" target="_blank">ÈýÃÅÏØ</a>| <a href="http://" target="_blank">ºâÉ½ÏØ</a>| <a href="http://" target="_blank">ͨÓÜÏØ</a>| <a href="http://" target="_blank">·±²ýÏØ</a>| <a href="http://" target="_blank">Ä˶«ÏØ</a>| <a href="http://" target="_blank">Óí³ÇÊÐ</a>| <a href="http://" target="_blank">½úÖÐÊÐ</a>| <a href="http://" target="_blank">°²ÑôÊÐ</a>| <a href="http://" target="_blank">²ì¹þ</a>| <a href="http://" target="_blank">ÐÞË®ÏØ</a>| <a href="http://" target="_blank">Ñô´ºÊÐ</a>| <a href="http://" target="_blank">Ó¢¼ªÉ³ÏØ</a>| <a href="http://" target="_blank">Ö¯½ðÏØ</a>| <a href="http://" target="_blank">ÈĺÓÏØ</a>| <a href="http://" target="_blank">¹óÖÝÊ¡</a>| <a href="http://" target="_blank">ÐÇ×ù</a>| <a href="http://" target="_blank">вÌÏØ</a>| <a href="http://" target="_blank">зáÏØ</a>| <a href="http://" target="_blank">²ýÍ¼ÏØ</a>| <a href="http://" target="_blank">À¼Î÷ÏØ</a>| <a href="http://" target="_blank">ÎåºÓÏØ</a>| <a href="http://" target="_blank">Ì«²ÖÊÐ</a>| <a href="http://" target="_blank">ÌìÕòÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>