文章

Spring IOC

2021.4.16 ・ 共 1191 字,您可能需要 3 分钟阅读

Tags: Spring

Inversion of Control 控制反转

  1. 引入配置文件的方法的参数可以多个。
  2. 在一个总的配置文件中用 <import resource="xx.xml"/> 进行引用。

在 Spring 2.5 之后,为了 set 注入的方便,引入了这个方法。

<bean id="userService" class="org.example.service.UserService" 
	p:name="haha"
	p:userDao-ref="userDao">
</bean>
package org.example.service;

import org.example.dao.UserDao;

public class UserService {
    private UserDao UserDao;
    
    public void setUserDao(UserDao userDao) {
        UserDao = userDao;
    }
    
    public void test() {
        System.out.println("UserService test()...");
        UserDao.test();
    }
}
<bean id="userService" class="org.example.service.UserService">
    <property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="org.example.dao.UserDao">
    <!-- collaborators and configuration for this bean go here -->
</bean>

property 中的 name 指定的就是类中的属性名字。

常用有String、Integer、Map、List

private String name;

public void setName(Stringname) {
    this.name =name;
}
<bean id="userService" class="org.example.service.UserService">
    <property name="userDao" ref="userDao"/>
    <property name="name" value="haha"/>
</bean>

即可进行使用。

在构造的地方注入

<constructor-arg name="构造器中的参数" ref="那个参数的Bean id"/>

如果出现循环依赖,需要通过 set 注入解决。

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

<!--    自动化注入-->
    <context:annotation-config/>

<!--    配置bean-->
    <bean id="userService" class="com.sundingyi.service.UserService"/>
    <bean id="userDao" class="com.sundingyi.dao.UserDao"/>
</beans>

在配置文件中如此书写,另外,在需要的类中添加@Resource关键字

// 注入 UserDao
    @Resource
    private UserDao userDao;
    //set
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
  1. 通过 bean 中的 id 进行查找。
  2. 如果没有找到,则由 class 进行检索。
  3. 需要属性的类,可以提供 set 方法,也可以不提供,以后一般都不需要提供。
  4. 注解也可以声明在 set 方法字段上。
  5. 可以设置注解的 name 属性,值要与 bean 标签的 id 属性值一致。它的优先级大于 class。 @Resource(name="userDao")
  6. 同样可以为接口进行设置@Resource,如果这个接口只被实现了一次,那么就可以直接使用,如果这个接口被实现了多次,那么就必须指定name="实现的类”
  1. 默认通过类型寻找。
  2. 可以提供 set 也可以不提供。
  3. 可声明在属性基本或 set 级别
  4. 可以添加@Qualifier ,选择 value 属性值查找 bean 对象(必须设置,且与 bean 中的 id 一致)

bean 对象的统一管理,简化开发配置,提高开发效率。

  1. 设置自动化扫描范围。

  2. 在需要被自动化实例化的类上添加注解。

    使用如下注解加在类上:

    @Repository : 用在 Dao 层

    @Service: 用在 Service 层

    @Controller: 用在 Controller 层

    @Component: 用在任意层

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

    <context:component-scan base-package="包名"/>
</beans>

有两个值 singleton 和 prototype.

IOC 容器在启动时,会自动将所有在单例作用域中的 bean 对象实例化,并设置到单例缓存池中。

当使用了lazy-init=“true” 时,那么就会变为只有被使用时才会被实例化。

默认会被设置成false ,优点如下。

  1. 可以提前发现潜在的配置问题。
  2. bean 对象在启动时就会被设置在单例缓冲池中,使用时不需要再去进行实例化,提高效率。

IOC 容器在启动时,不会把 prototype 设置到单例缓存池中。而是每次使用时都会实例化一个新的。

用的并不多。

无状态的对象。即不存在会改变当前对象状态的成员变量。一般是 Controller 层,Service 层,Dao层。实体类、工具类则不适合。

共有四个阶段:

在配置文件中定义 bean, 通过 bean 标签对应 bean 对象。

IOC 容器启动时,自动实例化 bean 对象。

  1. 使用 BeanFactory
  2. 使用 ApplicationContext

ApplicationContext 的 close()

将对象实例化的控制过程,转交给一个外部容器产生。