Jfire-Core 框架API文档
Jfire-Core框架高性能 IOC容器 AOP框架 依赖注入 控制反转
框架优势功能齐全,注解开发,零配置 性能强大 轻量级,体积小 快速入门首先先有几个类,请看如下代码 package com.jfire.core
@Resource("person")
public class Person {
private String name;
@Resource//通过注解,将home对象的实例注入到person对象的实例中
private Home home;
}
@Resource
public class Home {
private String name;
@Resource
private Address add
}
public class Address {
private string location;
private int num;
}
public static void main(String args[])
{
//给定扫描的包路径,注解了Resource的都会被识别为Bean
JfireContext context = new JfireContextImpl("com.jfire.core");
//手动增加一个bean到容器,并且设置该bean的名称,是否单例,bean使用的类
context.addBean(Address.class.getName(),false,Address.class);
//使用给定的参数进行容器初始化
context.init();
//通过类获取一个类在容器中的实例。该类被注解为单例
Person person = context.getBean(Person.class);
//也可以通过给类设定的bean名称获取到类实例
Person person2 = context.getBean("person");
Home home = person.getHome();
}
代码信息代码托管于oschina,地址是http://git.oschina.net/eric_ds/jfire-core IOC容器定义BeanJfire-core框架将可以被框架管理的类称之为bean。这个bean不要求是严格的JavaBean。因为框架可以接受外来对象实例成为bean。 注解方式定义bean通过注解定义一个bean是非常简单的。只需要在类上面打上 使用配置文件指定一个类为bean可以在配置文件中制定一个类成为bean。参考如下示例代码 {
"beans":
[ { "beanName": "com.jfire.core.test.function.base.data.House",//bean的名称 "prototype": false,//bean是否是原型。原型就是非单例 "className": "com.jfire.core.test.function.base.data.House"//bean的类的全限定名 } ] }
通过JfireContext直接将一个对象制定为bean并且加入框架可以将一个对象实例制定为单例bean并且加入对象容器。参考如下代码 jfireContext.addSingletonEntity("User",new User());//往容器中添加一个名称为User的bean,并且该bean是单例,容器中存储着设置进入的单例供其他类使用
通过配置文件指定一个类成为bean通过配置文件指定一个类成为bean很简单。需要配置的内容如下 "beans": [
{
"beanName": "com.jfire.core.test.function.base.data.House",//定义bean的名称
"prototype": false,//定义bean是否是原型。原型表示非单例
"className": "com.jfire.core.test.function.base.data.House"//bean的全限定名 }
]
容器发现beanIOC容器要使用的第一步就是容器对bean的发现机制。早期Spring采用xml配置的形式,非常繁琐。而现在,主流框架均采用自动发现机制。Jfire一样也支持自动发现。 通过扫描包路径,自动发现beanJfire支持设置包扫描路径,在这些路径下以及子路径的所有类,只要打上 手动添加一个类到容器可以使用代码方式手动添加一个类到容器。有两种不同的情况 增加一个外部对象实例到容器有的时候需要往容器中增加外部对象实例。这些外部示例往往是没有办法接触到源代码或者不是由自己控制初始化的。这些外部实例可以以单例的形式添加到容器中。代码是 依赖注入普通类型注入依赖注入中,最常见的就是类属性的注入。也就是将一个类的实例注入到另外一个类实例的属性中。 public class Person {
@Resource //在这里打上注解表示会将bean名称是"com.test.Home"的bean实例注入到这个属性中。
private com.test.Home home;
@Resource("home1")//这样表示会将bean名称是"home1"的bean注入到这个属性中
private Home home;
}
框架采用名称注入而非类型注入的方式,这样是为了避免错误的使用。在框架中每一个bean都有一个bean名称。在类的属性上打 通过配置文件进行依赖注入通过配置文件进行依赖注入很简单,需要配置的信息如下 @Resource("Per")
public class Person {
}
public class House {
private Person person;
}
然后是配置文件 {
"beanConfigs":
[ { "beanName": "p2","dependencies"://表示house这个bean中有什么属性需要进行依赖注入 { "person":"Per"//每一个键值对都是一个依赖注入。key代表被注入的属性的名称,value表示注入的bean的名称 } } ],"beans":
[ { "beanName": "com.jfire.core.test.function.base.data.House",//定义bean的名称 "prototype": false,//定义bean是否是原型。原型表示非单例 "className":"com.jfire.core.test.function.base.data.House","dependencies"://表示house这个bean中有什么属性需要进行依赖注入 { "person":"Per"//每一个键值对都是一个依赖注入。key代表被注入的属性的名称,value表示注入的bean的名称 } } ] }
List类型注入框架支持List类型的注入。使用场景是多个Bean的类都实现了某一个接口。而有一个bean的属性为 public interface Person {
public String name();
public int age();
}
@Resource
public class Teacher implements Person {
}
@Resource
public class Student implements Person {
}
public class Home {
@Resource//这样的话,实现了接口Person的bean都会被注入到这个list中,但是这个list是需要实现存在的。
private List<Person> pers = new ArrayList();;
}
通过配置进行List注入List注入的配置和依赖注入差不多。如下 "beans":
[
{
"beanName": "com.jfire.core.test.function.base.data.House",//定义bean的名称 "prototype": false,//定义bean是否是原型。原型表示非单例
"className": "com.jfire.core.test.function.base.data.House"//bean的全限定名 "dependencies"://表示house这个bean中有什么属性需要进行依赖注入 { "person":"Per1;Per2;Per3"//每一个键值对都是一个依赖注入。key代表被注入的属性的名称,value表示注入的bean的名称并且采用;号分割每一个被注入的bean名称 } }
]
Map注入框架支持Map类型的注入。先看示例代码 @Resource
public interface Order{}
public class Order1 implements Order {
public String keyName();
}
@Resource
public class Order2 implements Order {
public String keyName();
}
@Resource
public class MapEntity {
@Resource//实现了接口Order的bean都会被注入
@Mapkey("keyName")//所有被注入的bean都有一个无参的keyName方法,使用该方法返回值作为该bean的key
private Map<String,Order> map = new Hashmap();
}
从示例代码可以看出。对Map属性进行注入,除了在属性上使用 通过配置文件进行Map注入在配置文件中,对map类型的字段的写法有两种,不同的写法对应不同的识别方式。 "beanConfigs":
[
{
"beanName": "house","dependencies":
{ "map": "p1:person1|p2:person2" } }
]
设定bean的初始化方法在一些应用场景中存在一些需求,再将bean的实例提供之前,需要运行一个无参的初始化方法。针对这一需求,框架提供了一个注解 @Resource
public class Person {
@InitMethod
public void say(){
System.out.println("你好");
}
public static void main(String args[])
{
JfireContext context = new JfireContextImpl("com.test");
context.getBean(Person.class);//获取到bean的时候就会调用被InitMethod注解了的方法。这里是调用say方法。
}
}
通过配置文件设定bean的初始化方法除了代码中使用注解外,也可以使用配置文件的方式进行bean初始化方法的设置。示例代码如下 {
"beanConfigs": [ { "beanName": "p2","initMethods": [//配置initMethods的信息。内容就是方法的名称 "initage" ] } ] }
容器初始化结束接口bean可以实现容器初始化接口。该接口代码如下 public interface ContextInitFinish extends Order {
/** * 当容器初始化完成后,该接口会被容器调用 * * @author 林斌(eric@jfire.cn) */
public void afterContextInit();
}
接口包含两个方法。一个 参数注入参数注入功能可以在类实例化的时候对属性注入事先制定好的值。支持的类型从基本类型到包装类型以及String和这些类型的数组。在配置文件中,是使用param字段来表示的。看下面的例子 "beanConfigs": //对bean进行配置
[
{
"beanName": "com.entity.Person",//指定要配置的bean的名称
"params": //对bean进行参数注入。 { "name": "test","age": "19","hasHome": "false" } }
]
"attribute":
{
"params":
{ "name": "林斌","age": "25","boy": "true","arrays":"12,123,1234" } }
以逗号区隔,在属性输入的时候会自动的用逗号分隔开注入内容并且完成类型转换后以数组的形式注入 完整配置文件上面的讲述中将所有部分的配置文件都说明到了,现在给出一份完整的配置文件,这样有一个直观的认识。其中需要说明的是,对一个bean进行配置,可以在两个地方进行。 {
"packageNames": //指定要扫描的包路径。会检索该路径和子路径下的所有类 [ "com.jfire.core.test.function.base","cn.starnet.entity" ],"beanConfigs": //对已经在容器中的bean进行额外信息配置 [ { "beanName": "com.entity.Person",//指定要配置的bean的名称,这里的bean是已经在容器中存在的 "params": //配置该bean的参数注入 { "name": "test","hasHome": "false" },"dependencies": //配置该bean的依赖注入 { "home": "com.test.Home","address": "com.test.Address" },"initMethods": //配置该bean的初始化方法 [ "say","initCall" ] } ],"beans": [//配置要加入到容器的bean的信息,基础的包括bean名称,bean是否单例,bean的类的全限定名 { "beanName": "com.jfire.core.test.function.base.data.House",//bean是否原型。原型就是非单例 "className": "com.jfire.core.test.function.base.data.House"//bean使用的类的全限定名 },{ "beanName": "com.jfire.core.test.function.base.data.ImmutablePerson","prototype": false,"className": "com.jfire.core.test.function.base.data.ImmutablePerson","params": //配置该bean的参数注入 { "name": "test","boy": "true" },"initCall" ] } ] }
AOP功能框架带有强大的AOP功能,通过表达式进行路径匹配,可以很方便的对类进行AOP编程。框架中AOP匹配操作分为两个部分。首先需要定义AOP类。定义方式如下 //这个注解表明这个bean是一个AOP增强类。它的值是被织入(被增强,目标 类等都是一个意思的名称)类的类全限定名。这个表达式支持通配符`*`。 * 该符号表示任意长度的任意字符
@EnhanceClass("com.test.*.Action.*")
@Resource//这个注解让框架可以发现这个AOP类
public class Aop {
@BeofreEnhance(value="before()",order=1)//这个是一个前置拦截,表示要拦截的方法的名称是before,没有入参,order属性用于排序,如果有多个拦截方法同时对一个方法进行拦截。使用自然顺序进行排序
public void before(ProceedPoint point){}
}
AOP增强是两个步骤。
方法确定 还有一些方法在特定的增强中才有意义,下面逐一讲解。 前置增强前置增强使用注解 后置增强后置增强使用注解 异常增强异常增强使用注解 环绕增强环绕增强使用注解 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |