sioc帮助 




作者:陈原   mail:cayu@gzec.com.cn   QQ:39793751    home: http://www.jspx.net

1.简介
  1. 本人一直使用Spring 作为ioc容器,但还是感觉不够完美,
    Spring的包太多,文件太大,我希望得到的程序尽可能的小,不想使用太多不使用的包.虽然Spring已经为你分好了包,但还是够大.Spring已经不是一个轻量级的构架,
    它已经够重,够威力了,但对于我来说,并不需要这么夸张的构架,Spring的创建速度并不理想,我使用sioc和Spring ioc 各创建 Bean 20000次,sioc的速度都优于Spring.
    其他的Ioc比如PicoContainer,Google guice这些功能比较弱不太适合比较复杂的软件项目使用.

  2. 当然也有不少比较优秀的Ioc容器,不同的Ioc有不同的设计思想,你感兴趣可以看看这里,不选最好的,选择适合自己的,各先所爱吧.
  3. 主要想将sioc开发成一个小巧,快速的ioc容器,以后的升级中主要是在优化速度,并尽量小巧.
2.功能特点说明
  1. 支持配置文件.
  2. 支持AOP拦截
  3. 动态代理和代理创建
  4. 动态注册配置,如果不想使用XML来配置可以使用动态注册。
3.配置说明
<?xml version="1.0" encoding="UTF-8"?>
<sioc namespace="global">
   <bean name="类名,用来调用,不要代有'.'" class="创建的类路径" create=
"创建方法" singleton="是否为单列(true,false)">
        <string name="参数名">参数值</string>
   </bean>
   <include>包含其他的配置文件</include>
</sioc>

name和id是一样的,只是为了兼容spring的结构。
上边<sioc namespace="global"> 中 global表示命名空间,默认命名空间就是 global,这样你就可以在多个软件项目中为你的bean分类了. <bean name="类名,用来调用" class="创建的类路径" singleton="是否为单列(true,false)"> 这部分和Spring的配置 很相似,但参数配置上为了支持类型转换,感觉清晰改用了变量名称来转换.

支持类型表
<string name="参数名">参数值</string> 字符串
<int name="参数名">参数值</int>   或者integer 整数
<boolean name="参数名">参数值</boolean> 或者bool 布尔
<long name="参数名">参数值</long> 长整型
<float name="参数名">参数值</float> 单精度
<double name="参数名">参数值</double> 双精度
<date name="参数名">参数值</date> 日期
<ref name="参数名">参数值</ref> ioc中配置的其他bean
<array name="参数名" class="单个参数类型(string,int,boolean...)">
    <value>参数值1</value>
     <value>参数值1</value>
</array>
数组参数 class部分填写string,int,long,boolean,....
<map name="参数名">
 <value key="键值1" class="本参数类型">参数值1</value>
 <value key="键值2" ref="是否为bean资源(true,false)">参数值1</value>
</map>
map 类
<list name="参数名" class="单个参数类型(string,int,boolean...)">
    <value>参数值1</value>
    <value>参数值1</value>
</list>
list 类


4.初始化部分
系统的初始化部分代码。

实际使用中我们不需要这么复杂来初始化。实际使用的时候是整合在一块的。只需要初始化构架后就可以使用了。
如果在tomcat,resin这些容器中只要配置了过滤,或者servlet就会自动初始化了。
如果是应用可以使用下边代码初始化。JspxNetApplicaion.autoRun();
5.高级例子
因为基本用法很象Spring ,也比较简单我主要做一个aop 带拦截的例子给大家.

配置文件 ioc.xml

<?xml version="1.0" encoding="UTF-8"?>
<sioc namespace="global">
    <bean name="realSubject" class="com.jspx.sioc.test.RealSubject" singleton="true">
    </bean>

    <bean name="testAopBean" class="com.jspx.sioc.test.TestAopBean" singleton="true">
    </bean>

    <bean name="testInterceptor" class="com.jspx.sioc.test.TestInterceptor" singleton="true">
    </bean>

    <bean name="subject" class="com.jspx.sioc.aop.AopDynamicProxy" create="proxy" singleton="false">
       <ref name="target">realSubject</ref>
       <ref name="aopBean">testAopBean</ref>
       <ref name="methodInterceptor">testInterceptor</ref>
    </bean>
</sioc>



被拦截和AOP的类

package com.jspx.sioc.test;


public class RealSubject implements Subject
{
       public RealSubject()
       {

       }

       public String request()
       {
           System.out.println("真实运行,如果被拦截就不会运行这里了");
           return "真实运行";
       }
}

AOP类(用的地方很多,可以用在权限,日志等)

package com.jspx.sioc.test;

import com.jspx.sioc.AopBean;

import java.lang.reflect.Method;

public class TestAopBean implements AopBean
{
     public void before(Object proxy, Method method, Object[] args)
     {
          System.out.println("开始before calling " + method);
     }
    
     public void after(Object proxy, Method method, Object[] args)
     {
          System.out.println("结束after calling " + method);
     }

}

拦截器(一般主要用在缓存上)

package com.jspx.sioc.test;

import com.jspx.sioc.MethodInterceptor;
import java.lang.reflect.Method;

public class TestInterceptor implements MethodInterceptor
{
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
     {
          //args 你调用的方法参数
          System.out.println("你调用的方法名:" + method.getName());
          return "拦截和就返回这个变量";
         //如果不拦截,就运行下边的方法,可以得到拦截方法的返回值
         // return method.invoke(proxy,args);
     }
}

调用代码

String fileName = "ioc.xml";
EntryFactory beanFactory = new EntryFactory();
beanFactory.setIocContext(new ConfigureContext(fileName));
Subject subject = (Subject) beanFactory.getBean("subject");
System.out.println("end:" + subject.request());

6.动态注册

        LifecycleObject lifecycleObject = new LifecycleObject();
        lifecycleObject.setName("调用名称");
        lifecycleObject.setClassName("创建的类名");
        lifecycleObject.setSingleton(true);
        //设置其他属性
        beanFactory.registerSingletonBean(lifecycleObject.getName(),"命名空间",lifecycleObject);

如果你希望多例模式的时候延时载入其他配置的bean你可以设置变量为:  siocLoad:调用名$命名空间
这样的格式.

7.Sioc 中唯一的 annotation,ref

String name(); //sioc中的名称

String namespace() default "global"; //命名空间

boolean test() default false; //载入的时候如果为true,并且没有这个对象的时候不报错,否则会报错误






8.AOP Bean

AOP Bean是当系统启动的时候会运行一次init,当系统结束的时候(正常推出)会运行一次destroy,一些后台定时服务可以写成bean放在这里。
有点相window的后台服务。例如你想和spring 一起使用,可以在这里,载入spring 的配置启动他,这样不用在web.xml里边配置,干净很多。


可以在sioc中配置,beanArray部分就是你加入其他需要这样执行的地方。



<!--Aop Boost begin-->

<bean id="aopBootBean" class="com.jspx.sioc.aop.AopAppCommandImpl" singleton="true">
<bool name="enable">${aopboot}</bool>
<array name="beanArray" class="string">
<value>aopSchedulerTask</value>
</array>
</bean>
<bean id="aopSchedulerTask" class="com.jspx.task.AopSchedulerTask" singleton="true">
<int name="sleepTime">58</int>
<ref name="soberFactory">jspxSoberFactory</ref>
</bean>

<!--Aop Boost end-->
接口如下


public abstract class AbstractAopBean implements AopAppBean
{
    public static final java.lang.String SUCCESS = "success";
    public static final java.lang.String NONE = "none";
    public static final java.lang.String ERROR = "error";
    public static final java.lang.String INPUT = "input";
    public static final java.lang.String LOGIN = "login";

    public abstract java.lang.String init() throws java.lang.Exception;

    public abstract java.lang.String destroy() throws java.lang.Exception;

}


9.什么时候使用单列

很多人不明白什么时候使用单列,什么时候使用多态,其实很简单,单列不会释放内存,一直存在内存中。如果你的程序中都使用一个bean对象。并且不会在bean中
根据其他变量来计算,并且bean里边没有大数据保存,那么你就应该使用单列。单列的运行速度也很快。
一般简单的DAO这些都应该使用单列比较好,但如果你的DAO中还要区分命名空间来处理数据,那么就应该使用多例。