Spring Framework

发布时间 2023-10-16 19:57:25作者: yanggdgg

一、IOC/DI

IoC(Inversion of Control)控制反转

DI(dependency injection)依赖注入

IoC/DI指的是一个过程:对象的创建仅仅通过Spring容器负责,Spring容器可以通过对象的构造方法或工厂方法进行实例化对象。在创建对象过程中,如果对象需要依赖其他对象,也可以直接在Spring容器中注入到当前对象。

整个过程中对象本身在容器中控制自己的实例化(所以叫做控制反转),通过构造方法或setter方法把依赖对象注入到属性中(所以又叫做依赖注入)。

二、Bean创建的两种方式

1. BeanFactory

  通过读取、解析配置文件中Bean的配置信息,容器通过反射使用构造方法实例化对象,默认使用无参构造。对象由容器进行管理

2. FactoryBean

2.1 静态工厂

例如:

people工厂类:

public class PeopleStaticFactory {
    private static People peo = new People();

    public static People newInstance(){
        return peo;
    }
}

配置bean:

<bean id="peo3" class="com.bjsxt.factory.PeopleStaticFactory" factory-method="newInstance"/>
  • class:静态工厂类的全限定路径

  • factory-method:静态工厂中创建bean的静态方法。

由于静态方法可以直接通过类调用,所以不用创建工厂实例。

2.2 实例工厂

例如:

people工厂类:

public class PeopleFactory {
    People peo = new People();
    public People getInstance(){
        return peo;
    }
}

配置bean:

实例工厂需要先创建工厂的实例才能调用方法。

<!-- 创建工厂实例 -->
<bean id="factory" class="com.bjsxt.factory.PeopleFactory"></bean>
<!-- factory-bean:工厂对象的id    factory-method:创建当前bean的方法名称 -->
<bean id="peo2" factory-bean="factory" factory-method="getInstance"></bean>
  • factory-bean:工厂bean的id属性值。

  • factory-method:工厂中创建bean的方法。

三、属性注入

1. 手动注入

手动注入又分为构造注入和设值注入两种方式

1.1 构造注入

构造注入是通过构造方法将属性注入,即在创建对象时就完成属性的注入。

使用构造注入要提供对应参数的构造方法。

需要注意的是,在声明了有参构造方法后,需要显式声明无参构造,否则无参构造方法将被覆盖。

配置bean:

<bean id="peo4" class="com.gsy.pojo.People">
    <constructor-arg type="int" value="1"></constructor-arg>
    <constructor-arg type="java.lang.String" value="张三"></constructor-arg>
</bean>

参数说明:
  constructor-org:
  name:参数名
  index:参数索引
  type:参数类型
 以上三个参数不是都要指定,只要能确定参数即可。
  ref:引用类型
  value:参数值

注入引用类型的属性要求该类型的对象已经被spring容器托管,即配置了对应的bean,ref指定对应bean的id即可。

1.2 设值注入

设值注入通过setter方法实现,所以要先有对象才能进行设值注入。

设值注入一般是配合无参构造一起使用,所有要同时具备无参构造和对应的setter方法。

配置bean:

<bean id="peo5" class="com.bjsxt.pojo.People">
    <property name="id" value="2"></property>
    <property name="name" value="李四"></property>
</bean>

参数说明:
  name:属性名
  value:属性值
  ref:引用类型

ref用法同1.1 构造注入

2. 自动注入