Spring IOC&DI

  传统实例化对象存在的为题:传统开发可以使用new对父接口进行实例化,这样就造成了代码的极大耦合性,为了解决这种耦合性,可以引入工厂设计模式,来负责创建子类对象,这样,工厂类帮助开发者隐藏了所有实现子类,但是静态工厂类不能为所有的接口服务,而且每增加一个子类就要修改工厂类,这样太麻烦,可以采用反射机制的动态工厂类来解决,但是动态工厂类还是需要知道对象的类型才可以,而且需要考虑到多线程的问题。

对于以上开发存在的问题,Spring采用IOC&DI来实现

Spring开发需要引入下列依赖包:

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.0.7.RELEASE</version>
  </dependency>

 IOC指的是控制反转,将对象的管理交给Spring进行管理:

  在src/main/resources/spring目录下创建Bean配置文件spring-base.xml,并且打开命名空间,里面定义所有的Bean,交由Spring管理:<bean id="messageImpl(别名)" class="cn.lt.service.MessageImpl(子类)"/>

  对<bean>元素的解释:1、每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一,一般以对象类首字母小写来定义;

             2、用来表示类的全名,通常为package.classname;

  在Spring中所有的容器都由ApplicationContext接口来描述(子类ClassPathXmlApplicationContext是spring读取xml最常用的类。而我们一般操作的是她的接口ApplicationContext。),

  ApplicationContext  context  =  new  ClassPathXmlApplicationContext("spring/spring-base.xml") ;

  //Spring加载源文件夹目录下的.xml文件

  Message  msg  =  context.getBean("messageImpl",IMessage.class) ;

  //通过getBean("id",接口.class)方法从ApplicationContext容器中获取装配好的Bean实例以供使用。

Spring测试:

  DI指的是依赖注入,依赖是一种关系,在A类中创建B的实例,我们叫做A依赖于B;将B对象作为A的构造器参数进行传入,在调用类A之前已经将B类实例化好了,这种方式叫依赖注入

  需要引入的依赖库:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.7.RELEASE</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-annotations-api</artifactId>
      <version>9.0.8</version>
    </dependency>

 引入测试依赖库后,就不需要使用ApplicationContext中的getBean()方法来获得bean对象了,而是使用ContextConfiguration(locations = {"classpath:spring/spring-base.xml"})来加载配置文件并装载实例。并且使用@Resource注解进行接口对象注入,替代了getBean()方法;

 

【问题】ClassPathXmlApplicationContext("spring/spring-base.xml") 最后是被什么替代的

【备注】耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息

ApplicationContext是BeanFactory的子类,与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配

ApplicationContext有四个常用子类:1.ClassPathXmlApplicationContext(从类路径ClassPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)、2.FileSystemXmlApplicationContext(从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)、3.XmlWebApplicationContext(从Web应用中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)。

猜你喜欢

转载自www.cnblogs.com/haibinggan-/p/9213579.html