spring InitializingBean与DisposableBean的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_38068812/article/details/94752206

参考链接:https://www.jianshu.com/p/c2e33c451ee0
在项目中,我们会使用到自定义bean,做一些特定义的功能方法,示例如下所示:
@Service
public class ProductService implements InitializingBean, DisposableBean {
  @Autowired
  private ProductSvcRemoteService productRemoteService;
   // 创建本地缓存1:缓存产品信息
   private Cache<String, ProductInfoGson> localeProductInfoCache;
   // 创建本地缓存2:缓存产品id
   private Cache<String, Long> productCodeToIdCache;
   private static final String SEPARATOR = “|”;
   // 程序停止,销毁

   @Override
   public void destroy() throws Exception {
      localeProductInfoCache.cleanUp();
      productCodeToIdCache.cleanUp();
    }

  @Override
   public void afterPropertiesSet() throws Exception {
     // 初始化缓存实例:缓存5秒没有更新,失效
     localeProductInfoCache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).maximumSize(100).build();
      // 初始化缓存实例:缓存10秒没有更新,失效
     productCodeToIdCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(100).build();
    }

   private String getCacheKey(Long productId, String locale) {
    return “productId:” + productId + SEPARATOR + locale;
   }

   private ProductInfoGson loadCachedProductInfo(final Long productId, final String locale) throws Exception {
     String cacheKey = getCacheKey(productId, StringUtils.isEmpty(locale) ? Constants.DEFAULT_LOCALE : locale);
     return localeProductInfoCache.get(cacheKey, new Callable() {
      @Override
      public ProductInfoGson call() throws Exception {
        ProductInfoGson productInfo = productRemoteService.getProductDetailById(productId);
        if (productInfo != null) {
           mergeLocaleProductEntity(productId, locale, productInfo);
          }
         return productInfo;
        }
       });
     }
  private List loadCachedProductInfoByCodeList(List productCodeList, String locale) throws Exception {
     List productInfos = new ArrayList();
     String cacheLocale = StringUtils.isEmpty(locale) ? Constants.DEFAULT_LOCALE : locale;
     // 需要做缓存的产品编码信息
     List cacheProductCodeList = new ArrayList();
     // 从本地缓存中获多语言产品信息
    for (String productCode : productCodeList) {
      Long productId = productCodeToIdCache.getIfPresent(productCode);
      if (productId != null) {
        ProductInfoGson productInfo = localeProductInfoCache.getIfPresent(getCacheKey(productId, cacheLocale));
        if (productInfo != null) {
          productInfos.add(productInfo);
          continue;
          }
         }
      cacheProductCodeList.add(productCode);
       }
  if (CollectionUtils.isEmpty(cacheProductCodeList)) {
    return productInfos;
     }
   // 缓存中不存在的, 查询远程服务
   List qProductInfos = productRemoteService.getProductDetailListByCodes(cacheProductCodeList);
   if (CollectionUtils.isNotEmpty(qProductInfos)) {
   Map<String, ProductInfoGson> cacheProductInfoMap = new HashMap<String, ProductInfoGson>();
   Map<String, Long> cacheProductIdMap = new HashMap<String, Long>();
   for (ProductInfoGson qProductInfo : qProductInfos) {
      productInfos.add(qProductInfo);
      cacheProductInfoMap.put(getCacheKey(qProductInfo.getId(), cacheLocale), qProductInfo);
      cacheProductIdMap.put(qProductInfo.getCode(), qProductInfo.getId());
     }
   // 产品信息–>批量存入缓存
   localeProductInfoCache.putAll(cacheProductInfoMap);
   // 产品id—>批量存入缓存
   productCodeToIdCache.putAll(cacheProductIdMap);
      }
   return productInfos;
   }
}

展开阅读全文

13、生命周期-InitializingBeanDisposableBean

07-21

<p>n 本教程为授权出品教程n</p>n<p>n <br /></p>n<p>n <span style="color:#404040;">《Spring注解驱动开发》是一套帮助我们深入了解Spring原理机制的教程。现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@EnableXXX等。如果掌握这些底层原理.注解,那么我们对这些高层框架就能做到高度定制,使用的游刃有余;</span><br /><span style="color:#404040;">本视频涵盖的内容: </span><br /><span style="color:#404040;">1).Spring的常用注解(@ComponentScan.@Bean.@Configuration.@Conditional.@Import.@PropertySource.@Profile等) </span><br /><span style="color:#404040;">2).Spring的原理; </span><br /><span style="color:#404040;">1).后置处理器(BeanPostProcessor.BeanFactoryPostProcessor等) </span><br /><span style="color:#404040;">2).监听器(ApplicationListener) </span><br /><span style="color:#404040;">3).Spring容器启动过程; </span><br /><span style="color:#404040;">3).web原理 </span><br /><span style="color:#404040;">1).Servlet3.0标准新增特性 </span><br /><span style="color:#404040;">2).异步请求相关 </span><br /><span style="color:#404040;">本视频使用了maven构建程序,需要同学们有对Spring.SpringMVC的基本使用能力;0基础的同学,可以去补充maven.spring相关的知识。</span>n</p>

InitializingBean的问题!!!!请大家帮助

04-29

我有一个类继承了InitializingBean。 用来初始化,部署一些设置。 现在的问题是 被继承的类,总是被调用2次,在网上查了一下资料 ,说是要让此类为单例才会被只调用一次。 rn rn rn 所以我在被配置文件里面加入了singleton= "true " 这个设置 不过还是没有成功。请大家帮助!!!rn 现在的问题是 rn1.我这样来设计是正确的吗?·rn2.如果正确,怎么让此类为单例?rnn[b]问题补充:[/b]n谢谢你的建议,不过我之前也试过init-method="xxx" 使用这个还是会调用两次n[b]问题补充:[/b]nrnrnpublic class AppCallService implements InitializingBean rn rn private AppCallDAO appCallDAO;rn //private static final List registedport = new ArrayList();rnrn rn public void showData()rn ExecutorService threadService;// 线程池rn List ports = AppProp.getPorts();rn if (ports.isEmpty()) rn System.out.println("未配置服务端口");rn return;rn rn List services = new ArrayList();rn threadService = Executors.newFixedThreadPool(ports.size());rn for (Integer port : ports) rn rn AppletCallMonitor service = new AppletCallMonitor();rn //if(registedport.contains(port)) continue;rn //registedport.add(port);rn System.out.println(port.intValue());rn service.setPort(port.intValue());rn service.setAppCallDAO(appCallDAO);rn services.add(service);rn threadService.execute(service); rn rnrn rnrn rn public void afterPropertiesSet() throws Exception rn showData();rn rnrn public void setAppCallDAO(AppCallDAO appCallDAO) rn this.appCallDAO = appCallDAO;rn rnrn rnrnrnclass AppProprn rn /**rn * 取服务端口rn * @returnrn */rn public static List getPorts()rn rn List ports=new ArrayList();rn Properties props=getProperties();rn if(props == null)rn return ports;rn String[] portstrs=props.getProperty("PORT","").split(",");rn for(String port:portstrs)rn int iport=0;rn tryrn iport=Integer.valueOf(port);rn catch(Exception e) rn rn if(iport > 0)rn ports.add(new Integer(iport));rn rn rn return ports; rn rn rn private static Properties getProperties()rn FileInputStream fstream = null; rn try rn fstream = new FileInputStream("E:\\avetti\\workspace-a\\stmNEW\\Target\\WebRoot\\appCall.properties");rn Properties prps = new Properties();rn prps.load(fstream);rn return prps;rn catch(Exception e)rn System.out.println(e);rn return null;rn rn finallyrn tryrn fstream.close();rn catch(Exception e)rn rn rn rnn[b]问题补充:[/b]nmy-servlet.xmlrnrnrn rnn[b]问题补充:[/b]n照lovewhzlq这样设置了依赖关系,还是会执行两次。 不知道什么原因n[b]问题补充:[/b]n是这样的,AppCallService implements InitializingBean 后,afterPropertiesSet里面的 showData() 方法执行了两次。后台信息不会影响吧,因为 我把showdata方法只在控制台输出1句话,它也会执行两次。 我在网上看到的那个提示,也是在讨论InitializingBean (文章提出InitializingBean 会执行两次,是因为BEAN没有单例)和init-method 分别该怎么用。 我都试用过了,都会执行两次。n[b]问题补充:[/b]nto: lovewhzlqrn 没有。 我想继承InitializingBean之后, 就没在其他BEAN去注入过了 。现在我用了一个private static final List registedport = new ArrayList(); rn来判断是否已经是配置过的端口号。所以占时能解决问题,但是调用两次。总是觉得不安全啊 问答

没有更多推荐了,返回首页