Spring学习(4)-spring IOC中bean标签,常用属性,注入方法

spring IOC中bean标签,常用属性,注入方法

本文目录

  • spring IOC中bean标签,常用属性,注入方法
    • 1.Spring Bean是什么?
    • 2.bean 标签
    • 3.bean 标签的常用属性
    • 4.创建bean的三种方式
      • 4.1 第一种方式:使用默认构造函数创建。
      • 4.2 第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
      • 4.3 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
    • 5.小结


1.Spring Bean是什么?

作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要对象实例时注入应用程序中,从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使用的元素。

Spring 容器可以被看作一个大工厂,而 Spring 容器中的Bean就相当于该工厂的产品。如果希望这个大工厂能够生产和管理Bean,这时则需要告诉容器需要哪些Bean,以及需要以何种方式将这些 Bean装配到一起。

Spring 配置文件支持两种不同的格式,分别是 XML文件格式和 Properties文件格式。

通常情况下,Spring 会以 XML 文件格式作为 Spring 的配置文件,这种配置方式通过 XML 文件注册并管理 Bean之间的依赖关系。

XML 格式配置文件的根元素是 ,该元素包含了多个 子元素,每一个 子元素定义了一个 Bean,并描述了该 Bean 如何被装配到 Spring 容器中。

定义 Bean 的默认示例代码如下所示:


<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>

标签内可以配置IOC容器需要控制的对象(还有各种外部资源)。

2.bean 标签

作用:用于配置对象让 spring 来创建的。默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

3.bean 标签的常用属性

元素的常用属性表

属性名称 描述
id 给对象在容器中提供一个唯一标识。用于获取对象。
name Spring 容器同样可以通过此属性对容器中的 Bean 进行配置和管理,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开
class 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope 指定对象的作用范围,其属性值有 singleton(单例)、prototype(原型)、request、session 和 global Session。其默认值是 singleton
constructor-arg 元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(从 0 开始),type 属性指定构造参数的类型
property 元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名
ref 和 等元素的子元素,该元素中的 bean 属性用于指定对 Bean 工厂中某个 Bean 实例的引用
value 和 等元素的子元素,用于直接指定一个常量值
list 用于封装 List 或数组类型的依赖注入
set 用于封装 Set 类型属性的依赖注入
map 用于封装 Map 类型属性的依赖注入
entry 元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref 或 value 子元素指定其值

4.创建bean的三种方式

还是用户保存账号的例子。

Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第1张图片
Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第2张图片

代码:

sevice业务层:

/**
 * 账户业务层的接口
 */
public interface IAccountService {
    void saveAccount();
}

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl implements IAccountService {

    public AccountServiceImpl(){
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        System.out.println("service中的saveAccount方法执行了。。。。");
    }

    public void init(){
        System.out.println("对象初始化了。。。");
    }

    public void destroy(){
        System.out.println("对象销毁了。。。");
    }
}

Dao持久层

/**
 * 账户的持久层接口
 */
public interface IAccountDao {

    /**
     * 模拟保存账户
     */
    void saveAccount();
}

/**
 * 账户的持久层实现类
 */
public class AccountDaoImpl implements IAccountDao {

    public void saveAccount() {
        System.out.println("保存了账户.");
    }
}

模拟表现层

/**
 * 模拟一个表现层,用于调用业务层
 */
public class Client {

    public static void main(String[] args) {
        //1.使用 ApplicationContext 接口,获取spring核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        IAccountService as  = (IAccountService)ac.getBean("accountService");
        System.out.println(as);
        as.saveAccount();
    }
}

bean.xml(Spring bean的配置文件)
Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第3张图片

4.1 第一种方式:使用默认构造函数创建。

在spring的配置文件中使用bean标签,配以idclass属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。


<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">
    
    
    bean>
beans>

4.2 第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

先把工厂的创建交给 spring 来管理。然后再使用工厂的 bean 来调用里面的方法。

  • factory-bean 属性:用于指定实例工厂 beanid
  • factory-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.xsd">
    
    <bean id="instanceFactory" class="com.dab.factory.InstanceFactory">bean>
    <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService">bean>
beans>

普通工厂类
Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第4张图片

/**
 * 模拟一个实例工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提高构造函数)
 * 创建业务层实现类
 * 此工厂创建对象,必须先有工厂实例对象,再调用方法
 */
public class InstanceFactory {
    public IAccountService getAccountService(){
        return new AccountServiceImpl();
    }
}

4.3 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)

使用 StaticFactory 类中的静态方法 getAccountService 创建对象,并存入 spring 容器。

  • id 属性:指定 beanid,用于从容器中获取
  • class 属性:指定静态工厂的全限定类名
  • factory-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.xsd">
    
    <bean id="accountService" class="com.dab.factory.StaticFactory" factory-method="getAccountService">bean>
beans>

工厂中的静态方法
Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第5张图片

/**
 * 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)
 */
public class StaticFactory {
    public static IAccountService getAccountService(){
        return new AccountServiceImpl();
    }
}

运行Client:
Spring学习(4)-spring IOC中bean标签,常用属性,注入方法_第6张图片

5.小结

Spring容器通过对xml中内容进行管理,来实现对各个对象的依赖注入;

有三种注入的方法:构造函数注入、普通工厂注入、静态工厂注入。


推荐阅读

  • Spring学习(1)-了解spring的各个模块.
  • Spring学习(2)-程序间耦合和工厂模式解耦.
  • Spring学习(3)-spring核心思想IOC(控制反转)和DI(依赖注入).
  • Spring学习(4)-spring IOC中bean标签,常用属性,注入方法.
  • Spring学习(5)-spring Bean的作用范围和生命周期.
  • Spring学习(6)-spring简单例子.

欢迎点赞评论,指出不足,笔者由衷感谢o!

你可能感兴趣的:(Spring框架,spring,bean)