2022年Spring全家桶Spring5.x 框架详解

Posted ly甲烷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年Spring全家桶Spring5.x 框架详解相关的知识,希望对你有一定的参考价值。

本文是在看了b站视频【尚硅谷Spring框架视频教程(spring5源码级讲解)】后,手动实现及理解整理
视频地址:https://www.bilibili.com/video/BV1Vf4y127N5?spm_id_from=333.999.0.0

Spring框架概述

Spring是轻量级开源JavaEE框架,可以解决企业应用开发的困难性。
有两个核心部分:

  1. IOC:控制反转, 把创建对象的过程交给Spring去管理
  2. AOP: 面向切面编程,不修改源码进行功能增强。

Spring 特点:

  1. 方便解耦、简化开发
  2. AOP编程支持
  3. 方便程序测试
  4. 方便和其他框架整合
  5. 方便进行事务操作
  6. 降低API开发难度

Spring 模块

入门案例

1.导入IOC核心jar包

2.创建对象类

public class Book 
    private String bName;
    private String bAuthor;
    
    public void testDemo() 
        System.out.println(bName + "::" + bAuthor);
    

3.创建bean1.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">
<!--    配置对象创建-->
    <bean id="book" class="cn.lych4.spring5.bean.Book"></bean>
</beans>

4.创建对象

        //1. 加载spring 配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //2.获取配置的对象
        Book book = context.getBean("book", Book.class);
        System.out.println(book);
        book.testDemo();

IOC

什么是IOC?

控制反转(IOC), 就算把对象创建和对象之间的调用过程交给Spring容器进行管理
IOC的目的是为了降低耦合

IOC过程

第一步: xml配置文件,配置创建的对象

   <bean id="userDao" class="cn.lych4.dao.impl.UserDaoImpl"></bean>

第二步: 有service 类 和 dao 类, 创建工厂类。进一步降低耦合度

class UserFactory
	public static UserDao getDao() 
		String classValue = class属性值; // 1. XML解析
		Class clazz = Class.forName(classValue) // 通过反射创建对象
		return (UserDao)clazz.newInstance();
	

IOC接口

IOC 思想基于IOC容器完成,IOC容器底层就算对象工厂
Spring 提供两种方式实现 IOC 容器: (两个接口)

  1. BeanFactory: IOC容器基本实现,是Spring 内部的使用接口,一般开发人员不使用
    加载配置文件的时候,不会创建对象,在获取对象的时候才去创建对象
  2. ApplicationContext: 是BeanFactory的子接口,提供更多强大的功能,一般由开发人员使用。
    加载配置文件的时候,就会把对象创建

IOC的bean管理

什么是Bean管理

Bean管理指的是两个操作:

  1. Spring 创建对象
  2. Spring 注入属性(set值)

Bean管理操作有两种方式

①. 基于XML配置文件方式实现, ②.基于注解方式实现

IOC的Bean管理操作(基于xml)

1.bean标签创建对象

在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以是实现对象创建
*id属性: 对象标识
*class属性: 类全路径
name属性:早期属性,和id类似,只不过可以加特殊符号
默认执行无参构造完成对象创建

DI 依赖注入,注入属性

——set注入

对象类必须有对应set方法
配置文件:

    <bean id="book" class="cn.lych4.spring5.bean.Book">
        <!--   set方法注入属性     -->
        <property name="bName" value="易筋经"></property>
        <property name="bAuthor" value="达摩老祖"></property>
    </bean>
——有参构造注入

对象类必须有对应有参构造方法
配置文件:

<!--    有参构造创建对象-->
    <bean id="orders" class="cn.lych4.spring5.bean.Orders">
       <constructor-arg name="oname" value="电脑"></constructor-arg>
        <constructor-arg name="address" value="China"></constructor-arg>
    </bean>
xml注入其他类型属性,空值和bean值

1.字面量
null 空值

        <!--注入空值-->
        <property name="bAuthor">
            <null/>
        </property>

属性值包括特殊符号
特殊符号转义,或者是把特殊内容写到 <![CDATA[这里]]

        <!--注入带特殊符号的值,  <[大神]> -->
        <property name="bAuthor">
            <value><![CDATA[<[大神]>]]></value>
        </property>

2.注入属性-外部bean
创建一个Service类和Dao类
在Service类中调用Dao类中的方法
在spring配置文件中进行配置

<!--    1.service 和 dao 对象创建-->
    <bean id="userService" class="cn.lych4.spring5.service.UserService">
<!--        2.service 中注入 userDao 对象, name:类里面的属性名称-->
        <property name="userDao" ref="userDaoImpl"></property>
    </bean>
    <bean id="userDaoImpl" class="cn.lych4.spring5.dao.UserDaoImpl"></bean>

3.注入属性-内部bean
(1)一对多关系:部门和员工
(2)在实体类中表示一对多的关系

//部门类,一
public class Dept 
    private String name;

    public void setName(String name) 
        this.name = name;
    


//员工类,多
public class Emp 
    private String ename;
    private String gender;
    //员工属于某一个部分
    private Dept dept;

    public void setEname(String ename) 
        this.ename = ename;
    

    public void setGender(String gender) 
        this.gender = gender;
    

    public void setDept(Dept dept) 
        this.dept = dept;
    

(3)在spring配置文件中进行配置

<!--    注入内部bean-->
    <bean id="emp" class="cn.lych4.spring5.bean.Emp">
        <property name="ename" value="lucy"></property>
        <property name="gender" value=""></property>
<!--        设置对象类型属性-->
        <property name="dept">
            <bean id="dept" class="cn.lych4.spring5.bean.Dept">
                <property name="name" value="安保部"></property>
            </bean>
        </property>
    </bean>

3.注入属性-级联赋值
(1) 第一种

<!--    注入内部bean-->
    <bean id="emp" class="cn.lych4.spring5.bean.Emp">
        <property name="ename" value="lucy"></property>
        <property name="gender" value=""></property>
<!--        级联赋值-->
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="cn.lych4.spring5.bean.Dept">
        <property name="dname" value="财务部"></property>
    </bean>

(2)第二种

<!--    注入内部bean-->
    <bean id="emp" class="cn.lych4.spring5.bean.Emp">
        <property name="ename" value="lucy"></property>
        <property name="gender" value=""></property>
<!--        级联赋值-->
        <property name="dept" ref="dept"></property>
        <!--        这里Emp类必须有dept属性的get方法-->
        <property name="dept.dname" value="技术部"></property>
    </bean>
    <bean id="dept" class="cn.lych4.spring5.bean.Dept">
        <property name="dname" value="财务部"></property>
    </bean>
xml注入集合属性

注入数组、List、Map

    <bean id="stu" class="cn.lych4.spring5.collectiontype.Stu">
<!--        数组类型注入-->
        <property name="courses">
            <array>
                <value>java课程</value>
                <value>数据库课程</value>
            </array>
        </property>
<!--        list类型注入-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>三哥</value>
            </list>
        </property>
<!--        map类型属性注入-->
        <property name="maps">
            <map>
                <entry key="爱好" value="学习"></entry>
            </map>
        </property>
<!--        set类型属性注入-->
        <property name="sets">
            <set>
                <value>Java</value>
                <value>mysql</value>
            </set>
        </property>
    </bean>

设置对象集合

	<bean id="stu" class="cn.lych4.spring5.collectiontype.Stu">
<!--        list类型,里面是对象,属性注入-->
        <property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
                <ref bean="course3"></ref>
            </list>
        </property>
    </bean>
    
    <!--    创建多个course对象-->
    <bean id="course1" class="cn.lych4.spring5.collectiontype.Course" >
        <property name="cname" value="Java"></property>
    </bean>
    <bean id="course2" class="cn.lych4.spring5.collectiontype.Course" >
        <property name="cname" value="Python"></property>
    </bean>
    <bean id="course3" class="cn.lych4.spring5.collectiontype.Course" >
        <property name="cname" value="Go"></property>
    </bean>

抽取集合值, 引入util命名空间

<?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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <util:list id="bookList" >
        <value>MySQL必知必会</value>
        <value>JVM调优</value>
    </util:list>

    <bean id="book" class="cn.lych4.spring5.collectiontype.Book" >
        <property name="bnames" ref="bookList"></property>
    </bean>
</beans>

2. FactoryBean

Spring有两种类型的bean,一种是普通的bean 另外一种是工厂bean (FactoryBean)

  • 普通bean: 在配置文件种定义bean类型就是返回类型
  • 工厂bean:在配置文件定义bean类型可以和返回类型不一样
    第一步:创建类,让这个类作为工厂bean, 实现接口FactoryBean
    第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型

创建一个Bean,实现FactoryBean接口

public class MyBean implements FactoryBean<Course> 

    //定义返回bean
    public Course getObject() throws Exception 
        Course course = new Course();
        course.setCname("abc");
        return course;
    

    public Class<?> getObjectType() 
        return null;
    

    public boolean isSingleton() 
        return false;
    

xml配置文件

    <bean id="myBean" class="cn.lych4.spring5.factorybean.MyBean">以上是关于2022年Spring全家桶Spring5.x 框架详解的主要内容,如果未能解决你的问题,请参考以下文章

2022年苹果WWDC定于6月开办,全家桶软件系统均计划升级

2021年大厂面试题汇总:JVM+Redis+多线程+Spring全家桶

大神码了2000页Spring全家桶笔记,2年以上经验必看

Spring Cloud全家桶主要组件及简要介绍

最全153道Spring全家桶面试题,java初级面试官常问的问题

Spring全家桶:Spring,SpringBoot,SpringCloud实战,Spring源码