使用IoC解决程序耦合 —— Spring(三)

基于XML的配置

  在类的根路径下创建一个任意名称的XML文件(不能是中文)。

  导入文件约束:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

  让Spring管理资源,在配置文件中配置service和dao:

<!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
     id 属性:对象的唯一标识。
     class 属性:指定要创建对象的全限定类名    -->

<!-- 配置 service --> 
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"></bean>

<!-- 配置 dao --> 
<bean id="accountDao" class="com.itcast.dao.impl.AccountDaoImpl"></bean>

  测试类:

public class Client {
    /**
     * 使用 main 方法获取容器测试执行
    */
    public static void main(String[] args) {
        // 1.使用 ApplicationContext 接口,就是在获取 spring 容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
 
        // 2.根据 bean 的 id 获取对象
        IAccountService aService = (IAccountService) ac.getBean("accountService");
        System.out.println(aService);

        IAccountDao aDao = (IAccountDao) ac.getBean("accountDao");
        System.out.println(aDao);
    } 
}

BeanFactory和AppliactionContext的区别

  BeanFactory是Spring容器当中的顶层接口,AppliactionContext是它的子接口。

  BeanFactory和ApplicationContext的区别在于创建对象的时间点不同。

  ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。

  BeadFactory:什么时候使用什么时候创建对象。

ApplicationContext接口的实现类

  ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件,推荐使用。

  FileSystemXmlApplicationContext:它是从磁盘路径加载配置文件,配置文件可以在磁盘的任意位置。

  AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建Spring容器,它用来读取注解。

Bean标签

  Bean标签是用于配置对象让Spring来创建的。默认情况下它调用的是无参构造函数,如果没有无参构造函数则不能创建成功。

  Bean标签的属性:

    id:给对象在容器中提供一个唯一标识。用于获取对象。

    class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

    scope:指定对象的作用范围。

        singleton:默认值,单例的。

        prototype:多例的。

        request:Web项目中,Spring创建一个Bean对象,将对象存入到request域中。

        session:Web项目中,Spring创建一个Bean对象,将对象存入到session域中。

        global session:Web项目中,应用在Portlet环境,如果没有Portlet环境,global session 等同于 session。

    init-method:指定类中的初始化方法名称。

    destroy-method:指定类中销毁方法的名称。

Bean的作用范围和生命周期

  单例对象:scope="singleton"

    一个应用只有一个对象的实例。它的作用范围就是整个引用。

    生命周期:

      对象出生:当应用加载,创建容器时,对象就被创建了。

      对象活着:只要容器在,对象就一直活着。

      对象死亡:当应用拆卸,销毁容器时,对象就被销毁了。

  多例对象:scope="prototype"

    每次访问对象时,都会重新创建对象实例。

    生命周期:

      对象出生:当使用对象时,创建新的对象实例。

      对象活着:只要对象在使用中,就一直活着。

      对象死亡:当对象长时间不使用,会被Java的垃圾回收器回收。

实例化Bean的三种方式

  第一种方式:使用默认无参构造函数。

<!--在默认情况下:它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。--> 
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"/>

  第二种方式:Spring管理静态工厂,使用静态工厂的方法创建对象。

/**
* 模拟一个静态工厂,创建业务层实现类
*/
public class StaticFactory {
    public static IAccountService createAccountService(){
        return new AccountServiceImpl();
    } 
}

<!-- 此种方式是:使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
    id 属性:指定 bean 的 id,用于从容器中获取
    class 属性:指定静态工厂的全限定类名
    factory-method 属性:指定生产对象的静态方法    --> 

<bean id="accountService" class="com.itcast.factory.StaticFactory" factory-method="createAccountService"></bean>    

  第三种方式:Spring管理实例工厂,使用实例工厂的方法创建对象。

/**
* 模拟一个实例工厂,创建业务层实现类
* 此工厂创建对象,必须现有工厂实例对象,再调用方法
*/
public class InstanceFactory {
    public IAccountService createAccountService(){
        return new AccountServiceImpl();
    } 
}

<!-- 此种方式是:先把工厂的创建交给 spring 来管理。然后在使用工厂的 bean 来调用里面的方法
    factory-bean 属性:用于指定实例工厂 bean 的 id。
    factory-method 属性:用于指定实例工厂中创建对象的方法。    --> 
<bean id="instancFactory" class="com.itcast.factory.InstanceFactory"></bean> 
<bean id="accountService" factory-bean="instancFactory" factory-method="createAccountService"></bean>

猜你喜欢

转载自www.cnblogs.com/guancangtingbai/p/12617175.html