`
seadragonnj
  • 浏览: 57152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入研究xwork(-)

阅读更多
一直想通过研究别人好的代码来提高自己的水平,可是一直没有坚持下去,Hibernate看了几天实在看不明白放弃了,roller、jive也是半途而废,基本什么也没有学到,甚至可以说根本就没看明白,这次又做出学习xwork的决定,同时决定把学习的过程和学习成果写出来,也算是对自己的一个督促吧,
关于xwork我就不介绍了,网上多的是(关键是我自己的功课也没做好),
废话不说了!!!!把这两天看的东西写下来,先重一个例子说起,
1.随便写两个接口(我真的是随便写的,呵呵):
java 代码
  1. interface IPerson {
  2. public void say();
  3. }
  4. interface IUserPerson {
  5. public void say();
  6. }
2.它们的实现类
java 代码
  1. public class Person implements IPerson{
  2. public Person(){}
  3. public void say(){
  4. System.out.println("person");
  5. }
  6. }
  7. /////////////////////////////////////////////
  8. public class UserPerson implements IUserPerson{
  9. private IPerson person;
  10. public IPerson getPerson() {
  11. return person;
  12. }
  13. //这个注释就是说明需要依赖注入的
  14. @Inject
  15. public void setPerson(IPerson person) {
  16. this.person = person;
  17. }
  18. public void say(){
  19. System.out.println("userperson");
  20. person.say();
  21. }
  22. }
3.最后一步:!!!
java 代码
  1. import com.opensymphony.xwork2.inject.Container;
  2. import com.opensymphony.xwork2.inject.ContainerBuilder;
  3. public class ContainerTest {
  4. private Container container;
  5. public static void main(String[] args) {
  6. ContainerTest test=new ContainerTest();
  7. // test.setContainer(new ContainerBuilder().factory(ActionProxyFactory.class, DefaultActionProxyFactory.class).create(true));
  8. test.setContainer(new ContainerBuilder().factory(IPerson.class,Person.class).factory(IUserPerson.class,UserPerson.class).create(true));
  9. Container container=test.getContainer();
  10. IUserPerson person=container.getInstance(IUserPerson.class);
  11. person.say();
  12. }
  13. public Container getContainer() {
  14. return container;
  15. }
  16. public void setContainer(Container container) {
  17. this.container = container;
  18. }
下面对这个例子进行深入解析:
先来看一下在
java 代码
  1. new ContainerBuilder()
这个对象是发生了什么
java 代码
  1. public ContainerBuilder() {
  2. // In the current container as the default Container implementation.
  3. factories.put(Key.newInstance(Container.class, Container.DEFAULT_NAME),
  4. CONTAINER_FACTORY);
  5. // Inject the logger for the injected member's declaring class.
  6. factories.put(Key.newInstance(Logger.class, Container.DEFAULT_NAME),
  7. LOGGER_FACTORY);
  8. }
factories是一个Map类型的变量

这两行代码的目的就是把一个ContainerImpl的实现放到这个Map中(实际上并没有new一个对象,只有在用到的时候这个对象才个真正的实例化,在这里只是放入一些必要信息)。
关键来看一下factory(...)方法:
在factory(..)执行的过程中,它会执行
java 代码
  1. final InternalFactoryextends T> scopedFactory =
  2. scope.scopeFactory(key.getType(), key.getName(), factory);
  3. factories.put(key, scopedFactory);
这段代码,它就是把一些创建对象的必要信息放到factories中,
Key也是用来保存信息的,通过Key.newInstance(type, name)来创建一个Key对象,这里的type就是上面传入的IPerson.class,在这里有一个重要的地方就是factory的创建,它是通过下面的代码完成的
java 代码
  1. InternalFactoryextends T> factory = new InternalFactory<t>() { </t>
  2. volatile ContainerImpl.ConstructorInjectorextends T> constructor;
  3. @SuppressWarnings("unchecked")
  4. //这个方法在调用ContainerImpl中的getInstance时会被调用
  5. public T create(InternalContext context) {
  6. if (constructor == null) {
  7. this.constructor =
  8. context.getContainerImpl().getConstructor(implementation);
  9. }
  10. return (T) constructor.construct(context, type);
  11. }
  12. public String toString() {
  13. return new LinkedHashMap
  14. put("type", type);
  15. put("name", name);
  16. put("implementation", implementation);
  17. put("scope", scope);
  18. }}.toString();
  19. }
  20. };
这里的关键就是create(..)这个方法的实现,将来在实例化对象的时候会用到!
分享到:
评论
1 楼 liuyuanhui0301 2012-07-25  
 

相关推荐

Global site tag (gtag.js) - Google Analytics