当前位置: 首页 > news >正文

Spring框架---IOC核心技术和DI依赖注入

目录

服务端三层开发

表现层

业务层

持久层(数据访问层)

Spring框架的介绍

Spring框架的概述

Spring框架的优点

Spring的IOC核心技术

什么是IOC

什么是耦合性

IOC的程序入门

IOC技术总结

Spring框架的Bean管理的配置文件方式

Bean对象的创建和销毁的两个属性配置

实例化Bean对象的三种方式

DI依赖注入

依赖注入的概述

属性的set方法注入值

 属性构造方法方式注入值

 数组,集合(List,Set,Map),Properties等的注入

多配置文件方式

多配置文件的加载方式


 

服务端三层开发

表现层

 用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。主要作用是界面展示,接收请求,分发请求。常见的表现层技术包括 Web 框架(如 Spring MVC、Struts)、前端框架(如 React、Vue.js)等。

  • springMVC
  • Servlet
  • Struts

业务层

 实现业务的主要逻辑,是系统架构中体现核心价值的部分。将一个业务中所有的操作封装成一个方法,同时保证方法中所有的数据库更新操作,即保证同时成功或同时失败。避免部分成功部分失败引起的数据混乱操作。常见的业务层技术包括 Spring、Hibernate 等。

  • Spring
  • service

持久层(数据访问层)

 其功能主要是负责数据库的访问(可以访问数据库、二进制文件、文本文件等),是对数据库,而不是对数据的操作。简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。也就是哪个类对应哪个表,哪个属性对应哪个列。持久层的目的就是,完成对象数据和关系数据的转换。

  • JDBC
  • Spring中的jdbc模板
  • Mybatis

Spring框架的介绍

Spring框架的概述

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003  

年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。

它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

Spring的核心是控制反转(IoC控制反转)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

解决的是业务逻辑层和其他各层的松耦合问题

耦合度高依赖度高,耦合度低更加灵活,可扩展性强

分层的轻量级的一站式的开源框架

架构的优势之一就是分层架构

IoC控制反转 AOP 面向切面

Spring框架的优点

1.方便解耦,简化开发,Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。IOC的作用。

2.AOP编程的支持,Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。可扩展性

3.声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。

4.方便程序的测试,Spring对Junit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。

6.降低JavaEE API的使用难度,Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

Spring的IOC核心技术

什么是IOC

IOC -- Inverse of Control,控制反转,将对象的创建权力反转给Spring框架!!

IOC是一种思想,具体是靠DI依赖注入实现的

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

解决问题:使用IOC可以解决的程序耦合性高的问题!!Spring的工厂读取配置文件。

什么是耦合性

耦合性(Coupling)是指不同模块(类、函数、组件等)之间的相互依赖程度。耦合性是衡量模块独立性的一个重要指标。耦合性越低,模块的独立性越高,系统的可维护性和可扩展性也越好。

在设计软件系统时,通常推荐尽可能降低耦合性,以提高系统的模块化和可维护性。这可以通过使用接口、抽象类、依赖注入等设计模式和技术来实现

IOC的程序入门

 本人使用版本为

idea:idea2017

maven:maven3.5.4

创建Java工程

controller:表现层包

service:业务层包

mapper/dao:持久包

model/pojo/entry/domain:数据库中所对应的实体类包

utils:工具包

impl:实现类包

引入依赖

<dependencies><!--spring的核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!--日志--><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!--Junit测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>

编写接口和实现类,编写具体的实现方法

package com.qcby.service.impl;/*
* 用户模块实现类实现用户模块接口
* 实现其抽象方法
* 耦合度低
* */import com.qcby.service.UserService;public class UserServiceImpl implements UserService{//实现入门@Overridepublic void hello() {System.out.println("Hello IOC!!");}}

编写Spring核心的配置文件,在src目录下创建applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--xml文档中的注释 ctrl+/--><!--IOC管理bean--><!--bean的意义是将该类的创建对象权力转给spring框架--><bean id="userService" class="com.qcby.service.impl.UserServiceImpl" /></beans>

编写测试方法。

package com.qcby.demo;/*
* 测试类
* 测试UserService交给spring管理
* IOC入门
* */import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;public class UserServiceTest {//测试方法@Testpublic void run1(){// 使用Spring的工厂ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 通过工厂获得类:UserService userService = (UserService) applicationContext.getBean("userService");//调用userService.hello();}
}

输出结果为

Spring的默认设计模式为单例模式

IOC技术总结

ApplicationContext接口,工厂的接口,使用该接口可以获取到具体的Bean对象。该接口下有两个具体的实现类。  springCould  配置中心  

这两种方式都可以实现 

1.ClassPathXmlApplicationContext,加载类路径下的Spring配置文件。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

2.FileSystemXmlApplicationContext,加载本地磁盘下的Spring配置文件。

ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("D:\\javacode\\springTest01\\src\\main\\resources\\applicationContext.xml");

Spring框架的Bean管理的配置文件方式

id属性,Bean起个名字,在约束中采用ID的约束,唯一,取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符。

class属性,Bean对象的全路径。

scope属性,scope属性代表Bean的作用范围。

  • singleton单例(默认值),最常用的方式。
  • ​ prototype多例
  • request应用在Web项目中,每次HTTP请求都会创建一个新的Bean
  • session应用在Web项目中,同一个HTTP Session 共享一个Bean

Bean对象的创建和销毁的两个属性配置

说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法

init-method,当bean被载入到容器的时候调用init-method属性指定的方法

destroy-method,当bean从容器中删除的时候调用destroy-method属性指定的方法

实例化Bean对象的三种方式

1.默认是无参数的构造方法(默认方式,基本上使用)

<bean id="userService" class="com.qcby.service.impl.UserServiceImpl" />

2.静态工厂实例化方式

package com.qcby.service.impl;import com.qcby.service.UserService;/*** 静态工厂方式*/
public class StaticFactory {// 静态工厂方式public static UserService createUs(){System.out.println("通过静态工厂的方式创建UserServiceImpl对象...");// 编写很多业务逻辑 权限校验return new UserServiceImpl();}
}<bean id="us" class="com.qcby.service.impl.StaticFactory" factory-method="createUs"/>

实例工厂实例化方式

package com.qcby.service.impl;import com.qcby.service.UserService;/**** 动态工厂方式**/
public class Dfactory {public UserService createUs(){System.out.println("实例化工厂的方式...");return new UserServiceImpl();}
}<bean id="dfactory" class="com.qcby.service.impl.Dfactory" /><bean id="us" factory-bean="dfactory" factory-method="createUs" />

DI依赖注入

依赖注入的概述

IOC和DI的概念

IOC:Inverse of Control,控制反转,将对象的创建权反转给Spring!!

DI:Dependency Injection,依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!!

属性的set方法注入值

编写属性,提供该属性对应的set方法,编写配置文件完成属性值的注入

public class OrderServiceImpl implements OrderService {
​// 编写成员属性,一定需要提供该属性的set方法private OrderDao orderDao;// 一定需要提供该属性的set方法,IOC容器底层就通过属性的set方法方式注入值public void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}
​// 消息private String msg;// 年龄private int age;
​public void setMsg(String msg) {this.msg = msg;}
​public void setAge(int age) {this.age = age;}
​@Overridepublic void saveOrder() {System.out.println("业务层:保存订单..."+msg+" - "+age);// 调用orderDao.saveOrder();}
​
}
public class OrderDaoImpl implements OrderDao {
​@Overridepublic void saveOrder() {System.out.println("持久层:保存订单...");}
​
}<!--DI:依赖注入--><bean id="os" class="com.qcby.service.OrderServiceImpl"><property name="orderDao" ref="od" /><property name="msg" value="你好" /><property name="age" value="30" /></bean><bean id="od" class="com.qcby.dao.OrderDaoImpl"></bean>

 属性构造方法方式注入值

对于类成员变量,构造函数注入 

public class Car {
​// 名称private String cname;// 金额private Double money;
​public Car(String cname, Double money) {this.cname = cname;this.money = money;}
​@Overridepublic String toString() {return "Car{" +"cname='" + cname + '\'' +", money=" + money +'}';}
​
}
<bean id="car" class="com.qcby.demo2.Car"><constructor-arg name="cname" value="大奔" /><constructor-arg name="money" value="400000" /></bean>

 数组,集合(List,Set,Map),Properties等的注入

public class CollectionBean {
​// 数组private String [] strs;public void setStrs(String[] strs) {this.strs = strs;}
​private List<String> list;public void setList(List<String> list) {this.list = list;}
​private Map<String,String> map;public void setMap(Map<String, String> map) {this.map = map;}
​private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}
@Overridepublic String toString() {return "CollectionBean{" +"strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +", properties=" + properties +'}';}
}
<!--给集合属性注入值--><bean id="collectionBean" class="com.qcby.demo3.CollectionBean"><property name="strs"><array><value>美美</value><value>小凤</value></array></property><property name="list"><list><value>熊大</value><value>熊二</value></list></property><property name="map"><map><entry key="aaa" value="老王"/><entry key="bbb" value="小王"/></map></property><property name="properties"><props><prop key="username">root</prop><prop key="password">123456</prop></props></property></bean>

多配置文件方式

多配置文件的加载方式

 在src的目录下又多创建了一个配置文件,现在是两个核心的配置文件,那么加载这两个配置文件的方式有两种!

主配置文件中包含其他的配置文件:

<import resource="applicationContext2.xml"/>

 工厂创建的时候直接加载多个配置文件:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml","applicationContext2.xml");

http://www.mrgr.cn/news/59604.html

相关文章:

  • 基于海思soc的智能产品开发(快速入门)
  • HarmonyOs next 跟着开发文档学习-判断api是否可以使用
  • 通过js控制css变量
  • Spring常见面试题总结
  • vuex使用modules模块化
  • 硬件设计-PCIe时钟抖动测量
  • 【力扣专题栏】两数相加,如何实现存储在链表中的整数相加?
  • jsMind:炸裂项目,用JavaScript构建的思维导图库,GitHub上的热门开源项目
  • 学习qmake
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.C++11(1)
  • jsoup常用语法功能汇总
  • 通过企业架构蓝图(EA Blueprint)构建企业数字化转型之路
  • 文件实时备份软件下载
  • 充分统计量
  • MediaGo(m3u8视频下载工具) v3.0.0.5 免费版
  • w~大模型~合集11
  • .net core 读取 appsettings.json 值
  • 基于SSM轻型卡车零部件销售系统的设计
  • 对角两对双差速轮AGV的动力学解算
  • SpringBoot中yaml配置文件中文字符异常以及将多个独立的IDEA项目整合到一个项目里当做模块的处理
  • visual studio断点无法命中
  • 【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略
  • Oracle 第7章:数据完整性约束
  • 10月27日
  • 【前端面试】Typescript
  • 【遗传算法】基于遗传模拟退火算法的风电功率聚类分析