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 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> SSM框架中项目模块配置:Spring容器 -> 正文阅读

[系统运维]SSM框架中项目模块配置:Spring容器

Spring

Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

Spring简介

作用:为代码“解耦合”,降低代码间的耦合度(符合软件工程中的高内聚、低耦合的特点),让对象和对象(模块和模块)之间关系不是通过代码关联,而是通过配置来说明。

Spring根据代码的功能特点,使用Ioc降低业务对象之间耦合度,Ioc使得主业务在相互调用的过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring容器统一管理,自动注入,即赋值。而AOP使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由Spring容器统一完成织入

官网:

Spring安装包:

- spring-framework-5.2.5.RELEASE
	- docs # 相关文档
		- javadoc-api # 相关api
		- kdoc-api
		- spring-framework-reference # 开发手册
	- libs # 源码
		- spring-model-5.2.5.RELEASE.jar # 相关模块的字节码.class文件
		- spring-model-5.2.5.RELEASE-javadoc.jar # 相关模块的开发文档
		- spring-model-5.2.5.RELEASE-sources.jar # 相关模块的源文件.java
	- schema # 相关模块的约束文件

Spring优点

  • 轻量
  • 针对接口编程、解耦合
  • AOP编程的支持
  • 方便集成各种优秀框架

Ioc控制反转

Ioc的概念

概念:IocInversion of Control,控制反转,是一个理论,把对象的创建、属性赋值,对象的声明周期都交给代码以外的容器管理。

Ioc分为控制和反转

  • 控制:对象创建、属性赋值,对象的声明周期
  • 反转:把开发人员管理对象的权限转移给了代码之外的容器实现,由容器完成对象的管理。
  • 正转:开发人员在代码中,使用new构造方法创建对象。

Ioc的实现

  • 依赖注入:DIDependency Injection,程序只需要提供要使用的对象的名称即可,对象如何创建,如何从容器中查找,获取都由容器内部自己实现

Spring的配置文件

<!-- xxx.xml(spring) -->
<?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">
    
	<!--    声明对象
	id:自定义对象名称,唯一值(可没有。spring提供默认的名称)
	class:类的全限定名称,spring通过反射机制创建对象,不能是接口

	spring根据id和class创建对象,把对象放入到spring的一个map之中
	map.put(id, object)
	-->
    <bean id="someService" class="org.bjpowernode.service.impl.SomeServiceImpl"/>
</beans>  

Spring的标准配置文件

  • 根标签是beans
  • beans后面是约束文件说明,beans里面是bean声明
  • beanjava对象,Spring容器创建的java对象

创建对象并调用接口方法

package org.bjpowernode;

import org.bjpowernode.service.SomeService;
import org.bjpowernode.service.impl.SomeServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        /* 一般创建对象格式 */
        // SomeService service = new SomeServiceImpl(); Impl一般指接口实现类
        // service.doSome();
        
        /* 指定spring的配置文件
        * 从类路径(classpath)之下开始的路径,一般是resources
        * */
        String config = "beans.xml";
        // 创建容器对象, ApplicationContext表示spring容器对象,通过ctx获取某个Java对象
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        // 从容器中获取指定名称的对象,使用getBean("id")
        SomeService service = (SomeService)ctx.getBean("someService");
        // 调用对象的方法,接口中的方法
        service.doSome();
    }
}

Spring容器创建对象的特点

Spring创建对象特点:

  1. Spring创建对象调用的构造函数默认是无参构造,如果定义了有参构造,则再定义无参构造.

  2. 创建Spring容器对象的时候,会读取配置文件,创建文件中声明所有的的Java对象,即new ClassPathXmlApplicationContext(config);

    • 优点:获取对象的速度快,因为对象已经创建好了

    • 缺点:占用内存

  3. String对象存在Spring内部的map中,并从map进行获取对象(可以调用ApplicationContext接口里面的方法试一试)

创建非自定义类对象

<beans>
	<bean id="date" class="java.util.Date"/>
</beans>

DI(依赖注入)

Spring调用类的五参数构造方法,创建对象,对象创建后给属性赋值

  • 使用xml配置文件中的标签和属性
  • 使用注解

DI分类:

  • set注入,设值注入
  • 构造注入

set注入,简单类型注入(简单的数据类型和String

<beans>
<!-- 
	set注入,Spring调用类的set方法(必须要有set方法),完成赋值
 	<property name="名称" value="值" />
-->
    <bean id="myStudent" class="com.bjpowernode.ba01.Student">
        <property name="name" value="lh"/>
        <property name="age" value="12"/>
    </bean>
</beans>

注入过程:按照前调用无参构造的原则,其后调用setxx方法进行赋值(和属性名无关,无关是不是类的属性),而非直接通过有参构造进行赋值

给非自定义类同理

set注入,引用类型注入

<beans>
<!-- 
	set注入
 	<property name="名称" ref="beanid" />
-->
    <bean id="myst" class="com.bjpowernode.ba01.Student">
        <property name="name" value="lh"/>
        <property name="age" value="12"/>
        <property name="sl" ref="mysl"/>
    </bean>
    <bean id="mysl" class="com.bjpowernode.ba01.School">
        <property name="name" value="yc"/>
        <property name="age" value="32"/>
    </bean>
</beans>

构造注入:Spring调用类中的有参构造方法,在创建对象的同时,给属性赋值

<beans>
    <!--
		<constructor-arg>:表示一个构造方法的形参
				标签属性:name:构造方法形参名
						index:构造方法的参数位置T
						value:简单类型的形参值
						ref:引用类型的形参值
	-->
    <!-- name -->
    <bean id="myst" class="com.bjpowernode.ba01.Student">
        <constructor-arg name="name" value="pl"/>
        <constructor-arg name="age" value="234"/>
        <constructor-arg name="sl" ref="mysl"/>
    </bean>
    <!-- index -->
    <bean id="myst" class="com.bjpowernode.ba01.Student">
        <constructor-arg index="0" value="pl"/>
        <constructor-arg index="1" value="234"/>
        <constructor-arg index="2" ref="mysl"/>
    </bean>
    <!-- 省略index -->
    <bean id="mysl" class="com.bjpowernode.ba01.School">
        <property name="name" value="yc"/>
        <property name="age" value="32"/>
    </bean>
</beans>

引用类型自动注入:Spring可以根据某些规则给引用类型完成赋值,只对引用类型有效,规则byNamebyType

  • byName:按名称注入,Java类中引用类型属性名称和Spring容器中beanid一样,且数据类型也一样,这样的bean能够赋值给引用类型。
  • byType:按类型注入,Java类中引用类型的数据类型和Spring容器中beanclass同源关系,则可以赋值给引用类型。

byName规则

<beans>
    <bean id="st" class="com.bjpowernode.ba01.Student" autowire="byName">
        <property name="name" value="lh"/>
        <property name="age" value="123"/>
    </bean>

    <!-- 此处的id要和引用该类型的类中的引用数据名称相同 -->
    <bean id="sl" class="com.bjpowernode.ba01.School">
        <property name="name" value="yc"/>
        <property name="age" value="231"/>
    </bean>
</beans>

byType规则(只能有一个,具有唯一性)

同源关系

  • java中引用类型的数据类型和beanclass值是一样的。
  • java中引用类型的数据类型(父)和beanclass(子)值是父子类关系的。
  • java中引用类型的数据类型和beanclass值是接口和实现类关系的。
<beans>
    <bean id="st" class="com.bjpowernode.ba01.Student" autowire="byType">
        <property name="name" value="lh"/>
        <property name="age" value="123"/>
    </bean>

    <bean id="mysl" class="com.bjpowernode.ba01.School">
        <property name="name" value="yc"/>
        <property name="age" value="231"/>
    </bean>
</beans>

多个配置文件:在实际应用里,随着应用规模的增加,系统中Bean数量也大量增加口,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring配置文件分解成多个配置文件。

  • 按功能模块分,-个模块一个配置文件。
  • 按类的功能分,数据库操作相关的类在一个文件,配置redis, 事务等等的一个配置文件。

Spring管理多个配置文件:常用的是包含关系的配置文件,项目中有一个总的文件,里面是有import标签包含其他的配置文件

<!--
	classpath:表示类路径。类文件所在的目录,spring通过 类路径加载配置文件
-->
<import reource="classpath:其他文件路径1"/>
<import reource="classpath:其他文件路径2"/>

使用通配符*

<!--
不同包含总配置文件本身
-->
<import reource="classpath:其他文件路径_*"/>

基于注解的DI

概念:使用Spring提供的注解,完成Java对象创建,属性赋值

Component:需要在类上使用注解@Component,该注解的value属性用于指定该beanid

@Component(value="myTest") /* 如果不加默认是类首字母小写的类名 */
class Test {
	// do something    
}
<beans>
    <!--
		component-scan 组件扫描器,组件是Java对象
		base-package 注解在项目中的包名,框架扫描这个包和子包中的所有类,找类中的所有注解
					遇到注解后,按照注解表示的功能,去创建对象,给属性赋值
	-->
	<context:component-scan base-package="com.bjpowernode.ba01"/>
</beans>

@Component功能相同的创建对象的注解。

  • @Repository:放在dao接口的实现类上面,表示创建dao对象,持久层对象,能访问数据库
  • @Service:放在业务层接口的实现类上面,表示创建业务层对象,业务层对象有事务的功能
  • @Controller:放在控制器类的上面,表示创建控制器对象。属于表示层对象。控制器对象能接受请求,把请求的处理结果显示给用户。

以上四个注解都能创建对象,但是@Repository @Service @Controller有角色说明,表示对象是分层的。对象是属于不能层的,具有额外的功能。


扫描多个包的三种方式

<beans>
    <!-- 多次使用组件扫描器 -->
	<context:component-scan base-package="com.bjpowernode.ba01"/>
	<context:component-scan base-package="com.bjpowernode.ba02"/>
	<!-- 使用分隔符 -->
	<context:component-scan base-package="com.bjpowernode.ba01;com.bjpowernode.ba02"/>
    <!-- 指定父包 -->
	<context:component-scan base-package="com.bjpowernode"/>
</beans>

注解指定属性值的方式

  • 简单类型value
  • 引用类型

简单类型value

放置位置:

  • 在属性定义的上面,无需set方法,推荐使用
  • set方法的上面
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 22:03:22  更:2022-02-05 22:04:02 
 
开发: 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/16 6:36:58-

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