blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/hwpok/category/30583.htmldebugzh-cnmon, 19 jul 2010 21:02:12 gmtmon, 19 jul 2010 21:02:12 gmt60spring 属性文件加密码及解密http://www.blogjava.net/hwpok/archive/2010/07/19/326537.html惠万鹏惠万鹏mon, 19 jul 2010 09:22:00 gmthttp://www.blogjava.net/hwpok/archive/2010/07/19/326537.htmlhttp://www.blogjava.net/hwpok/comments/326537.htmlhttp://www.blogjava.net/hwpok/archive/2010/07/19/326537.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/326537.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/326537.html阅读全文

惠万鹏 2010-07-19 17:22
]]>
acegi基于数据库存储用户的身份认证 http://www.blogjava.net/hwpok/archive/2008/09/01/226220.html惠万鹏惠万鹏mon, 01 sep 2008 15:18:00 gmthttp://www.blogjava.net/hwpok/archive/2008/09/01/226220.htmlhttp://www.blogjava.net/hwpok/comments/226220.htmlhttp://www.blogjava.net/hwpok/archive/2008/09/01/226220.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/226220.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/226220.htmlxml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
    

    
<bean id="datasource"
        class
="com.mchange.v2.c3p0.combopooleddatasource"
        destroy-method
="close">
        
<property name="driverclass" value="com.mysql.jdbc.driver" />
        
<property name="jdbcurl"
            value
="jdbc:mysql://127.0.0.1:3306/mydata" />
        
<property name="user" value="root" />
        
<property name="password" value="root" />
        
<property name="autocommitonclose" value="true" />
        
<property name="checkouttimeout" value="5000" />
        
<property name="initialpoolsize" value="2" />
        
<property name="minpoolsize" value="2" />
        
<property name="maxpoolsize" value="4" />
        
<property name="maxidletime" value="25200" />
        
<property name="acquireincrement" value="1800" />
        
<property name="maxidletimeexcessconnections" value="5" />
    
bean>
    
<bean id="filterchainproxy"
        class
="org.acegisecurity.util.filterchainproxy">
        
<property name="filterinvocationdefinitionsource">
            
<value>
                convert_url_to_lowercase_before_comparison
                pattern_type_apache_ant
                /**=authenticationprocessingfilter
            
value>
        
property>
    
bean>
    
<bean id="authenticationprocessingfilter"
        class
="org.acegisecurity.ui.webapp.authenticationprocessingfilter">
        
<property name="filterprocessesurl"
            value
="/j_acegi_security_check" />
        
<property name="defaulttargeturl" value="/main.jsp" />
        
<property name="authenticationfailureurl"
            value
="/index.jsp?login_error=1" />
        
<property name="authenticationmanager"
            ref
="authenticationmanager" />
    
bean>
    
<bean id="authenticationmanager"
        class
="org.acegisecurity.providers.providermanager">
        
<property name="providers">
            
<list>
                
<ref local="daoauthenticationprovider" />
            
list>
        
property>
    
bean>
    
<bean id="daoauthenticationprovider"
        class
="org.acegisecurity.providers.dao.daoauthenticationprovider">
        
<property name="userdetailsservice" ref="userdetailsservice" />
    
bean>
    

    
<bean id="userdetailsservice" class="org.acegisecurity.userdetails.jdbc.jdbcdaoimpl">
        
<property name="datasource" ref="datasource" />
        
<property name="usersbyusernamequery">
            
<value>select username,password,status from t_user where username=?value>
        
property>
        
<property name="authoritiesbyusernamequery">
            
<value>select u.username,p.priv_name from t_user u,t_user_priv p where u.user_id=p.user_id and u.username=?value>
        
property>
    
bean>
     
    

beans>

惠万鹏 2008-09-01 23:18
]]>
acegi基于内存存储用户的身份认证http://www.blogjava.net/hwpok/archive/2008/08/27/224894.html惠万鹏惠万鹏tue, 26 aug 2008 16:18:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/27/224894.htmlhttp://www.blogjava.net/hwpok/comments/224894.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/27/224894.html#feedback1http://www.blogjava.net/hwpok/comments/commentrss/224894.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/224894.htmlxml version="1.0" encoding="utf-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
>
    
<context-param>
        
<param-name>contextconfiglocationparam-name>
        
<param-value>
            classpath:applicationcontext-acegi-plugin.xml
        
param-value>
    
context-param>
    
<filter>
        
<filter-name>acegifilterchainproxyfilter-name>
        
<filter-class>
            org.acegisecurity.util.filtertobeanproxy
        
filter-class>
        
<init-param>
            
<param-name>targetclassparam-name>
            
<param-value>
                org.acegisecurity.util.filterchainproxy
            
param-value>
        
init-param>
    
filter>
    
<filter-mapping>
        
<filter-name>acegifilterchainproxyfilter-name>
        
<url-pattern>/*url-pattern>
    
filter-mapping>
    
<listener>
        
<listener-class>
            org.springframework.web.context.contextloaderlistener
        
listener-class>
    
listener>
web-app>

applicationcontext-acegi-plugin.xml
xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>

    
<bean id="filterchainproxy"
        class
="org.acegisecurity.util.filterchainproxy">
        
<property name="filterinvocationdefinitionsource">
            
<value>
                convert_url_to_lowercase_before_comparison
                pattern_type_apache_ant
                /**=authenticationprocessingfilter
            
value>
        
property>
    
bean>
    
<bean id="authenticationprocessingfilter"
        class
="org.acegisecurity.ui.webapp.authenticationprocessingfilter">
        
<property name="filterprocessesurl"
            value
="/j_acegi_security_check" />
        
<property name="defaulttargeturl" value="/main.jsp" />
        
<property name="authenticationfailureurl"
            value
="/index.jsp?login_error=1" />
        
<property name="authenticationmanager"
            ref
="authenticationmanager" />
    
bean>
    
<bean id="authenticationmanager"
        class
="org.acegisecurity.providers.providermanager">
        
<property name="providers">
            
<list>
                
<ref local="daoauthenticationprovider" />
            
list>
        
property>
    
bean>
    
<bean id="daoauthenticationprovider"
        class
="org.acegisecurity.providers.dao.daoauthenticationprovider">
        
<property name="userdetailsservice" ref="userdetailsservice" />
    
bean>
    
<bean id="userdetailsservice"
        class
="org.acegisecurity.userdetails.memory.inmemorydaoimpl">
        
<property name="usermap">
            
<value>
                huyvanmin=huyvanmin,priv_common,priv_1
                huyvanpull=huyvanpull,priv_common,priv_1,priv_2
                huyvanlee=huyvanlee,disabled,priv_common,priv_1
            
value>
        
property>
    
bean>
beans>

index.jsp
<%@ page language="java" import="java.util.*" pageencoding="gb2312"%>
doctype html public "-//w3c//dtd html 4.01 transitional//en">
<html>
  
<head>
    
<title>测试title>
    
<meta http-equiv="pragma" content="no-cache">
    
<meta http-equiv="cache-control" content="no-cache">
    
<meta http-equiv="expires" content="0">    
    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
<meta http-equiv="description" content="this is my page">
    

  
head>
  
<body>
    
<form name="meform" method="post" action="/j_acegi_security_check">
        用户名:
<input type="text" name="j_username"/> <br />
        密  码:
<input type="text" name="j_password"/> <br />
        
<input type="submit" value="登陆"/>
    
form>
  
body>
html>


惠万鹏 2008-08-27 00:18
]]>
spring 里配置 quartzhttp://www.blogjava.net/hwpok/archive/2008/08/19/223124.html惠万鹏惠万鹏tue, 19 aug 2008 14:59:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/19/223124.htmlhttp://www.blogjava.net/hwpok/comments/223124.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/19/223124.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/223124.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/223124.htmlpackage hvp.spring.quartz.bean;

import java.util.map;

import org.quartz.job;
import org.quartz.jobexecutioncontext;
import org.quartz.jobexecutionexception;
import org.springframework.context.applicationcontext;

public class myjob implements job
{
    
    @suppresswarnings(
"unchecked")
    
public void execute(jobexecutioncontext jec) throws jobexecutionexception
    
{
        map datamap 
= jec.getjobdetail().getjobdatamap();
        string size 
= (string) datamap.get("size");
        
// 得到spring的applicationcontext,可以访问spring里的任何bean了.
        applicationcontext ac = (applicationcontext) datamap
                .get(
"applicationcontext");
        system.out.println(size 
 ":工作里"  ac.tostring());
    }

}
package hvp.spring.quartz.bean;

public class myservice
{
    
public void dojob()
    
{
        system.out.println(
"in myservice.dojob().");
    }

}
package hvp.spring.quartz.bean;

import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;

public class testquartx
{   
    
public static void main(string[] args){
        string configpath 
= "hvp/spring/quartz/bean/quartzbean.xml";
        applicationcontext ctx 
= new classpathxmlapplicationcontext(configpath);
        ctx.getbean(
"scheduler");
    }

}
xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
    
<bean name="jobdetail"
        class
="org.springframework.scheduling.quartz.jobdetailbean">
        
<property name="jobclass"
            value
="hvp.spring.quartz.bean.myjob" />
        
<property name="jobdataasmap">
            
<map>
                
<entry key="size" value="10" />
            
map>
        
property>
        
<property name="applicationcontextjobdatakey"
            value
="applicationcontext" />
    
bean>
    
<bean id="jobdetail_1"
        class
="org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean">
        
<property name="targetobject" ref="myservice" />
        
<property name="targetmethod" value="dojob" />
        
<property name="concurrent" value="false" />
    
bean>
    
<bean id="myservice" class="hvp.spring.quartz.bean.myservice" />
    
<bean id="simpletrigger"
        class
="org.springframework.scheduling.quartz.simpletriggerbean">
        
<property name="jobdetail" ref="jobdetail" />
        
<property name="startdelay" value="1000" />
        
<property name="repeatinterval" value="1000" />
        
<property name="repeatcount" value="1000" />
        
<property name="jobdataasmap">
            
<map>
                
<entry key="count" value="10" />
            
map>
        
property>
    
bean>
    
<bean id="checkimagestrigger"
        class
="org.springframework.scheduling.quartz.crontriggerbean">
        
<property name="jobdetail" ref="jobdetail_1" />
        
<property name="cronexpression" value="0/5 * * * * ?" />
    
bean>
    
<bean id="scheduler"
        class
="org.springframework.scheduling.quartz.schedulerfactorybean">
        
<property name="triggers">
            
<list>
                
<ref bean="checkimagestrigger" />
                
<ref bean="simpletrigger" />
            
list>
        
property>
        
<property name="schedulercontextasmap">
            
<map>
                
<entry key="timeout" value="30" />
            
map>
        
property>
        
<property name="quartzproperties">
            
<props>
                
<prop key="org.quartz.threadpool.class">
                    org.quartz.simpl.simplethreadpool
                
prop>
                
<prop key="org.quartz.threadpool.threadcount">10prop>
            
props>
        
property>
    
bean>
beans>


惠万鹏 2008-08-19 22:59
]]>
hibernatetemplate daohttp://www.blogjava.net/hwpok/archive/2008/08/18/222872.html惠万鹏惠万鹏mon, 18 aug 2008 13:21:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/18/222872.htmlhttp://www.blogjava.net/hwpok/comments/222872.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/18/222872.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/222872.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/222872.htmlimport org.hibernate.hibernateexception;
import org.hibernate.query;
import org.hibernate.session;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import org.springframework.orm.hibernate3.hibernatecallback;
import org.springframework.orm.hibernate3.support.hibernatedaosupport;

public class userdao extends hibernatedaosupport
{
    
public void adduser(user user)
    
{
        
this.gethibernatetemplate().save(user);
    }

    
    
public void updateuser(user entity)
    
{
        
this.gethibernatetemplate().save(entity);
    }

    
    
public void deleteuser(user entity)
    
{
        
this.gethibernatetemplate().delete(entity);
    }

    
    
public user getuser(int entityid)
    
{
        
return (user) this.gethibernatetemplate().get(user.class, entityid);
    }

    
    @suppresswarnings(
"unchecked")
    
public list<user> findusers()
    
{
        
return gethibernatetemplate().executefind(new hibernatecallback()
            
{
                @suppresswarnings(
"unchecked")
                
public list<user> doinhibernate(session session)
                        
throws hibernateexception, sqlexception
                
{
                    stringbuffer sql 
= new stringbuffer(
                            
"from user u where 1=1 ");
                    query query 
= session.createquery(sql.tostring());
                    list
<user> users = query.list();
                    
return users;
                }

            }
);
    }

    
    
public long getusernum()
    
{
        
return (long) gethibernatetemplate().execute(new hibernatecallback()
            
{
                
public long doinhibernate(session session)
                        
throws hibernateexception, sqlexception
                
{
                    query query 
= session
                            .createquery(
"select count(u.userid) from user u");
                    
return (long) query.uniqueresult();
                }

            }
);
    }

    
    
public static void main(string[] a)
    
{
        user user 
= new user();
        user.setusername(
"hwpokay");
        user.setsex(
0);
        
        string configpath 
= "hvp/spring/hibernate/orm/beans.xml";
        applicationcontext ctx 
= new classpathxmlapplicationcontext(configpath);
        
        userdao userdao 
= (userdao) ctx.getbean("userdao");
        system.out.println(userdao.getusernum());
    }

}


惠万鹏 2008-08-18 21:21
]]>
hibernatetemplatehttp://www.blogjava.net/hwpok/archive/2008/08/14/221867.html惠万鹏惠万鹏thu, 14 aug 2008 00:01:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/14/221867.htmlhttp://www.blogjava.net/hwpok/comments/221867.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/14/221867.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/221867.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/221867.htmlxml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
     
<bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close">
        
<property name="driverclass" value="com.mysql.jdbc.driver" />
        
<property name="jdbcurl" value="jdbc:mysql://127.0.0.1:3306/hwpok" />
        
<property name="user" value="mydata" />
        
<property name="password" value="root" />
        
<property name="autocommitonclose" value="true"/>
        
<property name="checkouttimeout" value="5000"/>
        
<property name="initialpoolsize" value="2"/>
        
<property name="minpoolsize" value="2"/>
        
<property name="maxpoolsize" value="4"/>
        
<property name="maxidletime" value="25200"/>
        
<property name="acquireincrement" value="1800"/>
        
<property name="maxidletimeexcessconnections" value="5"/>
    
bean>
    
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.localsessionfactorybean">
        
<property name="datasource" ref="datasource" />
        
<property name="mappingdirectorylocations">
            
<list>
                
<value>classpath:/hvp.spring.hibernate.ormvalue>
            
list>
        
property>
        
<property name="hibernateproperties">
            
<props>
                
<prop key="hibernate.dialect">org.hibernate.dialect.mysqldialectprop>
                
<prop key="hibernate.show_sql">trueprop>
                
<prop key="hibernate.generate_statistics">trueprop>
            
props>
        
property>
    
bean>
    
<bean id="hibernatetemplate" class="org.springframework.orm.hibernate3.hibernatetemplate">
        
<property name="sessionfactory" ref="sessionfactory" />
    
bean>
    
<bean id="userdao" class="hvp.spring.hibernate.orm.userdao">
        
<property name="hibernatetemplate" ref="hibernatetemplate" />
    
bean>
beans> hbm.xml
doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="hvp.spring.hibernate.orm">
    
<class name="user" table="le_users">
        
<id name="userid" column="user_id">
            
<generator class="increment" />
        
id>
        
<property name="username" column="user_name" />
        
<property name="sex" column="sex" />
    
class>
hibernate-mapping>
dao
package hvp.spring.hibernate.orm;

import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import org.springframework.orm.hibernate3.support.hibernatedaosupport;

public class userdao extends hibernatedaosupport
{   
    
public void adduser(user user){
        
this.gethibernatetemplate().save(user);
    }

    
    
public static void main(string[] a){
        user user 
= new user();
        user.setusername(
"hwpokay");
        user.setsex(
0);
        
        string configpath 
= "hvp/spring/aspectj/anno/beans.xml";
        applicationcontext ctx 
= new classpathxmlapplicationcontext(configpath);
        
        userdao userdao 
= (userdao)ctx.getbean("userdao");
        userdao.adduser(user);
    }

}



惠万鹏 2008-08-14 08:01
]]>
spring jdbctemplatehttp://www.blogjava.net/hwpok/archive/2008/08/10/221150.html惠万鹏惠万鹏sun, 10 aug 2008 09:46:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/10/221150.htmlhttp://www.blogjava.net/hwpok/comments/221150.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/10/221150.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/221150.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/221150.htmlpackage hvp.spring.jdbc.jdbctemplate;

import hvp.spring.commons.inim.userpo;

import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.resultset;
import java.sql.sqlexception;
import java.util.list;

import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import org.springframework.jdbc.core.jdbctemplate;
import org.springframework.jdbc.core.preparedstatementcreator;
import org.springframework.jdbc.core.rowmapper;
import org.springframework.jdbc.support.generatedkeyholder;
import org.springframework.jdbc.support.keyholder;

public class userdao
{
    jdbctemplate jt;
    
    
public userdao()
    
{
        
this.jt = this.getjdbctemplate2();
    }

    
    
public jdbctemplate getjdbctemplate2()
    
{
        string configpath 
= "hvp/spring/jdbc/jdbctemp/beans.xml";
        applicationcontext ctx 
= new classpathxmlapplicationcontext(configpath);
        
return (jdbctemplate) ctx.getbean("jdbctemplate");
    }

    
    
public void createtable()
    
{
        stringbuffer sql 
= new stringbuffer();
        sql.append(
"create table t_user(");
        sql.append(
"user_id int auto_increment primary key,");
        sql.append(
"user_name varchar(32)");
        sql.append(
")");
        jt.execute(sql.tostring());
    }

    
    
public userpo adduser(final userpo po)
    
{
        
final string sql = "insert into t_user(user_name) values (?)";
        keyholder keyholder 
= new generatedkeyholder();
        jt.update(
new preparedstatementcreator()
            
{
                
public preparedstatement createpreparedstatement(connection conn)
                        
throws sqlexception
                
{
                    preparedstatement ps 
= conn.preparestatement(sql);
                    ps.setstring(
1, po.getusername());
                    
return ps;
                }

            }
, keyholder);
        po.setuserid(keyholder.getkey().intvalue());
        system.out.println(po.getuserid() 
 ":"  po.getusername());
        
return po;
    }

    
    @suppresswarnings(
"unchecked")
    
public list<userpo> queryuserpos()
    
{
        stringbuffer sql 
= new stringbuffer();
        sql.append(
"select user_id,user_name from t_user");
        sql.append(
" limit ");
        sql.append(
0);
        sql.append(
",");
        sql.append(
10);
        
        
return jt.query(sql.tostring(), new rowmapper()
            
{
                
public object maprow(resultset rs, int index)
                        
throws sqlexception
                
{
                    userpo userpo 
= new userpo();
                    userpo.setuserid(rs.getint(
"user_id"));
                    userpo.setusername(rs.getstring(
"user_name"));
                    
return userpo;
                }

            }
);
    }

    
    
public userpo finduser(integer userid)
    
{
        string sql 
= "select user_id,user_name from t_user where user_id=?";
        
return (userpo) jt.queryforobject(sql, new object[] { userid },
                
new rowmapper()
                    
{
                        
public object maprow(resultset rs, int index)
                                
throws sqlexception
                        
{
                            userpo userpo 
= new userpo();
                            userpo.setuserid(rs.getint(
"user_id"));
                            userpo.setusername(rs.getstring(
"user_name"));
                            
return userpo;
                        }

                    }
);
    }

    
    
public int getcount()
    
{
        string sql 
= "select count(*) from t_user";
        
return jt.queryforint(sql);
    }

    
    
public static void main(string[] args)
    
{
        userdao ct 
= new userdao();
        
// userpo user = new userpo();
        
// user.setusername("huy vanlee");
        
// ct.adduser(user);
        system.out.println(ct.queryuserpos());
    }

}



惠万鹏 2008-08-10 17:46
]]>
再温 c3p0 连接池http://www.blogjava.net/hwpok/archive/2008/08/10/221119.html惠万鹏惠万鹏sun, 10 aug 2008 04:36:00 gmthttp://www.blogjava.net/hwpok/archive/2008/08/10/221119.htmlhttp://www.blogjava.net/hwpok/comments/221119.htmlhttp://www.blogjava.net/hwpok/archive/2008/08/10/221119.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/221119.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/221119.html 
xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
 
<bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource">
        
<property name="driverclass" value="com.mysql.jdbc.driver" />
        
<property name="jdbcurl" value="jdbc:mysql://localhost:3306/hwpok" />
        
<property name="user" value="mydata" />
        
<property name="password" value="123456" />
        
<property name="autocommitonclose" value="true"/>
        
<property name="checkouttimeout" value="5000"/>
        
<property name="initialpoolsize" value="2"/>
        
<property name="minpoolsize" value="2"/>
        
<property name="maxpoolsize" value="4"/>
        
<property name="maxidletime" value="25200"/>
        
<property name="acquireincrement" value="1800"/>
        
<property name="maxidletimeexcessconnections" value="5"/>
    
bean>
    
<bean id="jdbctemplate" class="org.springframework.jdbc.core.jdbctemplate">
     
<property name="datasource" ref="datasource" />
    
bean>
beans>

测试:
package hvp.spring.jdbc.jdbctemp;

import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import org.springframework.jdbc.core.jdbctemplate;
import org.springframework.jdbc.datasource.drivermanagerdatasource;

public class createtable
{
    jdbctemplate jt;
    
    
public createtable()
    
{
        
this.jt = this.getjdbctemplate2();
    }

    
    
public jdbctemplate getjdbctemplate()
    
{
        drivermanagerdatasource dmds 
= new drivermanagerdatasource();
        dmds.setdriverclassname(
"com.mysql.jdbc.driver");
        dmds.set;
        dmds.setusername(
"hwpok");
        dmds.setpassword(
"123456");
        
        jdbctemplate jdbctemplate 
= new jdbctemplate();
        jdbctemplate.setdatasource(dmds);
        
return jdbctemplate;
    }

    
    
public jdbctemplate getjdbctemplate2()
    
{
        string configpath 
= "hvp/spring/jdbc/jdbctemp/beans.xml";
        applicationcontext ctx 
= new classpathxmlapplicationcontext(configpath);
        
return (jdbctemplate) ctx.getbean("jdbctemplate");
    }

    
    
public void createtable()
    
{
        stringbuffer sql 
= new stringbuffer();
        sql.append(
"create table t_user(");
        sql.append(
"user_id int primary key,");
        sql.append(
"user_name varchar(32)");
        sql.append(
")");
        jt.execute(sql.tostring());
    }

    
    
public static void main(string[] args)
    
{
        createtable ct 
= new createtable();
        ct.createtable();
    }

}



惠万鹏 2008-08-10 12:36
]]>
使用 @aspectj 的一个例子http://www.blogjava.net/hwpok/archive/2008/07/26/217656.html惠万鹏惠万鹏sat, 26 jul 2008 06:27:00 gmthttp://www.blogjava.net/hwpok/archive/2008/07/26/217656.htmlhttp://www.blogjava.net/hwpok/comments/217656.htmlhttp://www.blogjava.net/hwpok/archive/2008/07/26/217656.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/217656.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/217656.html     1.asm-2.2.3.jar
    2.asm-commons-2.2.3.jar
    3.asm-util-2.2.3.jar
    4.aspectjrt.jar
    5.aspectjweaver.jar
    6.log4j-1.2.14.jar
    7.commons-logging.jar
    8.cglib-nodep-2.1_3.jar
    9.spring.jar
    还是以前面的hellospeaker为例子:
package org.hvp.aspect;

public class hellospeaker {
    
public void hello(string name) {
        system.out.print(
"hi,"  name);
    }

}

    使用@aspectj
package org.hvp.aspect;

import org.aspectj.lang.annotation.after;
import org.aspectj.lang.annotation.aspect;
import org.springframework.aop.aspectj.annotation.aspectjproxyfactory;

@aspect
public class hellospeakerproxy {
    @after(
"execution(* hello(..))")
    
public void welcome() {
        system.out.println(
", welcome to our pub.");
    }


    
public hellospeaker gethellospeakerproxy() {
        aspectjproxyfactory factory 
= new aspectjproxyfactory();
        factory.settarget(
new hellospeaker());
        factory.addaspect(hellospeakerproxy.
class);
        
return factory.getproxy();
    }


    
public static void main(string[] args) {
        hellospeakerproxy proxy 
= new hellospeakerproxy();
        hellospeaker hellospeaker 
= proxy.gethellospeakerproxy();
        hellospeaker.hello(
"huy vanpom");
    }

}




惠万鹏 2008-07-26 14:27
]]>
jar 包说明总结http://www.blogjava.net/hwpok/archive/2008/07/26/217654.html惠万鹏惠万鹏sat, 26 jul 2008 06:15:00 gmthttp://www.blogjava.net/hwpok/archive/2008/07/26/217654.htmlhttp://www.blogjava.net/hwpok/comments/217654.htmlhttp://www.blogjava.net/hwpok/archive/2008/07/26/217654.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/217654.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/217654.html      asm是一个轻量级字节码处理和分析框架.

2.aspectjrt.jar,aspectjweaver.jar
    aspect提供的注释类库和相应的解析类库

3.commons-loging.jar
   common log 是更通用、简单的log工具,用于屏蔽底层具体的细节,底层完全可以使用log4j或jdk1.4 log包

惠万鹏 2008-07-26 14:15
]]>
从注释类型 到 @aspectjhttp://www.blogjava.net/hwpok/archive/2008/07/25/217409.html惠万鹏惠万鹏fri, 25 jul 2008 03:48:00 gmthttp://www.blogjava.net/hwpok/archive/2008/07/25/217409.htmlhttp://www.blogjava.net/hwpok/comments/217409.htmlhttp://www.blogjava.net/hwpok/archive/2008/07/25/217409.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/217409.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/217409.html 1.如何定义注释类型
2.如何使用注释类型
3.如何让注释影响程序运行

一.如何定义注释类型
package org.test.spring.annotation;

import java.lang.annotation.elementtype;
import java.lang.annotation.retention;
import java.lang.annotation.retentionpolicy;
import java.lang.annotation.target;

/**
 * 


 * 定义一个person类专用的注释
 * 


 * 元注释retention用于指定此注释类型的注释要保留多久, 元注释target用于指定此注释类型的注释适用的程序元素的种类,
 * 
 * 
@author huy vanpon
 
*/
@retention(retentionpolicy.runtime)
@target(elementtype.method)
public @interface annot4person
{
    string name() 
default "惠万鹏";
    
    
int age() default 25;
    
    string gender() 
default "";
}


二.2.如何使用注释类型
package org.test.spring.annotation;

/**
 * 


 * 本类用于定义人类,包含一个自我介绍的方法
 * 


 * 
 * 
@author huy vanpon
 
*/
public class person
{
    @annot4person(name 
= "何洁", gender = "", age = 16)
    
public void introductionmyself(string name, string gender, int age)
    {
        stringbuffer sb 
= new stringbuffer();
        sb.append(
"嗨,大家好,我叫");
        sb.append(name);
        sb.append(
",今年");
        sb.append(age);
        sb.append(
"岁,是一个充满阳光的");
        sb.append(gender);
        sb.append(
"孩.");
        system.out.println(sb.tostring());
    }
}


三.如何让注释影响程序运行
package org.test.spring.annotation;

import java.lang.reflect.method;

/**
 * 


 * 本用利java的反射机制,让注释影响程序的运行
 * 


 * 
 * 
@author huy vanpon
 
*/
public class annotdisturber
{
    
public void testannot4person()
    {
        class
<person> clazz = person.class;
        
try
        {
            
//通过方法名和入参确定方法
            method method = clazz.getdeclaredmethod("introductionmyself",
                    string.
class, string.classint.class);
            
if (method == null)
            {
                
return;
            }
            
//从方法取得注释
            annot4person annotation = method.getannotation(annot4person.class);
            
if (annotation == null)
            {
                
return;
            }
            
//调用这个方法
            method.invoke(new person(), annotation.name(), annotation.gender(),
                    annotation.age());
        }
        
catch (exception e)
        {
            e.printstacktrace();
        }
    }
    
    
public static void main(string[] args)
    {
        annotdisturber tt 
= new annotdisturber();
        tt.testannot4person();
    }
}




惠万鹏 2008-07-25 11:48
]]>
spring 下几种 连接池 的比较http://www.blogjava.net/hwpok/archive/2008/04/16/193349.html惠万鹏惠万鹏wed, 16 apr 2008 02:30:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/16/193349.htmlhttp://www.blogjava.net/hwpok/comments/193349.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/16/193349.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/193349.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/193349.htmlhibernate开发组推荐c3p0,spring开发组推荐dbcp,但是dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法 reconnect ,告诉连接被重置,这个设置可以解决。hibernate in action推荐c3p0和proxool。

我推荐proxool,因为他不但可以监控后台。还可以有效的释放连接。在connection close时,也就是归还connection,
关闭所有的statement,并且判断是否autocommit,如果不行,就rollback,并且设置true,
可以参考proxool的org.logicalcobwebs.proxool.connectionresetter类
connection pool把connection reset置回initial state。
dbcp的配置




 
select 1


true

c3p0的配置, 注意是''driverclass' , 'jdbcurl', 'user' , 'password'


       
        net.sourceforge.jtds.jdbc.driver
       

       

jdbc:jtds:sqlserver://localhost:1433/hua
       
       
        sa
       

       
        hua
       

       
        15
       

       
        5
       

       
        25
       

       

        destroy-method="close">
       
            ${db.driverclass}
       

       
            ${db.url}
       

        
       
           
                5
                100
                100
                0
                10
                ${db.user}
                ${db.pass}
           

       

   

xapool的配置
 
   
     
        com.mysql.jdbc.driver
        jdbc:mysql://localhost/dbname
     

   

    root
    mypass
    1
    5
    select 1
 

c-jdbc的配置

    jdbc:cjdbc://127.0.0.1:25322/vdb?user=vuser
 

weblogic的连接池解决办法:test reserved connections: 如果选择了这个选项,服务器会在把连接提供给客户端之前
对其进行测试。 test created connections: 如果选择了这个选项,就会在创建一个jdbc
连接之后和在把它添加到jdbc连接池中的可用连接列表之前,对该jdbc连接进行测试。

tomcat的jndi关于dbcp的配置:


         factory
         org.apache.commons.dbcp.basicdatasourcefactory
      

      
         driverclassname
         com.sybase.jdbc2.jdbc.sybdriver
      

      
         url
         xyz
      

      
         username
         xyz
      

      
         password
         xyz
      

      
         maxactive
         5
      

      
         maxidle
         5
      

      
         maxwait
         -1
      

      
         removeabandoned
         true
      

      
         validationquery
         select count(*) from sometable where 1 = 0
      

      
         testonborrow
         true
      

proxool

      newstest
      net.sourceforge.jtds.jdbc.driver
      jdbc:jtds:sqlserver://127.0.0.1:1433/news
      sa
      1
      90000
      5
      100
      10
      true
      true
   



惠万鹏 2008-04-16 10:30
]]>
aop namematchmethodpointcutadvisorhttp://www.blogjava.net/hwpok/archive/2008/04/15/193208.html惠万鹏惠万鹏tue, 15 apr 2008 12:54:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/15/193208.htmlhttp://www.blogjava.net/hwpok/comments/193208.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/15/193208.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/193208.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/193208.htmlxml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
    
<bean id="logbeforeadvice" class="com.hwp.aop.pa.beforeadvicedemo" />
    
<bean id="helloadvisor"
        class
="org.springframework.aop.support.namematchmethodpointcutadvisor">
        
<property name="mappedname" value="hello*" />
        
<property name="advice" ref="logbeforeadvice" />
    
bean>
    
<bean id="hellospeaker" class="com.hwp.aop.pa.hellospeaker" />
    
<bean id="helloproxy"
        class
="org.springframework.aop.framework.proxyfactorybean">
        
<property name="proxyinterfaces" value="com.hwp.aop.pa.ihello" />
        
<property name="target" ref="hellospeaker" />
        
<property name="interceptornames">
            
<list>
                
<value>helloadvisorvalue>
            
list>
        
property>
    
bean>
beans>

惠万鹏 2008-04-15 20:54
]]>
aop before advice after advice around advice throw advicehttp://www.blogjava.net/hwpok/archive/2008/04/13/192554.html惠万鹏惠万鹏sun, 13 apr 2008 06:37:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/13/192554.htmlhttp://www.blogjava.net/hwpok/comments/192554.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/13/192554.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/192554.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/192554.html
package com.hwp.aop.advicedemo;

import java.lang.reflect.method;

import org.springframework.aop.methodbeforeadvice;

public class beforeadvicedemo implements methodbeforeadvice {

    
public void before(method method, object[] args, object target)
            
throws throwable {
        system.out.println(
"在方法运行前,先运行");
    }

    
}

after advice:
package com.hwp.aop.advicedemo;

import java.lang.reflect.method;

import org.springframework.aop.afterreturningadvice;

public class afteradvicedemo implements afterreturningadvice{

    
public void afterreturning(object arg0, method arg1, object[] arg2,
            object arg3) 
throws throwable {
        system.out.println(
"方法执行后.");
        
    }

    
}

round advice:
package com.hwp.aop.advicedemo;

import org.aopalliance.intercept.methodinterceptor;
import org.aopalliance.intercept.methodinvocation;

public class aroundadvicedemo implements methodinterceptor {

    
public object invoke(methodinvocation arg0) throws throwable {
        system.out.println(
"在round方法里,方法开始前..");
        object result 
= null;
        
try {
            result 
= arg0.proceed();
        }
 finally {
            system.out.println(
"在round方法里,方法结束后");
        }

        
return result;
    }


}

throw advice:
package com.hwp.aop.advicedemo;

import java.lang.reflect.method;

import org.springframework.aop.throwsadvice;

public class thowadvicedemo implements throwsadvice {
    
public void afterthrowing(method method, object[] args, object target,
            throwable subclass) 
{
        system.out.println(
"异常抛出后..");
    }


}

beans.xml:
xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/xmlschema-instance"
    xsi:schemalocation
="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
    
<bean id="logbeforeadvice"
        class
="com.hwp.aop.advicedemo.beforeadvicedemo" />
    
<bean id="logafteradvice"
        class
="com.hwp.aop.advicedemo.afteradvicedemo" />
    
<bean id="logroundadvice"
        class
="com.hwp.aop.advicedemo.aroundadvicedemo" />
    
<bean id="throwadvice"
        class
="com.hwp.aop.advicedemo.thowadvicedemo" />
    
<bean id="hellospeaker" class="com.hwp.aop.advicedemo.hellospeaker" />
    
<bean id="helloproxy"
        class
="org.springframework.aop.framework.proxyfactorybean">
        
<property name="proxyinterfaces"
            value
="com.hwp.aop.advicedemo.ihello" />
        
<property name="target" ref="hellospeaker" />
        
<property name="interceptornames">
            
<list>
                
<value>logbeforeadvicevalue>
                
<value>logafteradvicevalue>
                
<value>logroundadvicevalue>
                
<value>throwadvicevalue>
            
list>
        
property>
    
bean>
beans>
demo:
package com.hwp.aop.advicedemo;

import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;

public class springaopdemo {
    
public static void main(string[] args){
        applicationcontext context 
= 
            
new classpathxmlapplicationcontext("beans-beforeadvice.xml");
        ihello helloproxy 
= (ihello) context.getbean("helloproxy");
        
try{
            helloproxy.hello(
"惠万鹏");
        }
catch(exception e){
            
//e.printstacktrace();
        }

    }

}

收工....



惠万鹏 2008-04-13 14:37
]]>
从代理机制 到 aophttp://www.blogjava.net/hwpok/archive/2008/04/13/192488.html惠万鹏惠万鹏sat, 12 apr 2008 16:07:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/13/192488.htmlhttp://www.blogjava.net/hwpok/comments/192488.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/13/192488.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/192488.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/192488.htmlaop(面向方面编程)是一种新的编程技术,它能够将那些本不应该纠缠在一起的任务分离开,从而为程序提供更好的封装性和互操作性.
aop是通过代理机制实现的.
代理是指为其他对象提供一种代理以控制对这个对象的访问.
代理分为三种:
    1.静态代理,代理对象必须实现目标对象的接口,且一个接口只服务于一种类型的目标对象。
    2.jdk动态代理,代理对象必须实现java.lang.reflect.invacationhandler接口,只能为接口创建代理实例。
    3.cglib动态代理,使用非常底层的字节码技术,可以为任何对象创建代理.

以下是目标对象接口和目标对象.
目标对象接口如下:

package org.test.spring.aop;

public interface ihello
{
    
public void hello(string name);
}
目标对象如下:
package org.test.spring.aop;

public class hellospeaker implements ihello
{
    
public void hello(string name)
    {
        system.out.print(
"hi,"  name);
    }
}


一.静态代理
静态代理比较容易理解,静态代理其实很容易理解,静态代理其实就是个装饰器而已.
让代理对象也实现目标对像的接口,这样做的目的是让使用者在使用代理对象时感觉不到代理对象的存在.
代理对象如下:

package org.test.spring.aop;

public class hellospeakerproxy implements ihello
{
    
private ihello hellospeaker;
    
    
public hellospeakerproxy(ihello hellospeaker)
    {
        
this.hellospeaker = hellospeaker;
    }
    
    
public void hello(string name)
    {
        
this.hellospeaker.hello(name);
        system.out.println(
", welcome to our pub.");
    }
    
    
public static void main(string[] args)
    {
        ihello hellospeaker 
= new hellospeaker();
        ihello proxy 
= new hellospeakerproxy(hellospeaker);
        proxy.hello(
"huy vanpon");
    }
}


二.jdk动态代理

所谓dynamic proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个dynamic proxy其实就是一个proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
package org.test.spring.aop;

import java.lang.reflect.invocationhandler;
import java.lang.reflect.method;
import java.lang.reflect.proxy;

public class hellospeakerprox implements invocationhandler
{
    
    
private object target;
    
    
public object invoke(object proxy, method method, object[] parameters)
            
throws throwable
    {
        object object 
= null;
        
try
        {
            object 
= method.invoke(target, parameters);
            system.out.println(
", welcome to our pub.");
        }
        
catch (exception e)
        {
            e.printstacktrace();
        }
        
return object;
    }
    
    
/**
     * 


     * 这个方法用于得到代理对象
     * 


     * 
     * 
@param target
     *            目标对象
     * 
@return result(object)代理对象
     
*/
    
public object getproxy(object target)
    {
        
this.target = target;
        
/**
         * newproxyinstance(classloader loader, class[] interfaces,
         * invocationhandler invocationhandler) loader: 定义代理类的加加载器(目标类的加载器)
         * interfaces: 代理类要实现的接口列表 invocationhandler: 指派方法调用的调用处理程序
         
*/
        
return proxy.newproxyinstance(target.getclass().getclassloader(),
                target.getclass().getinterfaces(), 
this);
    }
    
    
public static void main(string[] args)
    {
        ihello proxy 
= (ihello) new hellospeakerprox()
                .getproxy(
new hellospeaker());
        proxy.hello(
"huy vanpon");
    }
}


三.cglib动态代理
使用jdk创建代理有一个限制,即它只能为接口创建代理实例.cglib使用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的拦截技术,并顺势织入横切逻辑.
运行这个例子,一定要记得导入cglib相应的包哦..
package org.test.spring.aop;

import java.lang.reflect.method;

import net.sf.cglib.proxy.enhancer;
import net.sf.cglib.proxy.methodinterceptor;
import net.sf.cglib.proxy.methodproxy;

public class hellospeakerpro implements methodinterceptor
{
    
private enhancer enhancer = new enhancer();
    
    
public object getproxy(class clazz)
    
{
        enhancer.setsuperclass(clazz);
        enhancer.setcallback(
this);
        
return enhancer.create();
    }

    
    
public object intercept(object object, method method, object[] args,
            methodproxy proxy) 
throws throwable
    
{
        object result 
= null;
        result 
= proxy.invokesuper(object, args);
        system.out.println(
", welcome to our pub.");
        
return result;
    }

    
    
public static void main(string[] args)
    
{
        hellospeakerpro hellospeakerpro 
= new hellospeakerpro();
        hellospeaker hellospeaker 
= (hellospeaker) hellospeakerpro
                .getproxy(hellospeaker.
class);
        hellospeaker.hello(
"huy vanpon");
    }

    
}




惠万鹏 2008-04-13 00:07
]]>
spring ioc aophttp://www.blogjava.net/hwpok/archive/2008/04/08/191585.html惠万鹏惠万鹏tue, 08 apr 2008 15:26:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/08/191585.htmlhttp://www.blogjava.net/hwpok/comments/191585.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/08/191585.html#feedback0http://www.blogjava.net/hwpok/comments/commentrss/191585.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/191585.html     协调领带对象之间合作的责任从对象自身中转移出来,从而降低对象和对象之间的耦合。
    ioc意味着关于对象如何得到它的协作对象的责任反转了。
aop:
    aop经常被定义为一种编程技术,用来在系统中提升业务的分离,使这些组件更加专注于他自己的业务.
  

惠万鹏 2008-04-08 23:26
]]>
spring 是什么http://www.blogjava.net/hwpok/archive/2008/04/03/190551.html惠万鹏惠万鹏thu, 03 apr 2008 02:27:00 gmthttp://www.blogjava.net/hwpok/archive/2008/04/03/190551.htmlhttp://www.blogjava.net/hwpok/comments/190551.htmlhttp://www.blogjava.net/hwpok/archive/2008/04/03/190551.html#feedback1http://www.blogjava.net/hwpok/comments/commentrss/190551.htmlhttp://www.blogjava.net/hwpok/services/trackbacks/190551.html
• 目的:解决企业应用开发的复杂性

• 功能:使用基本的javabean代替ejb,并提供了更多的企业应用功能

• 范围:任何java应用

简单来说,spring是一个轻量级的控制反转(ioc)和面向切面(aop)的容器框架。

■ 轻量——从大小与开销两方面而言spring都是轻量的。完整的spring框架可以在一个大小只有1mb多的jar文件里发布。并且spring所需的处理开销也是微不足道的。此外,spring是非侵入式的:典型地,spring应用中的对象不依赖于spring的特定类。

■ 控制反转——spring通过一种称作控制反转(ioc)的技术促进了松耦合。当应用了ioc,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为ioc与jndi相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

■ 面向切面——spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

■ 容器——spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,spring不应该被混同于传统的重量级的ejb容器,它们经常是庞大与笨重的,难以使用。

■ 框架——spring可以将简单的组件配置、组合成为复杂的应用。在spring中,应用对象被声明式地组合,典型地是在一个xml文件里。spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为spring中的各种模块提供了基础支持。

spring简介
关于spring framework,今年夏天你可能已经听见很多的议论。在本文中,我将试图解释spring能完成什么,和我怎么会认为它能帮助你开发j2ee应用程序。

另一framework?
你可能正在想“不过是另外一个的framework”。当已经有许多开放源代码(和专有) j2ee framework时,为什么你应该费心读这篇文章,或下载spring framework?

我相信spring是独特的,因为若干个原因:
. 它定位的领域是许多其他流行的framework没有的。spring关注提供一种方法管理你的业务对象。
. spring是全面的和模块化的。spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。因此从你的学习中,你可得到最大的价值。例如,你可能选择仅仅使用spring来简单化jdbc的使用,或用来管理所有的业务对象。
. 它的设计从底部帮助你编写易于测试的代码。spring是用于测试驱动工程的理想的framework。

spring对你的工程来说,它不需要一个以上的framework。spring是潜在地一站式凯发天生赢家一触即发官网的解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。

尽管它仅仅是一个从2003年2月才开始的开源工程,但spring有较长的历史根基。这个开源工程是起源自我在2002年后期出版的《expert one-on-one j2ee设计与开发》书中的基础代码。这本书展示了spring背后的基础架构。然而,这个基础架构的概念要追溯到2000年的早些时候,并且反映了我为一系列成功的商业工程开发基础结构的经验。

从2003年1月,spring已经落户于sourceforge上。现在有10个开发人员,其中6是高度投入的积极分子。

spring的架构性的好处

在我们进入细节以前,让我们看一下spring可以给一个工程带来的一些好处:

. spring能有效地组织你的中间层对象,无论你是否选择使用了ejb。如果你仅仅使用了struts或其他的包含了j2ee特有apis的framework,你会发现spring关注了遗留下的问题,。

. spring能消除在许多工程上对singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。

. spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读javadoc乃至源编码吗?有了spring,你可很简单地看到类的javabean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。

. spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
. spring被设计为让使用它创建的应用尽可能少的依赖于他的apis。在spring应用中的大多数业务对象没有依赖于spring。
. 使用spring构建的应用程序易于单元测试。
. spring能使ejb的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用pojos或local ejbs来实现业务接口,却不会影响调用代码。
. spring帮助你解决许多问题而无需使用ejb。spring能提供一种ejb的替换物,它们适于许多web应用。例如,spring能使用aop提供声明性事务而不通过使用ejb容器,如果你仅仅需要与单个的数据库打交道,甚至不需要jta实现。
. spring为数据存取提供了一致的框架,不论是使用jdbc或o/r mapping产品(如hibernate)。
spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。

spring能做什么?

spring提供许多功能,在此我将快速地依次展示其各个主要方面。

任务描述:
首先,让我们明确spring范围。尽管spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。

spring的主要目的是使j2ee易用和促进好编程习惯。
spring不重新开发已有的东西。因此,在spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如commons logging 用来做所有的日志输出,或commons dbcp用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供o/r mapping层,对此,已有有好的解决办法如hibernate和jdo。

spring的目标是使已存在的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了jta或任何其他的事务策略。

spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员,我们从来没有为struts高兴过,并且感到在mvc web framework中还有改进的余地。在某些领域,例如轻量级的ioc容器和aop框架,spring有直接的竞争,但是在这些领域还没有已经较为流行的凯发天生赢家一触即发官网的解决方案。(spring在这些区域是开路先锋。)

spring也得益于内在的一致性。
所有的开发者都在唱同样的的赞歌,基础想法依然是expert one-on-one j2ee设计与开发的那些。
并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。

spring在应用服务器之间是可移植的。
当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在weblogic,tomcat,resin,jboss,websphere和其他的应用服务器上的用户。

惠万鹏 2008-04-03 10:27
]]>
网站地图