Spring IOC详解与配置

Spring:

框架:

具有一定功能的半成品软件,基于框架会节省开发成本

框架作用:

提高开发效率、复用性、编写规范、节约维护成本、解耦底层实现原理

Spring:

  • Spring是分层的JavaSE/EE应用full-stack轻量级开源框架
  • Spring主要是做整合,可以理解是一搜航空母舰,上面放置了很多的战斗机
  • Spring核心是IOC(控制反转) 和 AOP(面向切面编程)
  • Spring提供了对各种优秀框架的支持和 整合
Spring优点:
  1. IOC解耦
  • 可以将对象间的依赖关系交由spring管理
  • 避免硬编码造成的程序间过渡耦合
  1. 支持AOP
  • 可以使用切面编程思想对方法进行增强
  1. 支持声明式事务
  • 可以通过配置或者注解的方式管理事务
  • 不需要硬编码管理事务
  1. 方便测试
  • 可以通过注解方便的测试Spring程序
  1. 方便集成
  • 其内部提供了对各种优秀框架的直接支持
  1. 使用简单
  • Spring对很多难用的API做了简单的封装
  1. 设计精良
  • Spring的源码设计精妙、结构清晰值得学习
不使用Spring会有什么影响:

会造成(常见的):

  1. 依赖问题
  2. 耦合问题
    1. 实现类丢失会影响其他层
      2. 实现类切换会影响其他层
  3. 创建顺序
  4. 对象个数
Spring体系结构:

在这里插入图片描述

Data Access/Integration
  • JDBC: 对各大数据库厂商进行抽象处理
  • ORM: 集成orm框架支持对象关系映射处理
  • OXM: 提供了对 Object/XML映射实现的抽象层
  • JMS: 主要包含了一些制造和消费消息的特性
  • Transactions: 支持编程和声明式事务管理
Web
  • Websocket: 提供了WebSocket和SocketJS的实现
  • Servlet: 利用MVC(model-view-controller)的实现分离代码
  • Web: 提供了基础的面向 Web 的集成特性(如: 文件上传)
  • Portlet: 提供了Portlet环境下的MVC实现
中间层
  • AOP: 提供了符合AOP要求的面向切面的编程实现
  • Aspects: 提供了与AspectJ的集成功能
  • Instrumentation: 提供了类植入(Instrumentation)的支持和类加载器的实现
  • Messaging: 用于构建基于消息的应用程序
Core Container
  • Beans: Bean工厂与bean的装配
  • Core: 依赖注入IoC与DI的最基本实现
  • Content: IOC容器的企业服务扩展
  • SpEl: 用于在运行时查询和操纵对象的表达式
Test
  • 支持使用 JUnit 和 TestNG 对 Spring 组件进行测试
耦合&内聚:

耦合(Coupling)

代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度

内聚(Cohesion)

代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个模块内部的功能联系

程序书写的目标:高内聚、低耦合,就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度不要那么紧密

在这里插入图片描述

配置文件耦合不是java类耦合,解决耦合问题
在这里插入图片描述

IOC容器:

  • IoC(Inversion Of Control)控制反转,Spring反向控制应用程序所需要使用的外部资源,转交给第三方(工厂)完成
  • Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器
  • Ioc就是从自己new对象,变成spring给你对象,都放在ioc容器里

IOC的作用:

  1. 解耦: 利用IOC的工厂模式解耦创建对象的过程
    • 解决代码耦合度过高问题
  2. 存储对象: 可以将创建好的对象 存储 起来重复使用
    • 解决对象个数问题
  3. 管理依赖关系: 可以将依赖对象注入需要的对象当中
    • 解决依赖关系问题
  4. 管理对象创建顺序: 可以根据依赖关系先后创建对象
    • 解决创建顺序问题
入门案例:
  1. 导入spring坐标(5.1.9.release)
    <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
    </dependencies>
  1. 编写业务层与表现层(模拟)接口与实现类
public interface UserService {
    public void save();
}
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("UserService执行");
    }
  1. 建立spring配置文件,配置所需资源(Service)为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">

    <!--创建spring控制资源   id随便写,class写实现类-->
    <bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
</beans>
  1. 测试
public class UserServiceTest {
    @Test
    public void save() {
        // 加载配置文件
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 获取资源
        UserService userService = (UserService) ctx.getBean("userService");
        userService.save();
    }
}

IoC配置(XML格式)

bean
  • 名称:bean
  • 类型:标签
  • 归属:beans标签
  • 作用:定义spring中的资源,受此标签定义的资源将受到spring控制
属性说明
id对象的引用名称;一定要唯一; 一次只能定义一个引用名称,通过id值获取bean
name对象的引用名称; 与id区别是:name一次可以定义多个引用名称。
classbean的类型,类的全限定名称
init-method指定类中初始化方法的名称,在构造方法执行完毕后立即执行
destroy-method指定类中销毁方法名称,在销毁spring容器前执行
lazy-init设置为true表示在第一次使用对象的时候才创建,只对单例对象有效。
scope设置bean的作用范围, 取值:
singleton:单例, 默认值;
prototype:多例
request:web项目中,将对象存入request域中
session:web项目中,将对象存入session域中
globalsession:web项目中,将对象应用于集群环境,没有集群相当于session

格式:

<beans>
	<bean />
</beans>

基本属性:

<!--    id:bean的名称,通过id值获取bean
        class:bean的类型
        name:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名,可以定义多个,用逗号隔开,测试类写哪个都可以获取
-->
 <bean id="userService" name="userService2,userService3" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
  • BeanFactory是Spring容器的顶层接口, 采用 延迟创建 对象的思想
  • ApplicationContext是BeanFactory的子接口, 采用 即时创建 对象的思想
bean属性scope
  • 名称:scope

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean的作用范围

  • 格式:

<!--
        scope: 设置对象的作用范围
            singleton: 默认值, 表示为单例模式: 对象只创建一次
            prototype: 多例模式, 标识对象每次使用都创建一个新的 (并且不会将对象存储到IOC容器中)
    -->
    <bean init-method="init" destroy-method="destroy" scope="prototype" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
    @Test
    public void save2() {
        // 加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 获取资源
        UserService userService = (UserService) context.getBean("userService");
        UserService userService2 = (UserService) context.getBean("userService");
        System.out.println(userService);
        System.out.println(userService2);
        System.out.println(userService == userService2);

/*      singleton打印结果
        com.itzhzhu.service.impl.UserServiceImpl@3f6f6701
        com.itzhzhu.service.impl.UserServiceImpl@3f6f6701
        true
        prototype打印结果
        com.itzhzhu.service.impl.UserServiceImpl@52b1beb6
        com.itzhzhu.service.impl.UserServiceImpl@273e7444
        false
*/
    }

取值:

  • singleton(默认配置):设定创建出的对象保存在spring容器中,是一个单例的对象,地址值都一样的,加载spring容器的时候就会初始化
  • prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象,加载容器不初始化,获取的对象时候创建,用一个创建一个
  • request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
bean生命周期
  • 名称:init-method,destroy-method

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象在初始化或销毁时完成的工作

  • 格式:

<bean init-method="init" destroy-method="destroy></bean>

取值:bean对应的类中对应的具体方法名

注意事项:

  • 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次

  • 当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次

  • 当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次

  • 当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行

bean对象创建方式
factory-bean

如果项目之前没有使用Spring会用到这种方式

  • 名称:factory-bean

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象创建方式,使用静态工厂的形式创建bean,兼容早期遗留系统的升级工作

  • 格式:

<bean class="FactoryClassName" factory-method="factoryMethodName"></bean>

取值:工厂bean中用于获取对象的静态方法名

注意事项:

  • class属性必须配置成静态工厂的类名
factory-bean,factory-method
  • 名称:factory-bean,factory-method

  • 类型:属性

  • 归属:bean标签

  • 作用:定义bean对象创建方式,使用实例工厂的形式创建bean,兼容早期遗留系统的升级工作

  • 格式:

<!--实例工厂对应的bean-->
<bean id="factoryBeanId" class="类路径"/>
<!--实例工厂创建bean。依赖工厂对象对应的bean  factory-bean写上面的id,method写对应的方法名-->
<bean id="起名" factory-bean="对应上面的bean id" factory-method="factoryMethodName"/>

取值:工厂bean中用于获取对象的实例方法名

注意事项:

  • 使用实例工厂创建bean首先需要将实例工厂配置bean,交由spring进行管理

  • factory-bean是实例工厂的beanId

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzhuzhu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值