框架-Spring学习第二天(IOC)

一、入门案例

前提注意:

spring5 版本是用 jdk8 编写的,所以要求我们的 jdk 版本是 8 及以上。 
同时 tomcat 的版本要求 8.5 及以上。

1.导入jar包

 <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

4个核心(beans、core、context、expression) + 1个依赖(commons-loggins…jar)在这里插入图片描述
在这里插入图片描述
2.配置文件(bean.xml)
让 spring 管理资源,在配置文件中配置 service 和 dao

<?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">
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> </bean>
    <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"> </bean>
</beans>
<!--把对象的创建交给spring管理-->

3.测试是否成功

/**
 * 模拟一个表现层,用于调用业务层
 */
public class Client {
/*获取spring的核心容器,并根据id获取对象

 */
    public static void main(String[] args) {
        //1.获取核心容器对象
        ApplicationContext ac =new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取bean对象
       IAccountService as = (IAccountService) ac.getBean("accountService");
        IAccountDao   adao = ac.getBean("accountDao",IAccountDao.class);

        System.out.println(as);
        System.out.println(adao);
        }

    }

运行结果
在这里插入图片描述

二、相关知识

spring 中工厂的类结构图
在这里插入图片描述

ApplicationContext的三个实现类:
ClassPathXmlApplicationContext:
 它是从类的根路径下加载配置文件 推荐使用这种
FileSystemXmlApplicationContext: 
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
AnnotationConfigApplicationContext:
当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
BeanFactory 才是 Spring 容器中的顶层接口。 
ApplicationContext 是它的子接口。 
BeanFactory (多例)和 ApplicationContext(单例) 的区别:
创建对象的`时间点`不一样。
ApplicationContext:构建核心容器时,只要一读取配置文件,默认情况下就会创建对象。 可以debug状态跟踪
BeanFactory:延迟加载的方式,什么时候会根据ID获取对象,什么使用什么时候创建对象。

三、 spring中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.xsd">

    <!--把对象的创建交给spring来管理-->
    <!--spring对bean的管理细节
        1.创建bean的三种方式
        2.bean对象的作用范围
        3.bean对象的生命周期
    -->
    <!--创建Bean的三种方式 -->
    <!-- 第一种方式:使用默认构造函数创建。
            在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
             采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。-->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
    
   

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

<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService">
</bean>
  <!-- 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
      <bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>
      -->
</beans>

四、Bean的作用范围

Bean的作用范围调整

Bean标签的scope属性:
作用:用于指定Bean的作用范围  
取值:singleton         单例的
     prototype         多例的
     request      作用于web应用的请求范围
     session      作用于web应用的会话范围
     global——session    作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="singleton"></bean>

简单理解global session
在这里插入图片描述

五.bean的生命周期

Bean对象的生命周期:单例与双例

 单例:
         出生:当容器创建时,对象出生
         活着:容器存在,对象活着
         死亡:容器销毁,对象死亡
         总结:单例对象的生命周期和容器相同

bean.xml

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
          scope="singleton" init-method="init" destroy-method="destory"></bean>
public class AccountServiceImpl implements IAccountService {
    public AccountServiceImpl(){
        System.out.println("对象创建了");
    }
    public void  saveAccount() {
        System.out.println("service中的account方法执行了");;
    }
    public void  init() {
        System.out.println("对象初始化了");;
    }
    public void  destory() {
        System.out.println("对象销毁了");;
    }
}
public static void main(String[] args) {
        //1.获取核心容器对象
       ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        IAccountService as  = (IAccountService)ac.getBean("accountService");
        as.saveAccount();
      //  ((ClassPathXmlApplicationContext) ac).close();
        ac.close();
    }

在这里插入图片描述

六、spring的依赖注入

依赖注入(Dependency Injection)
IOC的作用:降低程序间的耦合(依赖关系)
依赖关系的管理:以后都交给spring来维护

在当前类需要用到其他类对象,由spring为我们提供我们只需要在配置文件中说明

依赖关系的维护:就称之为依赖注入
能注入的数据有三类

	基本类型和String
    其他bean类型(在配置文件中或者注解配置过的Bean)
    复杂类型/集合类型

注入的方式有三种:

第一种:使用构造函数提供
第二种:使用set方法t提供
第三种:使用注解提供

方式一:构造函数注入

使用的标签:`constructor-org`
标签出现的位置:`bean标签的内部`
标签中的属性
 type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
        index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
        name:用于指定给构造函数中指定名称的参数赋值                                        常用的
        =======以上三个用于指定给构造函数中哪个参数赋值=
        value:用于提供基本类型和String类型的数据
        ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
弊端:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。

在这里插入图片描述

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
        <constructor-arg name="name" value="test"> </constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean>
    <!--配置一个日期对象-->
    <bean id="now" class="java.util.Date"></bean>

结果
在这里插入图片描述

方式二:使用set方法提供

set方法注入 —— 更常用的方式
涉及的标签:property
出现的位置:bean标签的内部
标签的属性

name:用于指定注入时所调用的set方法名称
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
优势:创建对象时没有明确的限制,可以直接使用默认构造函数
 弊端:如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
<bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2">
        <property name="name" value="Test"></property>
        <property name="age" value="21"></property>
        <property name="birthday" ref="now"></property>
    </bean>

在这里插入图片描述
在这里插入图片描述
方式三:使用注解提供(注入集合数据)
1.添加集合set方法
在这里插入图片描述
2.在Bean.xml添加注入

<bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">
   <property name="myStrs">
       <array>
           <value>AAA</value>
           <value>BBB</value>
           <value>CC</value>
       </array>

   </property>
            <property name="myLists">
       <list>
           <value>AAA</value>
           <value>BBB</value>
           <value>CC</value>
       </list>
   </property>
           <property name="myset">
       <set>
           <value>A</value>
           <value>B</value>
           <value>C</value>
       </set>
   </property>
           <property name="myMap">
       <map>
           <entry key="testA" value="AAA"></entry>
           <entry key="testB" value="BBB"></entry>
       </map>
   </property>
           <property name="myProps">
       <props>
       <prop key="testa">aaa</prop>
       <prop key="testb">bbb</prop>
       </props>
   </property>

       </bean>

注意:

复杂类型的注入/集合类型的注入
           用于给List结构集合注入的标签:
               list array set
           用于个Map结构集合注入的标签:
               map  props
           结构相同,标签可以互换

在这里插入图片描述

发布了79 篇原创文章 · 获赞 44 · 访问量 2054

猜你喜欢

转载自blog.csdn.net/wy19961103/article/details/103448596