Spring-IOC (IOC的特点、生命周期、自动装配)

1.关于Spring的Bean  

  (1)Spring的bean有两种:普通Bean 以及 工厂Bean(FactoryBean)

      普通 bean:在配置文件中定义 bean 类型就是返回类型  

      工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

 

2.创建工厂Bean

  (1)创建类,让这个类作为工厂 bean,实现接口 FactoryBean

 

  (2)实现接口里面的方法,在实现的方法中定义返回的 bean 类型

public class MyBean implements FactoryBean<Course>{

    //定义返回的bean
    @Override
    public Course getObject() throws Exception {  //返回值类型可以自行选择
        Course course = new Course();
        course.setCname("abc");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

  

  (3)从ApplicationContext对象getBean方法时传入的class类型必须为你设定的类型

 public void testCollection3(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean3.xml");
        Course course = context.getBean("myBean", Course.class);
        System.out.println(course);
    }

  

3. 关于创建Bean时为单实例对象还是多实例对象 

  (1)在Spring中默认情况下,Bean为单例对象 ,即同一个bean只有一个实例

  (2)设置单实例还是多实例 

    ①在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例

    ②scope 属性值

        第一个值 默认值,singleton,表示是单实例对象         第二个值 prototype,表示是多实例对象         默认情况下,Bean为单例对象 ,即同一个bean只有一个实例

    ③singleton 和 prototype 区别

      第一 singleton 单实例,prototype 多实例       第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象       设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用           getBean 方法时候创建多实例对象
<!--
        scope:设该bean是单实例还是多实例
              singleton:默认参数 是单实例对象 ,在加载spring配置文件时就会创建单例对象
              prototype:    是多实例对象     在调用getBean方法时创建对象
    -->
    <bean id="book" class="com.jianghao.collectiontype.Book" scope="prototype">
        <property name="list" ref="booklist"></property>
    </bean>

  

4.Bean的生命周期

  一般的Bean生命周期  (共五步):

(1)通过构造器创建 bean 实例(无参数构造) (2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法) (3)调用 bean 的初始化的方法(需要进行配置初始化的方法) (4)bean 可以使用了(对象获取到了) (5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
public class Orders {
    private String oname;

    public Orders() {
        System.out.println("第一步 执行无参构造器创建bean实例");
    }

    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步 调用set方法设置属性值");
    }

    //创建执行的初始化方法
    public void initMethod(){
        System.out.println("第三步 执行初始化方法");
    }
    //创建执行的销毁方法
    public void destroyMethod(){
        System.out.println("第五步 执行销毁方法");
    }
}

  设置初始化方法,以及销毁方法

<!--
    init-method属性 :设置初始化方法
    destroy-method属性:设置销毁方法
    -->
    <bean id="orders" class="com.jianghao.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手机"></property>
    </bean>

 

添加后置处理器的Bean生命周期 (共有七步)

(1)通过构造器创建 bean 实例(无参数构造) (2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法) (3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization (4)调用 bean 的初始化的方法(需要进行配置初始化的方法)(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization (6)bean 可以使用了(对象获取到了) (7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

   添加后置处理器

    (1)创建类,实现接口 BeanPostProcessor,创建后置处理器

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public  Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之前执行的方法");
        return bean;
    }

    @Override
    public  Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之后执行的方法");
        return bean;
    }
}

    (2)配置核心配置文件

<!--
        配置后置处理器:
            实现BeanPostProcessor接口后spring会自动识别为后置处理器
            会对所有bean添加后置处理器中的两个方法
    -->
    <bean id="myBeanPost" class="com.jianghao.bean.MyBeanPost"></bean>

 

5.自动装配

  (1)什么是自动装配:

      根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

  (2)怎样实现自动装配

      ①根据属性名注入:在xml文件中寻找id名与自身属性相同的Bean进行注入

 <!--实现自动装配
        autowire属性配置自动装配
            byName根据属性名注入:  注入值bean的id值和类的属性名一致
            byType根据属性类型注入: 注入的类型不能有两个bean
    -->
    <bean id="emp" class="com.jianghao.autowire.Emp" autowire="byName">
        <!--<property name="dept" ref="dept"></property>-->

    </bean>
    <bean id="dept" class="com.jianghao.autowire.Dept"></bean>

      ②根据属性类型注入:会根据属性的全类名查找Bean,但是不能同时全类名相同的两个Bean

  <bean id="emp" class="com.jianghao.autowire.Emp" autowire="byType"></bean>
    <bean id="dept" class="com.jianghao.autowire.Dept"></bean>
    <!--<bean id="dept1" class="com.jianghao.autowire.Dept"></bean>-->

 

6.配置外部属性文件(如配置数据库信息)

  (1)直接配置连接池

 <!--直接配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="20010111"></property>
    </bean>

  

  (2)引入外部属性文件配置数据库连接池

    ①  创建外部属性文件,properties 格式文件,写数据库信息

    Spring-IOC (IOC的特点、生命周期、自动装配)

 

    ②  把外部 properties 属性文件引入到 spring 配置文件中

      引入context命名空间

    
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    

    ③  在 spring 配置文件使用标签引入外部属性文件
 <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverName}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>

 

  

      

 

 

    

  

      

 

上一篇:Spring文档之Spring概述


下一篇:Visual Studio 2010 中的代码约定设置