zoukankan      html  css  js  c++  java
  • Apusic Operamasks的资源注入

    ★ 什么是资源?
    开发过程中与业务无关的服务、类的实例或者变量的值。比如:Apusic J2EE应用服务器管理的JDBC服务是资源,用户开发的EJB、WebService是资源、用户定义的配置文件也是资源。


    ★ 为什么要资源注入?
    大多数企业级java应用程序都使用了诸如DataSources,EJBs或WebService的外在的资源和服务,在J2EE 1.4中,用户必须在部署描述符中明确声明所依赖的资源或者使用JNDI的lookup方法去获得资源的引用。

    最初目的是为了减少应用与资源的依赖度,具体可以参考IoC(控制反转)和DI(依赖注入),但现在作者认为优点很多:
    1. 减少应用与资源的依赖度,便于应用的后期组装。例如:将数据库连接池在后期组装时作为资源注入到系统中,这样使应用在开发过程中不会与资源绑定。
    2. 简化应用的复杂度,使程序员开发中更多关注业务。例如:通过标注将资源在变量定义的时候注入进去,开发人员直接可以使用变量,而无须再通过代码获得。
    3. 规范应用的开发过程,提升应用后期运行的稳定性。例如:通过注入的方式使用资源,而无须在开发期管理资源的生命周期以及创建与销毁,避免出现重复创建或者内存泄漏。

    ★ 哪些资源可以注入?
    数据源、JMS目的地、环境变量、EJB、WebService、上下文资源、Managed Bean、Spring Bean、LocalString

    ★ 如何注入和使用资源?
     // Apusic系统日志,采用的是JDK 1.4的日志系统
     @Inject
     private java.util.logging.Logger logger;
     public void IndexBean() {
      logger.info("初始化IndexBean!");
     }

        // JavaServer Faces的相关资源
     // JSF的FacesContext
     @Inject
     private javax.faces.context.FacesContext fContext;
        // 获取应用的HttpRequest
        HttpServletRequest request=(HttpServletRequest)fContext.getCurrentInstance().getExternalContext().getRequest();
        // 获取应用的HttpResponse
        HttpServletResponse request=(HttpServletResponse)fContext.getCurrentInstance().getExternalContext().getResponse();
        // 获取应用的HttpSession
        HttpSession session=(HttpSession) fContext.getCurrentInstance().getExternalContext().getSession(true);
        // JSF的服务器实例
     @Inject
     private javax.faces.application.Application app;
     // JSF的导航句柄
     @Inject
     private javax.faces.application.NavigationHandler nHandler;
     // JSF的EL表达式工厂实例
     @Inject
     private javax.el.ExpressionFactory expFactory;
     // JSF的事件广播者实例
     @Inject
     private org.operamasks.faces.event.EventBroadcaster event;
     // 相同生命周期的ManagedBean,参考CRUD例子
     @Inject
     private IndexBean indexBean;

     // JNDI资源注入
     // 数据库连接池资源注入
     @Resource(mappedName = "jdbc/CRUD")
     private javax.sql.DataSource CRUD;
       Connection con = CRUD.getConnection();
     // 消息工厂资源注入
     @Resource(mappedName="jms/ConnectionFactory")
     private javax.jms.ConnectionFactory connFactory;
     // 消息主题资源注入
     @Resource(mappedName="testTopic")
     private javax.jms.Topic topic;
     // 消息队列资源注入
     @Resource(mappedName="testQueue")
     private javax.jms.Queue queue;
     // 事务服务资源注入,一个线程只提供一个事务服务,因此不需要提供名称直接可以注入
     @Resource
     private javax.transaction.UserTransaction tx;
     
     // EJB资源注入
     @EJB(name="com.apusic.examples.crud.second.service.PersonService")
     IPersonService personService;
     
     // 资源文件的注入,注意:只能注入前缀为LocalStrings的文件组
     @LocalString
     private Map<String, String> messages;
     messages.get("WindowBean.email.required");
     
        // 配置文件注入上下文资源
        在faces-config.xml中在需要注入的bean中加入managed-property属性和值
     <managed-bean>
      <managed-bean-name>windowBean</managed-bean-name>
      <managed-bean-class>
       com.apusic.examples.crud.second.bean.WindowBean
      </managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
      <managed-property>
       <property-name>injectName</property-name>
       <property-class>java.lang.String</property-class>
       <value>Operamasks</value>
      </managed-property>
     </managed-bean>
     在WindowBean.java中直接定义
     private String injectName;
     public void setInjectName(String injectName) { // 通过这个函数提供资源注入
      this.injectName = injectName;
     }
    ★ 参考资料
    http://www.matrix.org.cn/resource/article/2006-04-05/Dependency+Injection_44321.html

    ★ 备注
    本文现在只介绍了基础资源注入知识,随着作者本人对资源注入的理解,将会继续补充与完善。

  • 相关阅读:
    查询Python支持的.whl格式
    内置模块之os
    内置标准库之time
    迭代器(iterator)
    STM32F103和SIM800L打造低成本短信转发系统(五):控制程序
    STM32F103和SIM800L打造低成本短信转发系统(四):MDK-ARM
    STM32F103和SIM800L打造低成本短信转发系统(三):STM32CubeMX
    STM32F103和SIM800L打造低成本短信转发系统(二):软件安装篇
    STM32F103和SIM800L打造低成本短信转发系统(一):硬件篇
    处理SIM800L模块的时间字符串之URL编码(百分号编码)
  • 原文地址:https://www.cnblogs.com/zhuyx/p/10401957.html
Copyright © 2011-2022 走看看