spring笔记

你离开我真会死。 提交于 2020-02-11 21:48:15

关于创建对象

bean在配置文件pom.xml中

关于bean的标签及其使用

 <!--把对象的创建交给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>
    -->

    <!-- bean的作用范围调整
        bean标签的scope属性:
            作用:用于指定bean的作用范围
            取值: 常用的就是单例的和多例的
                singleton:单例的(默认值)
                prototype:多例的
                request:作用于web应用的请求范围
                session:作用于web应用的会话范围
                global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session

    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="prototype"></bean>
    -->

    <!-- bean对象的生命周期
            单例对象
                出生:当容器创建时对象出生
                活着:只要容器还在,对象一直活着
                死亡:容器销毁,对象消亡
                总结:单例对象的生命周期和容器相同
            多例对象
                出生:当我们使用对象时spring框架为我们创建
                活着:对象只要是在使用过程中就一直活着。
                死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
     -->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
          scope="prototype" init-method="init" destroy-method="destroy"></bean>
</beans>

关于bean的spring依赖注入

        依赖注入:            Dependency Injection        IOC的作用:            降低程序间的耦合(依赖关系)        依赖关系的管理:            以后都交给spring来维护        在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明        依赖关系的维护:            就称之为依赖注入。         依赖注入:            能注入的数据:有三类                基本类型和String                其他bean类型(在配置文件中或者注解配置过的bean)                复杂类型/集合类型             注入的方式:有三种                第一种:使用构造函数提供                第二种:使用set方法提供                第三种:使用注解提供(明天的内容)     -->    <!--构造函数注入:        使用的标签:constructor-arg        标签出现的位置: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="泰斯特"></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方法注入                更常用的方式        涉及的标签: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>    <!-- 复杂类型的注入/集合类型的注入        用于给List结构集合注入的标签:            list array set        用于个Map结构集合注入的标签:            map  props        结构相同,标签可以互换    -->    <bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">        <property name="myStrs">            <set>                <value>AAA</value>                <value>BBB</value>                <value>CCC</value>            </set>        </property>        <property name="myList">            <array>                <value>AAA</value>                <value>BBB</value>                <value>CCC</value>            </array>        </property>        <property name="mySet">            <list>                <value>AAA</value>                <value>BBB</value>                <value>CCC</value>            </list>        </property>        <property name="myMap">            <props>                <prop key="testC">ccc</prop>                <prop key="testD">ddd</prop>            </props>        </property>        <property name="myProps">            <map>                <entry key="testA" value="aaa"></entry>                <entry key="testB">                    <value>BBB</value>                </entry>            </map>        </property>    </bean></beans>

(!)bean标签的注解形式

任需要在xml中配置

<!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为    context名称空间和约束中--><context:component-scan base-package="com.itheima"></context:component-scan>

整个bean.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"       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">    <!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为    context名称空间和约束中-->    <context:component-scan base-package="com.itheima"></context:component-scan></beans>

@Component及其衍生

他们的作用就和在XML配置文件中编写一个标签实现的功能是一样的

  •  Component:    作用:用于把当前类对象存入spring容器中    属性: value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。Controller:一般用在表现层Service:一般用在业务层Repository:一般用在持久层以上三个注解他们的作用和属性与Component是一模一样。他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

举例:
这两幅图是相同的
在这里插入图片描述
在这里插入图片描述

关于注入的注解

  • 用于注入数据的
  •  他们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
  •  以下三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。 另外,集合类型的注入只能通过XML来实现。
@Autowired

Autowired:

  •      作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功         如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。         如果Ioc容器中有多个类型匹配时:               1.首先先按照类型圈定出匹配的对象。               2.使用变量名称作为bean的id,在圈定出来的对象中继续查找哪个和它一样,                  如果有一样的,也可以圈定成功,否则就报错     出现位置:        可以是变量上,也可以是方法上     细节:        在使用注解注入时,set方法就不是必须的了。

在这里插入图片描述

@Qualifier
  •  Qualifier:  作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(稍后我们讲)  属性:      value:用于指定注入bean的id。

此时我有两个dao实现类
在这里插入图片描述
可以通过此方法具体调用
在这里插入图片描述.

@Resource
  •  Resource   作用:直接按照bean的id注入。它可以独立使用   属性:       name:用于指定bean的id。

在这里插入图片描述

@Value
  •  Value  作用:用于注入基本类型和String类型的数据  属性:      value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)              SpEL的写法:${表达式}

用于指定作用范围

@Scope
  • 用于改变作用范围的
    他们的作用就和在bean标签中使用scope属性实现的功能是一样的
    Scope
    作用:用于指定bean的作用范围
    属性:
    value:指定范围的取值。常用取值:singleton prototype(默认取值singleton单例)

关于生命周期(了解)

他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的

  •  PreDestroy
  •      作用:用于指定销毁方法
  •  PostConstruct
  •      作用:用于指定初始化方法
  • 在这里插入图片描述

spring中的新注解

@Configuration

  • Configuration
    作用:指定当前类是一个配置类
    细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
    等于在把整个bean.xml文件用注解的形式在这里插入图片描述

@ComponentScan

  • ComponentScan
    作用:用于通过注解指定spring在创建容器时要扫描的包
    属性:
    value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
    我们使用此注解就等同于在xml中配置了:
    <context:component-scan base-package=“com.itheima”></context:component-scan>

                    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191214165926540.png)

@Bean

Bean
作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
属性:
name:用于指定bean的id。当不写时,默认值是当前方法的名称
细节:
当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
查找的方式和Autowired注解的作用是一样的

这两个作用是相同的
在这里插入图片描述
在这里插入图片描述
注注注注意:此时改写过后的QueryRunner是单例的,得添加上Scan注解改写成多例的

@Import

在这里插入图片描述

@PropertySource

在这里插入图片描述

junit的整合

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!