spring 03-Spring开发框架之控制反转

Posted 广州富哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 03-Spring开发框架之控制反转相关的知识,希望对你有一定的参考价值。

控制反转原理

测试接口程序

package cn.liang.service;
public interface IMessageService {
  public String getInfo() ;
}
package cn.liang.service.impl;
import cn.liang.service.IMessageService;
public class MessageServiceImpl implements IMessageService {
  @Override
  public String getInfo() {
      return "helloliang";
  }
}

原始对象调用

  • 在java开发中需要通过使用关键字new来进行对象产生,耦合度加深。
  • new是造成代码耦合度关键的元凶
package cn.liang.test;
import cn.liang.service.IMessageService;
import cn.liang.service.impl.MessageServiceImpl;
public class TestMessage2 {
  public static void main(String[] args) {
      IMessageService msg = new MessageServiceImpl();
      System.out.println(msg.getInfo());
  }
}
  • 可以通过引入一个专门负责具体操作的代理公司开发,这样可以避免关键字new
package cn.liang.service;
import static org.hamcrest.CoreMatchers.nullValue;
public class ServiceFactory {
  public static IMessageService getInstance(String className) {
      IMessageService msg = null;
      try {
          msg = (IMessageService) Class.forName(className).newInstance();
      } catch (Exception e) {
          e.printStackTrace();
      }
      return msg;
  }
}
package cn.liang.test;
import cn.liang.service.IMessageService;
import cn.liang.service.ServiceFactory;
public class TestMessage3 {
  public static void main(String[] args) {
      IMessageService msg = ServiceFactory.getInstance("cn.liang.service.impl.MessageServiceImpl");
      System.out.println(msg.getInfo());
  }
}

使用Spring开发框架进行代理

修改applicationContext.xml配置文件:

<bean id="msg" class="cn.liang.service.impl.MessageServiceImpl"/>

编写测试程序代码类

  • 现阶段是通过java程序启动了Spring容器,后面可以利用WEB容器来启动Spring容器
  • 最后整个阶段不会看见任何的关键字new的出现
package cn.liang.test;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.liang.service.IMessageService;
import junit.framework.TestCase;
public class TestMessageService {
  private static ApplicationContext ctx = null ;
  static {    // 静态代码块优先于所有的代码执行,目的是为了静态属性初始化
      ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  }
  @Test
  public void testGetInfo() {
      IMessageService msgService = ctx.getBean("msg", IMessageService.class);
      Logger.getLogger(TestMessageService.class).info(msgService.getInfo());
      TestCase.assertEquals(msgService.getInfo(), "helloliang");
  }
}

以上是关于spring 03-Spring开发框架之控制反转的主要内容,如果未能解决你的问题,请参考以下文章

Java实战之03Spring-02Spring的核心之IoC

SSM之SpringIOC

Java实战之03Spring-05Spring中的事务控制(基于AOP)

Spring知识点总结之Spring IOC

spring源码-bean之初始化-1

Spring框架2:程序解耦和控制反转(IOC)