• 【Spring全家桶1】Spring框架相关概念


    什么是Spring?

    Spring是一个集众多设计模式于一身的开源的、轻量级的项目管理框架。

    Spring框架的核心作用

    Spring框架用来管理项目中的组件,对组件进行创建、使用、销毁等操作,由于Spring框架可以帮助我们生产和保存项目中的组件对象,因此也习惯称Spring是一个工厂、容器。

    Spring核心思想——IOC

    IOC(控制反转):或的对象的过程由自身管理变为了通过容器进行依赖注入(DI)。

    A和B是两个类,当B中的方法需要使用A的对象时,叫做B依赖A
    常见的依赖关系:action依赖service、service依赖dao、service依赖其他service。

    依赖注入(DI)

    依赖注入有三种注入方式,分别是SET注入、自动注入、构造方法注入。

    SET方式注入

    • 类里提供成员属性和对应的set方法
    • 在配置文件需要被注入的类的bean标签的标签体里按照需求添加对应的property标签。

    【八种基本数据类型】

    <!--name:成员变量的“名字” value:注入的值-->
    <property name="age" value="50"/>
    
    • 1
    • 2

    【日期类型】

    <!--日期类型value值的格式 yyyy/MM/dd HH:mm:ss -->
    <property name="bir" value="2022/8/17 21:18:12"/>
    
    • 1
    • 2

    【组件类型】

    <!--组件类型 name:成员变量的“名字” ref:对象在工厂的id -->
    <property name="cd" ref="cityDao"/>
    
    • 1
    • 2

    【数组类型】

    <!-- 简单数组(八种基本类型+String+日期的数组) -->
    <!-- 写法1:数组中只有一个元素,可以直接写到value属性值中 -->
    <property name="strs" value="aaa"/>
    <!-- 写法2:数组中有多个元素时,可以在value属性值中使用逗号分隔符 -->
    <property name="strs" value="test,hello"/>
    <!-- 写法3:使用array子标签 -->
    <property name="strs">
    	<array>
        	<value>test</value>
            <value>hello</value>
            <value>123</value>
        </array>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    <!--组件数组 -->
    <property name="userDaos">
    	<array>
    		<ref bean="userDao"/>
    		<ref bean="userDao"/>
    		<ref bean="userDao"/>
    	</array>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    【List集合类型】

    <property name="userDaoList">
    	<list>
    		<ref bean="userDao"/>
    		<ref bean="userDao"/>
    	</list>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    【Map集合类型】

    <property name="userDaoMap">
        <map>
        	<entry key="a" value-ref="userDao"/>
            <entry key="b" value-ref="userDao"/>
        </map>
    </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    【Properties类型】

    <properties name="props">
        <props>
        	<prop key="d">D</prop>
            <prop key="e">E</prop>
        </props>
    </properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    自动注入
    自动注入是指自动使用SET方式注入组件对象,所以类中仍然需要提供对应成员变量的set方法。

    • byType:根据类型注入,要求同一个工厂里不能有同类型的bean。
    • byName:要求变量名必须一致
    <!--在被注入的对象上加上autowire -->
    <bean class="com.baizhi.service.CityServiceImpl" id="cityService" autowire="byType"></bean>
    
    
    • 1
    • 2
    • 3

    构造方式注入
    类里提供成员变量和构造方法(同时提供有参、无参)

    public CityServiceimpl(){}
    
    public CityServiceImpl(Integer age,Date bir,CityDao cd){
    	this.age=age;
    	this.bir=bir;
    	this.cd=cd;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在被注入的类的bean里写:

    <!--
    对应构造函数的参数
    index:参数的下标,下标从0开始
    name:参数的名字
    value或ref:注入的内容
    <constructor-arg index="0" name="age" value="15"/>
    <constructor-arg index="1" name="bir" value="2022/8/18"/>
    <constructor-arg index="2" name="cd" ref="cityDao"/>
    -->
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    构造方式注入和SET注入的本质区别:

    • SET注入:先创建对象,调用无参构造方法,再通过set方法给成员变量赋值
    • 构造方式注入:在创建对象的同时给成员变量赋值,在设计上强制给成员变量赋值。

    Spring工厂特性

    • 默认在工厂中管理的对象都是单例的、全局唯一的、只创建一次。
    • 可配置为原型模式,常用于Struts2的Action
    <bean class="xxxx.XxxAction" id="xxxAction" scope="prototype"></bean>
    
    • 1

    Spring工厂原理

    • 使用反射来创建对象
    UserDaoImpl userDao = (userDaoImpl)Class.forName("com.baizhi.dao.UserDaoImp").newInstance();
    
    • 1

    bean的生命周期

    • 对象创建:随着工厂启动,创建单例bean。原型bean在使用时创建。
    • 对象销毁:随着工厂关闭,销毁单例bean。原型bean不会随着工厂关闭销毁。

    使用bean工厂创建对象的好处

    • 使用配置文件管理Java类,在生产环境中更换类的实现时,不需要重新部署,修改配置重启即可
    • 默认只创建一个对象(单例模式),节省创建对象的时间和内存空间。
    • 通过依赖注入建立了类与类之间的关系(使Java对象之间的关系更为清晰,方便了维护与管理)。

    Spring核心思想——AOP

    • AOP:面向切面编程,底层封装动态代理。

    • 切面:一个切面就是一个动态代理对象。

    • 切面由通知和切入点组成。

    • 通知:除了目标方法之外的其他操作。

    • 切入点:被加入通知的类和方法。
      编程步骤
      1.引入依赖
      spring-aop spring-expression spring-aspects
      2.开发通知类

    • MethodBeforeAdvice:前置通知

    • AfterReturningAdvice:返回后通知

    • ThrowsAdvice:异常通知

    • MethodInterceptor:环绕通知
      3.配置切面

    <!--目标对象-->
    <bean class="" id="" autowire="byType"/>
    <!--通知对象-->
    <bean class="" id=""/>
    <!--组装切面-->
    <aop:config>
    <aop:pointcut id="" expression=""/>
    <aop:advisor advice-ref="" pointcut-ref=""/>
    </aop:config>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    切入点表达式

    • execution方法级别切入点表达式
      – execution(返回值类型 包名.类名.方法名(参数列表))
    • within类级别切入点表达式
      – within(包名.类名)
    • @annnotation注解级别切入点表达式
      –@annotation(包名.类名.方法名)
  • 相关阅读:
    【Pavia】遥感图像数据集下载地址和读取数据集代码
    C++设计模式:策略模式(二)
    Stanford CS 144, Lab 0: networking warmup 实验
    leetcode229. 多数元素 II(java)
    简单列举客户关系管理系统的核心功能
    老黄自己卷自己!GPU要一年更新一代!预告新动作:AI工厂将吞噬一切
    计算二进制中1的个数
    el-table表格宽度自适应
    摄像头种类繁多,需要各自APP
    2023年中国艺术涂料市场发展历程及趋势分析:艺术涂料市场规模将进一步扩大[图]
  • 原文地址:https://blog.csdn.net/qq_42195589/article/details/126394350