Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。创建出来的对象是否属于单例由isSingleton中的返回决定。
使用场景:1、通过外部对类是否是单例进行控制,该类自己无法感知 2、对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成。

Spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。


如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。


代码示例

package com.chinaseacom.store.common;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
@Repository
public class IDGenerator  implements  InitializingBean{
 private ShardedJedisPool shardedJedisPool;
 SimpleDateFormat yymmdd=new SimpleDateFormat("YYMMddHHMMSS");
 @Autowired
 private IDGeneratorPoolConfig idgeneratorPoolConfig;
 public<T extends BaseObject> Long incr(Class<T> entityClass) {
  Long result = null;
  ShardedJedis sjedis = null;
  try {
   result = shardedJedisPool.getResource().incr(entityClass.getName());
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   shardedJedisPool.returnResourceObject(sjedis);
  }
  
  if("com.chinaseacom.store.order.model.Orders".endsWith(entityClass.getName())){
   result =new Long( yymmdd.format( System.currentTimeMillis()) +  ( result%100000)/10000 + ( result%10000)/1000 +  (result%1000)/100 +   (result%100)/10 +  (result%10)/1   );
  }
  return result;
 }
 
 public void afterPropertiesSet() throws Exception {
  if (shardedJedisPool == null) {
   JedisPoolConfig config = new JedisPoolConfig();//  
   if (StringUtils.isNumeric(idgeneratorPoolConfig.getMaxTotal())) {
    config.setMaxTotal(new Integer(idgeneratorPoolConfig.getMaxTotal()));// 
   }
   if (StringUtils.isNumeric(idgeneratorPoolConfig.getMaxIdle())) {
    config.setMaxIdle(new Integer(idgeneratorPoolConfig.getMaxIdle()));//   
   }
   if (StringUtils.isNumeric(idgeneratorPoolConfig.getMinIdle())) {
    config.setMinIdle(new Integer(idgeneratorPoolConfig.getMinIdle()));//  
   }
   if (StringUtils.isNumeric(idgeneratorPoolConfig.getMaxWaitMillis())) {
    config.setMaxWaitMillis(new Integer(idgeneratorPoolConfig
      .getMaxWaitMillis())); 
   }
   config.setTestOnBorrow(true);//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
   List<JedisShardInfo> jdsInfoList = new ArrayList<JedisShardInfo>();
   for (IDGeneratorHostConfig mhonstconf : idgeneratorPoolConfig
     .getIdgeneratorHostConfig()) {
    JedisShardInfo info = new JedisShardInfo(mhonstconf.getHost(),
      mhonstconf.getPort());
    if(StringUtils.isNotEmpty(mhonstconf.getPassword())){
     info.setPassword(mhonstconf.getPassword());
    }
    info.setConnectionTimeout(1000000);
    info.setSoTimeout(2000000);
    jdsInfoList.add(info);
   }
   
   shardedJedisPool = new ShardedJedisPool(config, jdsInfoList);
  }
  
 }
 
 public static void main(String[] arg){
  SimpleDateFormat yymmdd=new SimpleDateFormat("YYMMddHHMMSS");
  Long result=123456789L;
  System.out.println(new Long( yymmdd.format( System.currentTimeMillis()) +( result%100000)/10000 + ( result%10000)/1000 +  (result%1000)/100 +   (result%100)/10 +  (result%10)/1   ));
  System.out.println(new Long( yymmdd.format( System.currentTimeMillis())));
  System.out.println(Integer.MAX_VALUE);
  System.out.println(Long.MAX_VALUE);
 }
}

参考文章:

http://tianya23.blog.51cto.com/1081650/660273/

http://layznet.iteye.com/blog/906619