Spring入门IOC、DI

Spring框架

1.Spring 简介 (https://spring.io)

Spring是一个开源的轻量级的容器框架。

Spring之父:Rod Johnson

设计宗旨:不发明新的技术,让现有技术使用更方便。

Spring Framework(Spring框架)是一个开源的应用程序框架,由SpringSource公司开发,最初是为了解决企业级开发中各种常见问题而创建的。它提供了很多功能,例如:依赖注入(Dependency Injection)、面向切面编程(AOP)、声明式事务管理(TX)等。其主要目标是使企业级应用程序的开发变得更加简单和快速,并且Spring框架被广泛应用于Java企业开发领域。

2.Spring 体系架构

3.Spring核心功能

   IOC/DI : 控制反转/依赖注入

   AOP :面向切面编程

   TX:声明式事务

4.IOC

   IOC: Inversion of Control   控制反转

   概念:原先由程序员通过new关键字创建对象事情,转交给Spring负责。

         控制反转中控制:控制类的对象

         控制反转中反转:转交给Spring

   作用:解耦合

   解除了程序员对象管理之间的耦合。

IoC 主要是针对对象的创建和调用控制而言的,也就是说,当应用程序需要使用一个对象时,不再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理,即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。这种方式基本上是通过依赖查找的方式来实现的,即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象。

5.SpringIoC容器介绍

Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。

**SpringIoc容器接口**:

`BeanFactory` 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口!

`ApplicationContext` 是 `BeanFactory` 的子接口。它扩展了以下功能:

- 更容易与 Spring 的 AOP 功能集成

- 消息资源处理(用于国际化)

- 特定于应用程序给予此接口实现,例如Web 应用程序的 `WebApplicationContext`

ApplicationContext容器实现类:

6.Spring框架提供了多种配置方式:XML配置方式、注解方式和Java配置类方式

1.XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。

2.注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。

3. **Java配置类**方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。

为了迎合当下开发环境,我们将以**配置类+注解方式**为主进行讲解!

7.Spring 项目环境搭建  (java项目/web项目)

7.1采用maven创建java项目,导入spring的坐标

<!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.0.6</version>
</dependency>
<!--junit5测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
<!-- 日志 , 会自动传递slf4j门面-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

<!--lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>

   注意:引入日志配置文件logback.xml 到 resources目录下

7.2 创建spring配置文件

resources-->new-->XML Configuration File-->spring config-->applicationContext.xml (自定义)

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

</beans>

  7.3 创建实体类

@Data
public class Student {
    private String sno;
    private String name;
    private int age;
}

 7.4 配置文件配置<bean>对象标签

<!--
   bean:一个组件对象,由spring创建对象,并交给spring容器管理
   id: 从容器获取对象唯一标识
   class: 创建对象的类的全限定名
 -->
<bean id="stu" class="com.bdqn.pojo.Student"></bean>

 7.5 单元测试

@Test
public  void  test01() {

//加载spring配置文件,返回spring容器

ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

        //从spring容器中获取对象

Student stu=ac.getBean("stu",Student.class);

System.out.println(stu);

   }

}

 总结:

1.默认配置文件加载时,调用无参构造创建对象,并交给SpringIOC容器管理。

2.设置延迟初始化对象创建

       属性:<bean  lazy-init="true" > 一个bean对象有效

                  <beans default-lazy-init="true"> 所有bean有效

3.默认情况下,单例默认,不管获取多少次都是同一个对象。

        属性: <bean scope="singleton"> 单例模式

                    <bean scope="prototype"> 多例模式 

8.Spring创建bean实例化三种方式

8.1构造方法实例化

       必须提供无参构造方法          

        <bean id="stu" class="pojo.Student"></bean>

8.2实例工厂实例化bean

  1. 编写工厂类和创建实例对象的方法

public class StudentFactory {

public Student createStudent() {

return new Student();

     }

}

    2.配置文件

<!--实例工厂创建bean-->     

     <bean id="studentFactory" class="util.StudentFactory"></bean>

     <bean id="stu3" factory-bean="studentFactory" factory-method="createStudent"></bean>

8.3静态工厂实例化bean

1.编写静态工厂类和创建实例对象的静态方法

public class StudentStaticFactory {

public static Student createStudent() {

return new Student();

  }

}

2.配置文件

<!--静态工厂创建bean-->     

     <bean id="stu4" class="util.StudentStaticFactory" factory-method="createStudent"></bean>

IOC、DI

1. Spring 给对象的属性赋值的两种方式

   1. 有参构造注入

       1. 必须提供有参构造方法

 @AllArgsConstructor
 public class Student {

 }

     2. applicationContext.xml配置

<!--通过有参构造方法给属性赋值创建Student组件对象-->
<bean id="stu" class="com.bdqn.pojo.Student">
    <constructor-arg name="sno" value="1001"></constructor-arg>
    <constructor-arg name="name" value="小张"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
</bean>

    index: 索引,索引号从0开始

    type:类型   

    name:名称

    value: 赋值:基本类型和基本类型的包装类以及String类型。

    ref :值 需要引用另一个对象

 2. 设值注入 (set方法赋值)

     1. 必须提供set方法

 @Data
 public class Student {

 }

     2. 配置文件中配置

<!--通过set注入给属性赋值,创建Student组件对象-->
<bean id="stu2" class="com.bdqn.pojo.Student">
    <property name="sno" value="1002"></property>
    <property name="name" value="翠花"></property>
    <property name="age" value="19"></property>
</bean>

2. 属性不同数据类型赋值的语法
  1. 基本类型或String字符串类型

<!--基本类型或String类型赋值-->
<property name="sno" value="1008"></property>
<property name="name">
    <value>老王</value>
</property>

  2. 数组类型

<property name="nickNames">
    <array>
        <value>王王</value>
        <value>老老</value>
    </array>
</property>

  3. List 类型

<property name="nickNames">
    <list>
        <value>王王</value>
        <value>老老</value>
    </list>
</property>

  4. Set 类型

<property name="nickNames">
    <set>
        <value>王王</value>
        <value>老老</value>
    </set>
</property>

  5. Map 类型

<property name="girls">
    <map>
        <entry key="1" value="村花"></entry>
        <entry key="2" value="翠花"></entry>
    </map>
</property>

 6. Properties类型 ,属性配置类型

<property name="properties">
    <props>
        <prop key="qq">138389438</prop>
        <prop key="pwd">520209420</prop>
    </props>
</property>

3. DI

 DI: 依赖注入(Dependency Injection),IOC和DI完全一样

    在一个类对象(service)中需要依赖于另一个类对象(dao),

   将另一个类对象(dao)注入给对象(service)的过程,称为依赖注入。

  示例:

<bean id="stu3" class="com.bdqn.pojo.Student">

<!--将年级对象注入给学生对象的年级属性-->
    <property name="grade" ref="grade"></property>
</bean>

<!--创建年级对象组件-->

<bean id="grade" class="com.bdqn.pojo.Grade">
    <property name="id" value="1"></property>
    <property name="name" value="S3"></property>
</bean>

4. 查看Spring容器中管理所有对象

String[] names=ac.getBeanDefinitionNames();

   for (String name : names) {

System.out.println(name);

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值