一篇文章入门spring

2023-05-16

Spring入门1

在之前我们对象的创建都是我们自己new出来的,比如Student stu=new Student(),但是我们现在有了spring,我们将对象的创建的工作交给spring来处理。
那么spring是怎么创建对象的呢,创建对象之后有时保存在哪里的呢?
不知道大家清不清楚反射的概念。spring就是利用反射来进行创建对象。
就是我们给定一个字符串,在spring这里给定的字符串是你的类的全名(包括包名和类名),根据这个字符串可以创建对应类的对象,然后将创建好的对象以Map集合的形式保存下来。也就是以key和value的形式保存下来。
下面就是获取spring的容器,然后根据id来创建对象。
获取spring容器的IOC核心容器,并根据id获取对象
这里的IOC核心容器和之前工厂模式中将对象存入Map容器里面是一样的。
ApplicationContext的三个常用实现类:

​ ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。(更 常用)不在的话,加载不了。
FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)
​ AnnotationConfigApplicationContext:它是用于读取注解创建容器的。

核心容器ApplicationContext和BeanFactory两个接口之间的区别:
ApplicationContext: 适用场景:单例对象使用
它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说
只要一读取完配置文件马上就创建配置文件中配置的对象。
BeanFactory: 适用场景:多例对象使用
它在构建核心容器时,创建对象采取的策略是延迟加载的方式。也就是说
什么时候根据id获取对象了,什么时候才真正的获取对象。不是加载完文件之后立即创建对象

public static void main(String[] args)
    {
        //1.获取核心容器对象
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");//这个写入的路径是类路劲下的路径
//ApplicationContext ac=new FileSystemXmlApplicationContext("F:\\spring01\\src\\main\\resources\\bean.xml");
            //这个写的是全路径
       //2.根据id获取bean对象
       AccountService as= (AccountService) ac.getBean("accountService");
       AccountDao adao=  ac.getBean("accountDao",AccountDao.class);
//        //上面两种创建对象的方式都可以。
       System.out.println(as);
       System.out.println(adao);


        //------------------BeanFactory-------------------------
//        Resource resource=new ClassPathResource("bean.xml");
//        BeanFactory factory=new XmlBeanFactory(resource);
//        AccountService as= (AccountService) factory.getBean("accountService");
//        System.out.println(as);



    }

SpringBean入门2

把对象的创建交给spring来管理。

spring对bean的管理细节:
1.创建bean的三种方式
2.bean对象的作用范围
3.bean对象的生命周期。

创建bean的三种方式

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

<bean id="accountService"  class="bean.service.impl.AccountServiceImpl">
<bean id="accountDao" class="springioc.dao.impl.AccountDaoImpl"></bean>

第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
如果还是直接使用id的方法获取对象的话,获取的是工厂的对象,不是我们返回值的service对象。
所以如何获得返回值的service对象,而不是工厂对象呢?
使用场景:当某个类中的某个方法的返回值是某个对象的时候或者使用某个方法创建对象的时候。

<bean id="instanceFactory" class="bean.factory.InstanceFactory"></bean>
<bean id="accountService"  factory-bean="instanceFactory" factory-method="getAccountService"></bean>

上面accountService是我们真正要创建的对象,但是这个对象是使用某个类中的方法创建的,那么我们要指定这个类的bean和这个类中创建这个对象的方法。

我们现在有一个instanceFactory对象,他是一个工厂,它里面有方法可以为我们创建service对象。
那么我们需要定义一个service对象,那么这个对象是如何来的呢。
是由id为instanceFactory的工厂中的getAccountService方法来获取的。

package bean.factory;/**
 * Created by HongyongHan on 2020/3/28.
 */

import bean.service.AccountService;
import bean.service.impl.AccountServiceImpl;

/**
 * @program: springbean
 * @description:
 * @author: HongyongHan
 * @create: 2020-03-28 17:17
 **/

/*
    模拟一个工厂类,该类可能存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数。

 */
public class InstanceFactory {

    public AccountService getAccountService()
    {
       return  new AccountServiceImpl();
    }
}

第三种方式:使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
使用场景:当某个类的某个方法是静态方法的时候并且使用这个静态方法创建对象。

<bean id="accountService" class="bean.factory.StaticFactory" factory-method="getAccountService"></bean>
package bean.factory;/**
 * Created by HongyongHan on 2020/3/28.
 */

import bean.service.AccountService;
import bean.service.impl.AccountServiceImpl;

/**
 * @program: springbean
 * @description:
 * @author: HongyongHan
 * @create: 2020-03-28 17:17
 **/

/*
    模拟一个工厂类,该类可能存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数。

 */
public class StaticFactory {

    public static AccountService getAccountService()
    {
        return  new AccountServiceImpl();
    }
}

bean的作用范围调整

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

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

bean对象的生命周期:

​ 1.单例对象.
​ 出生:当容器创建时对象出生
​ 活着:只要容器还在,对象一直活着
​ 死亡:容器销毁,对象消亡
​ 总结:单例对象的生命周期和容器相同.
​ 2.多例对象:
​ 出生:当我们使用对象时spring框架为我们创建,是延迟创建对象
​ 活着:对象只要是在使用过程中就一直活着
​ 死亡:当对象长时间不用且没有别的对象引用时,由java的垃圾回收器回收.

<bean id="accountService"  class="bean.service.impl.AccountServiceImpl" scope="prototype" init-method="init" destroy-method="destroy">
</bean>

Spring入门3 spring中的依赖注入di

​ 依赖注入:
​ Dependency Injection
​ IOC的作用:
​ 降低程序间的耦合(依赖关系)
​ 依赖关系的管理:以后都交给了spring来维护。
​ 在当前类中需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
​ 依赖关系的维护:
​ 就称为依赖注入。
​ 依赖注入:
​ 能注入的数据:有三类:
​ 基本类型和String
​ 其他bean类型(在配置文件中活着注解配置过的bean)
​ 复杂类型/集合类型
​ 注入方式:有三种
​ 第一种:使用构造函数提供
​ 第二种:使用set方法提供。
​ 第三种:使用注解提供。

<!--构造函数注入:开发中一般不用
    使用标签:constructor-arg
    标签出现的位置:bean标签的内部
    标签中的属性:
            type:用于指定要注入的数据的数据类型。该数据类型也是构造函数某个或者某些参数的类型
            <constructor-arg type="java.lang.String" value="test" >:这样可以给type是string类型的注入test值。但是一般不独立使用。

            index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置从0开始。
                  可以独立使用,但是要记住每个索引是什么类型。比较麻烦.
            name:用于指定给构造函数中指定名称的参数赋值。(常用)

            =========以上三个用于指定给构造函数中哪个参数赋值==========
            value:用于提供基本类型和String类型的数据
            ref:用于指定其他的bean类型数据。它指的是在spring的IOC核心容器中出现过的bean对象。

       优势:
            在获取bean对象时,注入数据是必须的选择,否则对象无法创建成功。
        弊端:
            改变了bean对象的实例化方式,使我们创建对象时,如果用不到这些数据,也必须提供。
-->
<bean id="accountService" class="springdi.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方法注入(常用)
    涉及标签:property
    出现的位置:bean标签的内部
    标签的属性:
            name:用于指定注入时所调用的set方法名称xxx。就是之前名字是setXxx方法。
            value:用于提供基本类型和String类型的数据
            ref:用于指定其他的bean类型数据。它指的是在spring的IOC核心容器中出现过的bean对象。
    优势:创建对象时,没有明确的限制,可以直接使用默认构造函数。
    弊端:如果有某个成员必须有值,则获取对象时有可能set方法没有执行。
-->
<bean id="accountService2" class="springdi.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
    结构相同,标签可以互换。实际上记住两组就可以了,list的和map的标签。
-->
<bean id="accountService3" class="springdi.service.impl.AccountServiceImpl3">
    <property name="myStrs">
        <array>
            <value>aaa</value>
            <value>rrr</value>
            <value>ayay</value>
        </array>
    </property>
    <property name="myList">
        <list>
            <value>lll</value>
            <value>iii</value>
            <value>stst</value>
        </list>
    </property>
    <property name="mySet">
        <set>
            <value>sss</value>
            <value>eee</value>
            <value>ttt</value>
        </set>
    </property>

    <property name="myMap">
        <map>
            <entry key="test" value="value"></entry>
            <entry key="testBBB">
                <value>BBB</value>
            </entry>
        </map>
    </property>
    <property name="myProps">
        <props>
            <prop key="testprop">ccc</prop>
            <prop key="testBBB">BBB</prop>
        </props>

    </property>
    </bean>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇文章入门spring 的相关文章

随机推荐

  • CentOS 7 下载安装 Java JDK 17

    操作步骤 利用 wget 下载 Java JDK 17 到 usr local java 安装目录中 xff0c 并解压缩 span class token comment 进入安装目录 span span class token buil
  • 每日一题(力扣)计划

    983 最低票价 问题描述 在一个火车旅行很受欢迎的国度 xff0c 你提前一年计划了一些火车旅行 在接下来的一年里 xff0c 你要旅行的日子将以一个名为 days 的数组给出 每一项是一个从 1 到 365 的整数 火车票有三种不同的销
  • 算数左移、逻辑右移、算数右移、逻辑右移

    算术左移和逻辑左移一样都是右边补0 算术左移 xff08 适用于有符号数 xff09 高位移出 xff0c 低位补0 xff08 要注意数据位最高位为1时极有可能溢出 xff09 比如 0010 1011B 算术左移一位 01010110B
  • java使用ssl连接mysql

    Connecting Securely Using SSL 官方文档 xff0c 演示使用 上面文章里 Setting up Server Authentication 就是在客户端设置认证mysql服务器 xff0c Setting up
  • amd和arm安装ffmpeg踩坑报错处理

    一 amd安装ffmpeg yum安装 系统版本 xff1a CentOS Linux release 7 2 1511 Core 内核版本 xff1a 3 10 0 862 el7 x86 64 1 SMP Fri Apr 20 16 4
  • Powershell常用命令(一)

    Invoke Command xff08 icm xff09 功能 xff1a 在本地或者远程运行命令 xff0c 命令执行的结果 span class token punctuation span 含错误 span class token
  • Ubuntu 突然无法联网,ifconfig 查看仅回环IP时,ping 其他IP显示connect: Network is unreachable的解决方法

    场景 xff1a Ubuntu先前使用时可以联网 xff0c 本地私有ip也存在 xff0c 某次打开Ubuntu后 xff0c 用ifconfig查看IP仅本地的回环ip xff0c ping 别的ip显示connect Network
  • linux命令_复制文件/目录到指定目录下

    复制文件 xff1a 把1 txt 复制到根目录下的sbin目录 cp 43 文件名 xff08 可带路径 xff09 43 目标路径 xff08 带路径 xff09 如 xff1a cp 1 txt sbin 复制目录 xff1a 把re
  • 栈(一本通)

    第一类型 xff1a 车厢调度 进栈顺序是固定的1 2 3 4 xff0c 判断能不能按照给定的顺序出来 include lt iostream gt include lt cstring gt include lt cmath gt in
  • 一本通:1191流感传染

    一本通 xff1a 流感传染 题目描述 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感
  • CentOS 7 使用iptables 开放端口

    转自 https www cnblogs com kyuang p 6307535 html CentOS 7 0默认使用的是firewall作为防火墙 xff0c 这里改为iptables防火墙 1 关闭firewall xff1a sy
  • 模拟幅度调制系统抗干扰性能仿真分析

    目录 1 引言2 系统模型和仿真1 DSB SC调制和解调1 调制过程2 解调过程3 信噪比分析4 matlab代码 2 AM调制和解调1 调制过程2 解调过程 xff1a 3 信噪比分析4 matlab代码 3 SSB调制和解调1 调制过
  • 解决重启后 /mnt/hgfs下共享文件夹挂载失效问题

    问题描述 xff1a 如题 xff0c 在 mn hgfs 下使用ls命令不显示共享文件夹 xff0c 在root权限下运行命令 xff1a vmhgfs fuse host mnt hgfs 后重新进入目录显示共享文件夹 xff0c 重启
  • Matlab安装硬件支持包补充@水月流荧

    您好 xff0c 请问我按照文章内容下载了支持包 xff0c 并且将archive拷贝到E matlab bin win64 xff08 本机位置 xff09 中 xff0c 后在win64中找到SupportSoftwareInstall
  • spring-boot-maven-plugin未指定版本导致的编译错误

    spring boot maven plugin未指定版本导致的编译错误 报错 springboot应用在使用maven编译时会报如下错误 xff1a Java Runtime class file version 61 0 this ve
  • ssh连接Centos7时vim无法使用粘贴板原因及解决方法

    原因 xff1a 1 命令行的vim没有 43 和 两个寄存器 xff08 原因之一 xff09 xff0c 退出vim后粘贴板内容不会保留到vim所在系统的粘贴板 2 在有 43 和 寄存器的前提下 xff0c 可以从vim复制到vim所
  • >Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

    gt Error com android tools aapt2 Aapt2Exception AAPT2 error check logs for details 这个错误会在3 0里面出现 解决办法是在gradle properties
  • 一键部署k8s脚本

    一键部署k8s脚本 目录 一键部署k8s脚本前情提示环境准备硬件系统要求角色说明 xff1a 其余准备工作 centos准备centos网络准备centos软件准备 部署k8s前配置下载部署脚本安装 Ansible 运行环境修改安装的配置文
  • Docker in docker 实现

    Docker in docker 文章目录 Docker in docker原理实现 xff08 centos7 xff09 常见问题参考 在docker容器内运行docker一般是不被倡导的 但有些场景和业务上 xff0c 需要在容器内使
  • 一篇文章入门spring

    Spring入门1 在之前我们对象的创建都是我们自己new出来的 xff0c 比如Student stu 61 new Student xff08 xff09 但是我们现在有了spring 我们将对象的创建的工作交给spring来处理 那么