IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring5学习 -> 正文阅读

[Java知识库]Spring5学习

1.IOC容器

控制反转:把对象的创建和对象之间的调用过程都交给Spring进行管理,目的是为了降低耦合度;

在这里插入图片描述

IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

建议放到容器中的对象:dao类,service类,controller类,工具类,spring容器中的对象都是单例,容器中每个对象只存在一个;

不建议放到容器中的对象:

  • 实体类对象,实体类对象的数据来自数据库,应该是在程序运行过程中创建
  • servlet,filter,listener,这些类应该由tomcat负责创建与调用

将对象放到容器中有两种方式

  • 在xml配置中添加bean标签
  • 使用注解

2.Bean标签创建容器对象

通过容器使用对象:

  • 在resources目录下配置mybeans.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是根标签,spring把java对象称为bean
      spring-beans.xsd是一种约束文件和mybatis的.dtd约束一样
  -->
    <!--  告诉Spring创建对象,声明bean,
      id:对象的自定义名称,唯一值,spring通过这个名称找到对象
      class:类的全限定名称
      spring是把创建好的对象放到map中 springMap.put("WarMovie",new WarMovieInterImpl())
      一个bean标签对应一个对象
      -->
    <bean id="WarMovie" class="com.ywxk.spring5.service.impl.WarMovieInterImpl"></bean>
    <!--  创建一个非自定义类  -->
    <bean id="myDate" class="java.util.Date"></bean>
</beans>
  • 创建spring容器,通过容器获取对象
//从类路径target/classes下加载xml文件,创建容器,ApplicationContext就是spring容器
//在创建完spring容器后,spring会创建配置文件中的所有对象,默认调用的是类的无参构造
        ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
        //从容器中获取某个类
        WarMovieInterImpl warMovie =context.getBean("WarMovie",WarMovieInterImpl.class);
        warMovie.seeMovie();
//获取非自定义类
Date date=(Date)context.getBean("myDate");

3.依赖注入(Dependency Injection)DI

bean实例在调用无参数构造方法创建对象后,就要对bean对象的属性进行初始化,初始化是由容器完成的,称为依赖注入,根据注入的方式分为set注入,构造注入;

set注入(设值注入):spring调用类的set方法,在set方法可以实现属性的赋值,实际开发中80%都是使用该方式;

//简单类型
<bean id="director" class="com.ywxk.spring5.service.T1.Director">
    <!-- 为类注入属性,spring会调用对象的setXXX方法 -->
    <property name="name" value="路阳"></property>
    <property name="age" value="35"></property>
</bean>

//引用类型,property里面用ref="beanid"
<bean id="company" class="com.ywxk.spring5.service.T1.Company">
        <property name="addr" value="北京市"></property>
        <property name="companyName" value="北京文化"></property>
        <property name="registerMoney" value="2000000"></property>
</bean>
<bean id="director" class="com.ywxk.spring5.service.T1.Director">
        <!-- 为类注入属性,spring会调用对象的setXXX方法 -->
        <property name="name" value="路阳"></property>
        <property name="age" value="35"></property>
        <property name="nick" value="烧水水"></property>
        <property name="com" ref="company"></property>
</bean>

构造注入:spring调用类的有参构造方法,创建对象,在构造方法中完成属性的赋值;

<bean class="com.ywxk.spring5.service.T1.Player" id="player">
        <!-- 一个<constructor-arg>表示一个构造方法的一个参数,
            name:构造方法的形参名或者index:构造方法参数的位置,从0开始
            value:构造方法形参的值
            ref:当构造方法的形参类型是引用类型,使用ref
			也可以省略name跟index,但是value的顺序必须是按照形参的顺序
         -->
        <constructor-arg name="pName" value="刘德华"></constructor-arg>
        <constructor-arg index="1" value="53"></constructor-arg>
        <constructor-arg name="sex" value="true"></constructor-arg>
        <constructor-arg name="com" ref="company"></constructor-arg>
    </bean>
public Player(String pName, int age, boolean sex,Company com) {
    this.pName = pName;
    this.age = age;
    this.sex = sex;
    this.com= com;
}

用构造注入获取file对象

<bean name="myFile" class="java.io.File">
    <constructor-arg name="parent" value="C:\Users\Administrator\Desktop\临时"></constructor-arg>
    <constructor-arg name="child" value="aa.txt"></constructor-arg>
</bean>

4.引用类型的自动注入

实际开发中可能会碰到一个类里面有多个引用属性,如果逐个配置标签会导致代码冗余,所以spring提供了一种自动注入引用类型的功能,该功能只能为引用属性自动赋值;

  • byName(按名称)方式:如果java类中引用类型的属性名与bean中的类的id一致,且数据类型一致,那么spring就能对该属性进行自动注入

    <bean id="WarMovie" class="com.ywxk.spring5.service.impl.WarMovieInterImpl" autowire="byName"></bean>
    
    public class WarMovieInterImpl implements MovieInter {
    
        private Player player;
        private Director director;
        ...
    }
    
    <bean id="director" class="com.ywxk.spring5.service.T1.Director">
        <property name="name" value="路阳"></property>
        <property name="age" value="35"></property>
        <property name="nick" value="烧水水"></property>
        <property name="com" ref="company"></property>
    </bean>
    <bean id="player" class="com.ywxk.spring5.service.T1.Player" >
        <constructor-arg  value="刘德华"></constructor-arg>
        <constructor-arg index="1" value="53"></constructor-arg>
        <constructor-arg  value="true"></constructor-arg>
        <constructor-arg  ref="company"></constructor-arg>
    </bean>
    
  • byType(按类型)方式:如果java类中引用类型的属性类型与bean中的类的class是同源的,那么spring就能对该属性进行自动注入

    这里的同源指的是:

    • java类中引用类型的属性类型与bean中的类的class同一个类;
    • java类中引用类型的属性类型是bean中的类的class的父类;
    • java类中引用类型的属性类型与bean中的类的class是接口与实现类的关系;
<bean id="WarMovie" class="com.ywxk.spring5.service.impl.WarMovieInterImpl" autowire="byType"></bean>
<bean id="playerSon" class="com.ywxk.spring5.service.T1.PlayerSon" >
    <constructor-arg  value="刘德华"></constructor-arg>
    <constructor-arg index="1" value="53"></constructor-arg>
    <constructor-arg  value="true"></constructor-arg>
    <constructor-arg  ref="company"></constructor-arg>
</bean>
public class WarMovieInterImpl implements MovieInter {

    private Player player;
    ...
}
public class PlayerSon extends Player{

    public PlayerSon(String pName, int age, boolean sex, Company com) {
        super(pName, age, sex, com);
        System.out.println("player子类");
    }
}

5.多配置文件

如果项目较为庞大,可以使用多个配置文件

  • 可以按功能模块,一个模块一个配置文件
  • 按类的功能,数据库相关一个配置文件,事物功能一个配置文件,service功能一个配置文件…
<!--  主配置文件,引入其他模块配置文件  -->
    <import resource="classpath:package1/moviePackage1.xml"></import>
    <import resource="companyPackage1.xml"></import>
<!--  也可以用通配符方式,注意不要匹配到主配置文件,否则会造成死循环,通配符只能匹配当前目录的文件,不能匹配当前目录的子目录的文件  -->
    <import resource="classpath:package1/package-*.xml"></import>
<!--companyPackage1.xml,公司模块所有bean-->
<bean id="companyPackage1" class="com.ywxk.spring5.package1.CompanyPackage1"></bean>
<!--moviePackage1.xml  movie模块所有bean  -->
    <bean id="moviePackage1" class="com.ywxk.spring5.package1.MoviePackage1"></bean>

6.注解方式的依赖注入

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:19:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:24:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码