需要xwork-core-2.3.1.jar包。
1、Xwork2的容器类为Container它只是一个接口。它的子类ContainerImpl设置为受保护的类,外部程序不可以访问。
2、@Inject是Xwork2的注解类,用于在运行时注入受Xwrok管理的对象。
3、ContainerBuilder类为Xwork2的工具类,用于创建Container容器对象。
由于Struts2的底层实现为xwork2,所以有必要小小的研究以下xwrok2管理容器的注入值的方式。
以下是示例代码:
示例1:最简单的用容器管理一个对象的创建:
package tt;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
/**
* XWork的容器框架
* @author <a href=mailto:[email protected]>穆永超</a>
* @version 1.0 2013-3-26
*/
public class XWorkContainerDemo {
public static void main(String[] args) {
//XWork的容器框架,声明容器构建对象
ContainerBuilder cb = new ContainerBuilder();
//设置一个被管理对象
cb.factory(Person.class);
//创建容器
Container c = cb.create(true);
//从容器中获取被容器创建的对象。以下代码,每次都会创建一个新对象
Person p = c.getInstance(Person.class);
//调用对象的方法
p.say();
}
}
//声明一个被管理对象
class Person{
public void say(){
System.err.println("Hello");
}
}
运行结果,即是输出Hello。
示例2:最简单的使用@Inject注入:
package tt;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Inject;
/**
* XWork的容器框架
* @author <a href=mailto:[email protected]>穆永超</a>
* @version 1.0 2012-4-18
*/
public class XWorkContainerDemo2 {
public static void main(String[] args) {
//声明容器构建对象
ContainerBuilder cb = new ContainerBuilder();
//设置被管理对象
cb.factory(Tom.class);
//设置一个被管理的常量,key为name值为Jack
cb.constant("name","我的名称是Jack");
//创建容器
Container c = cb.create(true);
//从容器中获取Tom的实例
Tom t = c.getInstance(Tom.class);
//调用say方法
t.say();
}
}
class Tom{
//注意此处,注入name的值
@Inject(value="name")
private String name;
public void say(){
//以下将输出Hello>Jack
System.err.println("Hello>"+name);
}
}
输出的结果为:
Hello>我的姓名是Jack
示例3:声明接口及实现类,通过构造方法注入
package tt;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Inject;
/**
* XWork的容器框架
* @author <a href="mailto:mailto:[email protected]>穆永超</a>
* @version 1.0 2012-4-18
*/
public class XWorkContainerDemo3 {
public static void main(String[] args) {
ContainerBuilder cb = new ContainerBuilder();
cb.factory(IAnimal.class,Cat.class);//这两个类上必须要有继承关系
cb.factory(IFood.class,Fish.class);
Container c = cb.create(true);
IAnimal cat = c.getInstance(IAnimal.class);
cat.eat();
}
}
interface IAnimal{ //声明接口
public void eat();
}
class Cat implements IAnimal{
private IFood food;
/**
* 如果要通过构造方法注入
* 则必须要要构造方法上,和参数上同时添
* Inject注解
*/
@Inject
public Cat(@Inject IFood food) {//构造中的参数,按类型进行匹配
this.food=food;
}
public void eat() {
System.err.println("小猫在吃:"+food);
}
}
interface IFood{}
class Fish implements IFood{
public String toString() {
return "我是小鱼";
}
}
输出的结果为:小猫在吃:我的小鱼ao