当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪Spring攻略学习笔记(1.11)------用XML配置自动装配Bean                 当一个Bean需要访问另一个Bean时,可以显示指定引用装配它。但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦。   &.........
    ▪Linux中的popen-pclose       popen Linux C   进程I/O函数,与pclose函数一起使用。 表头文件   #include <stdio.h> 函数定义   FILE * popen ( const char * command , const char * type );   int pclose (.........
    ▪JZMQ消息队列框架安装配置文档       ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,  大大简化了编程人员的复杂度,被称为史上最强大的消.........

[1]Spring攻略学习笔记(1.11)------用XML配置自动装配Bean
    来源: 互联网  发布时间: 2013-11-19

           当一个Bean需要访问另一个Bean时,可以显示指定引用装配它。但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦。

      Spring IoC容器能够帮助你自动装配Bean。只要在<bean>的autowire属性中指定自动装配模式就可以了。以下是Spring 3.X支持的自动装配模式。

         no:不执行自动装配。必须显示装配依赖

        byName:对于每个Bean属性,装配一个同名的Bean。

         byType:对于每个Bean属性,装配类型与之兼容的一个Bean。如果找到超过一个Bean,将抛出UnsatisfiedDependencyException异常

         constructor:对于每个构造函数参数,首先寻找与参数兼容的Bean。然后选择具有最多匹配参数的构造函数。对于存在歧义的情况,将抛出UnsatisfiedDependencyException异常。

        默认模式是no,但可以设置<beans>根元素的default-autowire属性修改。这个默认模式将被Bean自己指定的模式覆盖。

        注:Spring 3.X不支持autodetect自动装配模式,使用@Autowired注解代替。

        尽管自动装配功能非常强大,但代价是降低了Bean配置的可读性。因为自动装配由Spring在运行时执行,你无法从Bean配置文件中得到Bean装配的方式。建议仅将自动装配应用到组件依赖不复杂的应用程序中。

(1)按照类型自动装配

         可以将sequenceGenerator这个Bean的autowire属性设置为byType并且不设置prefixGenerator属性。然后Spring将试图装配类型与PrefixGenerator兼容的Bean。在这个例子中,将自动装配datePrefixGenerator。

<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator" autowire="byType">		    
   <property name="initial" value="100000" />
   <property name="suffix" value="A" />
</bean>
		
<bean id="datePrefixGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.DatePrefixGenerator">
   <property name="pattern" value="yyyyMMdd" />
</bean>

        按照类型装配的主要问题是有时候在IoC容器中有超过一个与目标类型兼容的Bean。在这种情况下,Spring将无法确定哪个Bean最适合于该属性,因此会抛出异常.

<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="byType">
    <property name="initial" value="100000" />
    <property name="suffix" value="A" />
</bean>
    
<bean id="datePrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator">
    <property name="pattern" value="yyyyMMdd" />
</bean>
    
<bean id="yearPrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.YearPrefixGenerator">
    <property name="pattern" value="yyyy" />
</bean>
         运行程序,抛出UnsatisfiedDependencyException异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sequenceGenerator' defined in class path resource [applicationContext.xml]: Unsatisfied dependency expressed through bean property 'prefixGenerator': : No qualifying bean of type [com.codeproject.jackie.springrecipesnote.springioc.PrefixGenerator] is defined: expected single matching bean but found 2: datePrefixGenerator,yearPrefixGenerator; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.codeproject.jackie.springrecipesnote.springioc.PrefixGenerator] is defined: expected single matching bean but found 2: datePrefixGenerator,yearPrefixGenerator
  (2)按照名称自动装配

        byName是另一种自动装配模式。Spring将试图装配一个与属性名相同的Bean,而不是兼容的类型,这样能解决按照类型的自动装配的问题。

<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="byName">
    <property name="initial" value="100000" />
    <property name="suffix" value="A" />
</bean>
    
<bean id="prefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator">
    <property name="pattern" value="yyyyMMdd" />
</bean> 
按照名称的自动装配并不能工作于任何情况。有时候不可能使目标Bean的名称与属性相同。在实践中,往往需要在保持其他依赖自动装配的同时明确指定歧义的依赖。这意味着混合了显示装配和自动装配。

(3)按照构造程序自动装配

        constructor自动装配模式相对byType模式更复杂一些。对于具有单个构造程序的Bean,Spring将试图为每个构造程序参数装配一个类型兼容的Bean。但对于具有多个构造函数的Bean,Spring首先试图为每个构造函数的每个参数找到一个类型兼容的Bean,然后将选择具有最多匹配参数的构造函数。

      假定SequenceGenerator有一个默认的构造函数和一个具有PrefixGenerator参数的构造函数

    public SequenceGenerator() {

    }

    public SequenceGenerator(PrefixGenerator prefixGenerator) {
        this.prefixGenerator = prefixGenerator;
    }
      在这种情况下,第二个构造函数匹配并被选中,因为Spring可以找到一个类型与PrefixGenerator兼容的Bean。

<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="constructor">
    <property name="initial" value="100000" />
    <property name="suffix" value="A" />
</bean>
    
<bean id="datePrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator">
    <property name="pattern" value="yyyyMMdd" />
</bean>
      如果使用这种装配模式,需要避免构造函数歧义。

作者:jackiehff 发表于2013-4-22 16:04:09 原文链接
阅读:66 评论:0 查看评论

    
[2]Linux中的popen-pclose
    来源: 互联网  发布时间: 2013-11-19
popen
Linux C   进程I/O函数,与pclose函数一起使用。 表头文件   #include <stdio.h> 函数定义   FILE * popen ( const char * command , const char * type );
  int pclose ( FILE * stream ); 函数说明   popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
  type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。
  command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。
  popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen 的进程相同。 返回值   如果调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流。 返回错误   popen 没有为内存分配失败设置 errno 值。
  如果调用 fork() 或 pipe() 时出现错误,errno 被设为相应的错误类型。
  如果 type 参数不合法,errno将返回EINVAL。 使用举例   if((fp=popen("/usr/bin/uptime","r"))==NULL);
  {
  sprintf(buf,"error: %s\n", strerror(errno));
  ....//异常处理
  }
  else
  {
  ....
  pclose(fp);
  }
#define _LINE_LENGTH 300
  int get_path_total(const char *path, long long* total) {
  int err=-1;
  FILE *file;
  char line[_LINE_LENGTH];
  char *p;
  char tmp[100];
  char *token;
  sprintf(tmp, "df %s", path);
  file = popen(tmp, "r");
  if (file != NULL) {
  if (fgets(line, _LINE_LENGTH, file) != NULL) {
  if (fgets(line, _LINE_LENGTH, file) != NULL) {
  token = strtok(line, " ");
  if (token != NULL) {
  // printf("token=%s\n", token);
  }
  token = strtok(NULL, " ");
  if (token != NULL) {
  // printf("token=%s\n", token);
  *total=atoll(token)/1024;//k/1024
  err=0;
  }
  }
  }
  pclose(file);
  }
  return err;
  }

popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也相应的 是只读 或者 只写.

command 参数 是 一个 字符串指针, 指向的是一个 以 null 结束符 结尾的字符串, 这个字符串包含 一个 shell 命令. 这个命令 被送到 /b

    
[3]JZMQ消息队列框架安装配置文档
    来源: 互联网  发布时间: 2013-11-19

ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,
 大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,30s内完成消息的传输,能够兼容多个平台,多种语言,
 可以使用多种方式实现N对N的Socket连接。
 
 /****************************window平台下JAVA开发jzmq的配置*************************************/
1. 将 Jzmq.dll 与 Libzmq.dll 放入 %JAVA_HOME%/bin 目录下

2. 将 Zmq.jar 包导入自己所创的项目中

即可运行。(前提是电脑中已配置好了java所需的环境变量JAVAHOME)

完成1和2之后如果程序仍然不能运行,试着打印一下,确认 Jzmq.dll 与 Libzmq.dll放到了正在使用的JDK/bin目录下
System.out.println(System.getProperty("java.library.path"));

/***************************************出现问题*****************************************************/

如果一直提示C:\Program Files\Java\jre6\bin\jzmq.dll: Can't find dependent ...说明你的系统缺少相应的DLL文件。千万不要一个一个在网上下载。
因为Jzmq.dll依赖的库文件实在太多了。可直接安装Microsoft .NET Framework v2.0 和Microsoft .NET Framework v3.5也可安装下vs2008 或VS2010,
安装完后,需重起电脑,再运行程序。

/*************************************使用方法-使用REQ模式进行主机间通信*********************************/

请看例子程序jzmq.war里的Hwserver.java 和Hwclient.java

服务器端(Hwserver.java)
1. 创建上下文, 初始化一个ZMQ.Context
2. 创建一个socket,通过context.socket(ZMQ.REP);//相应的zermq的socket, 比如req, rep, pair, push, pull...等等,本例创建REP类型
3. 绑定到端口
4. 无限循环,等待接受客户端请求

客户端(Hwclient.java)
1. 创建上下文, 初始化一个ZMQ.Context
2. 创建一个socket,通过context.socket(ZMQ.REQ);;//相应的zermq的socket, 比如req, rep, pair, push, pull...等等,本例创建REQ类型
3. 绑定到端口
4. 发送报文和接收应答

REP/REQ模式介绍

REP/REQ这种模式是双向的,应答模式。也就是说是一个请求一个响应,不能发送多个消息,显然这种应答模式的效率很低!
 这种模式的通信过程是:
1. 创建ctx上下文对象,该对象会创建io_thread并启动它们,采用reactor模型作为poller不断轮询。线程间的通信使用mailbox来通信,而mailbox其实本质上就是一个双向的socketpair。

2. 创建zmq_socket对象,如果是client就使用connector去连接,如果是server就使用listener去监听。

3. connetor或者listener会创建除zmq_init_t对象,后者作为identity交换。

4. 结束上述的初始化之后会创建相应的session_t对象,并且关联相应的读/写管道,plugin zmq_engine, 进行真正的消息数据的读写。

5. 消息数据的读写是异步的,即调用zmq::zmq_send()和zmq::zmq_recv()只是将消息数据写到相应的管道中去。而session_t会在poller轮询到相应的读写事件的时候从管道里面读写消息数据。

作者:huahaoing 发表于2013-4-23 16:59:38 原文链接
阅读:50 评论:0 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3