Spring中IOC,控制反转(二)——带x…

来源:互联网 发布:小额贷款骗局知乎 编辑:程序博客网 时间:2024/06/05 14:57
  在这个教程中,我们通过xml文件注册各色ClassFactory(类工厂),并让Spring来根据需要调用他们。接着上一节的思维,我们知道Spring是管理这个Class Factory的。所以当有了许多ClassFactory以后,我们常理思维可以想像到,我们需要一个list(列表)来存储这么多工厂名字,方便到时候找并调用。于是这一节开始,我们有了一个xml文件叫做beans.xml。文件名其实是随意的,可以看到后期Spring框架与其他框架整合的时候,大部分人喜欢用applicationContext.xml来命名。实际上,xml文件里面写满beans(豆豆)并且被Spring调用来解析的,都可以称为Spring的配置文件。
  我们看看这节完成后Netbeans项目里面的目录结构:
Spring中IOC,控制反转(二)——带xml的实现
  一共有6个文件
  让我们根据上一节所讲的内容,依次讲解接口工厂配置。接口是基础,工厂生产的类都是得有这些接口的,而实际使用产品的过程中基本上也仅使用接口定义的方法。
我们看看接口
文件UserDao.java
package example2;

public interface UserDao{
   void save();
}

  接着我们有三个不同的工厂。第一个其实不能算作工厂,他直接就是接口实现后的具体类。但是我们也可以把他想像为只有一个返回方法的工厂,返回的就是这个具体类,并且只返回这种具体类。
工厂一:
文件UserDaoImpl.java
package example2;
public class UserDaoImplimplements UserDao {
   @Override
   public void save() {
      System.out.println("执行save方法...");
   }
}
工厂二:注意这个是静态工厂
文件UserDaoImplFactory.java
package example2;
public class UserDaoImplFactory{
   public static UserDaoImpl getUserDaoImpl(){
       return newUserDaoImpl();
   }
}
工厂三:注意这是个实例工厂,要用工厂的方法,必须new来生成工厂实例
文件UserDaoImplFactory2.java
package example2;
public classUserDaoImplFactory2 {
   public UserDaoImpl getUserDaoImpl(){
       return newUserDaoImpl();
   }
}

  好了,接下来我们看看配置。在真正的Spring应用中,大多数配置是通过xml文件来完成的,这里也同样。我们新建一个beans.xml文件,并存储在configuration目录下。实际上,你也可以指定你自己的配置文件存放目录,记得调用的时候写对文件路径就行。我们在配置文件里,声明了方法名,以及所对应的工厂类的class存放路径。
  具体配置文件如下:
文件beans.xml
<?xmlversion="1.0"encoding="UTF-8"?> 
<beansxmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   
   <!--返回具体的实现类-->
   <beanid="userDaoImpl"class="example2.UserDaoImpl"/>
   
   <!--用工厂里面的静态方法,生成类实例,并返回-->
   <beanid="userDaoImpl2"class="example2.UserDaoImplFactory"factory-method="getUserDaoImpl"/>
   
   <!--用实例工厂里面的方法,生成类实例,并返回-->
   <beanid="factory"class="example2.UserDaoImplFactory2"/>
   <beanid="userDaoImpl3"factory-bean="factory"factory-method="getUserDaoImpl"/>
   
</beans>

  最后我们用main函数跑跑我们的代码进行测试查看:
文件MainClass.java
package Main;

importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importexample2.UserDao;
public class MainClass{

   public static void main(String[] args){
      //使用XML来配置的Spring框架
      ApplicationContext ctx 
             = newClassPathXmlApplicationContext("configuration/beans.xml");
       UserDaouserDao = (UserDao) ctx.getBean("userDaoImpl");
      userDao.save();
       userDao =(UserDao) ctx.getBean("userDaoImpl2");//静态工厂方法,static
      userDao.save();
       userDao =(UserDao) ctx.getBean("userDaoImpl3");//实例工厂方法,newFactory
      userDao.save();
      
   }
}
  至此,我们整个带xml的SpringIOC过程已经完整实现了一遍了。我们可以看到不同的生成实体类的方式。这些都通过Spring管理。这里我们通过传输字符串的方式,从Spring那儿获取配置,并由Spring通过工厂来给我们定制实体类。
  由于采用字符串的模式,我们甚至可以通过正则表达式、拼接字符串的方式,来达到动态指定工厂的效果。后续的AOP(Aspect OrientedProgramming面向切面编程)也慢慢地用到这些优势。
  Spring就是一个管理者。其他不同的软件、程序提供了服务,由Spring来管理他们。所以我们有了SSH或SSM框架,MVC与数据库访问服务本身,就是通过Spring来粘合在一起的。它就像一个大齿轮,把我们写的形形色色的工厂,注册、登记进来,并统一管理。
  上一节:Spring中IOC,控制反转(一)——不带xml的实现
  下一节:Spring中AOP,一个query与check的实现(一) 


0 0
原创粉丝点击