InitializingBean,FactoryBean详解

参考文章:

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

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

InitializingBean

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);
 }
}
时间: 2024-10-13 21:54:37

InitializingBean,FactoryBean详解的相关文章

Shiro的Filter机制详解---源码分析

Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). 2, 为什么两个url规则都可以匹配同一个url,只执行第一个呢. 下面分别从这两个问题入手,最终阅读源码得到解答. 问题一解答 相同url但定义在不同的行,后面覆盖前面 如 /usr/login.do=test3 /usr/login.do=test1,test2 不会执行test3的filter

[转载] 多图详解Spring框架的设计理念与设计模式

转载自http://developer.51cto.com/art/201006/205212_all.htm Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的JDBC应用做过报道.本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计理念. AD: Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的JDBC应用做过报道.本文将从另外一个视角试图剖析出Spring框架的作者

详解Spring框架的核心思想之IOC

微信号:GitShare微信公众号:爱折腾的稻草如有问题或建议,请在公众号留言[1] 前续 为帮助广大SpringBoot用户达到"知其然,更需知其所以然"的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理. No.1 Spring是什么 为了让更多的朋友了解Spring,首先科普一下Spring!有兴趣的朋友可以去Spring官网逛逛,地址是:https://spring.io/ The

一份spring配置文件及其详解

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axu20/archive/2009/10/14/4668188.aspx 1.基本配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/

JAVAEE——spring01:介绍、搭建、概念、配置详解、属性注入和应用到项目

一.spring介绍 1.三层架构中spring位置 2.spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还能帮其他框架管理对象. aop支持.ioc思想.spring jdbc.aop 事务.junit 测试支持 二.spring搭建 1.导包 日志包:com.springsource.org.apache.commons.logging-1.1.1.jar 可选:com.springsource.or

Spring的配置详解

Spring的配置详解 3.1XML配置的结构 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www

Srping讲解----------IoC详解

2.1.1  IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确"谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了",那我们来深入分析一下: ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

springmvc RequestMappingHandlerMapping初始化详解

springmvc中配置这个标签默认注册三个bean:RequestMappingHandlerMapping,RequestMappingHandlerAdapter,DefaultHandlerExceptionResolver RequestMappingHandlerMapping 我们看它实现了InitializingBean 接口,所以在getBean()实例化它时会执行afterPropertiesSet()方法,来看该方法干了什么? 方法中实例化了一个BuilderConfigu