Spring--IOC

Spring IOC 

Spring IOC 有两个主要容器:

ApplicationContext (接口)

常用的三个实现类:

  • FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径,相对路径也可以。

    ApplicationContext context = new FileSystemXmlApplicationContext("D:/qwq/eclipse--workspaces7-test-4月2日/SpringExample/src/Beans.xml");

  • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。

   ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

  • WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。

BeanFactory (接口)

接口中最常用的是XmlBeanFactory 这个实现类

XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("Beans.xml"));

总结

ApplicationContext 包含了 BeanFactory 所有的功能,但是做小程序或者移动端可以用  BeanFactory 因为它的数据量和速度是显著。


Bean 定义

属性描述
class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
scope 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。
constructor-arg 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
properties 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
autowiring mode 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。
destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。
<?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-3.0.xsd">

   <!-- 一个简单的bean定义 -->
   <bean id="..." class="...">
       <!-- 这个bean的配置 -->
   </bean>

   <!-- A bean definition with lazy init set on -->
   <bean id="..." class="..." lazy-init="true">
       <!-- 这个bean的配置 -->
   </bean>

   <!-- 带有初始化方法的bean -->
   <bean id="..." class="..." init-method="...">
       <!-- 这个bean的配置 -->
   </bean>

   <!-- 带有销毁方法的bean -->
   <bean id="..." class="..." destroy-method="...">
       <!-- 这个bean的配置 -->
   </bean>

   <!-- 。。。 -->

</beans>

 bean 的作用域

scope:属性

作用域描述
singleton 单例模式
prototype 非单例模式
request 该作用域将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 的上下文中有效。
session 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。
global-session 该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。


<!--
单利模式的bean --> <bean id="..." class="..." scope="singleton"> <!-- 配置 --> </bean>

Bean 的生命周期

init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

<bean id="..."  class="..." init-method="init" destroy-method="destroy">

   </bean>

intidestroy 都是方法。

context.registerShutdownHook();      它将确保正常关闭,并且调用相关的 destroy 方法。

默认的初始化和销毁方法

如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明初始化方法销毁方法。框架使用 元素中的 default-init-method 和 default-destroy-method 属性提供了灵活地配置这种情况,如下所示:

<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-3.0.xsd"
    default-init-method="init" 
    default-destroy-method="destroy">

   <bean id="..." class="...">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

</beans>

 


Bean 后置处理器

实现了 BeanPostProcessor  接口的类。

类实现  postProcessBeforeInitialization  和  postProcessAfterInitialization   这两个方法

package com.qie_zi;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class InitHelloWorld implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("第一个B : " + beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("第一个A : " + beanName);
        return bean;
    }
}

然后把这个类在Beans.xml中注册一下,运行时,就会自动调用到这两个方法


Bean 定义继承

parent :要继承的父类。

此继承和Java类中继承的效果相同

<?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-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
      <property name="message1" value="Hello World!"/>
      <property name="message2" value="Hello Second World!"/>
   </bean>

   <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="helloWorld">
      <property name="message1" value="Hello India!"/>
      <property name="message3" value="Namaste India!"/>
   </bean>

</beans>
原文地址:https://www.cnblogs.com/qie-zi/p/8758852.html