Spring整理总结-IOC(一)

233 阅读4分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

前言

随着技术发展,现在想要搭建一个工程,开发一个小项目变得越来越简单,直接创建一个spring boot工程,引入一些需要的依赖,就可以上手开发。简单到我们慢慢的忽略技术最初始的样貌,当出现一些问题的时候,就只能靠搜索关键字,面向百度编程,其实后来发现有很多问题,我们只要静下心来,结合所学合理分析,多半也能解决问题,而且可以定位问题所在,心里也有底气。所以我们在使用现有框架的时候,有必要也应该去简单了解一下底层。

一、Spring框架概述

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

  • IOC: 控制反转,把创建对象的过程交给Spring 进行管理
  • AOP: 面向切面,不修改源代码进行功能增强 Spring的特点:
  • 方便解耦,简化开发
  • AOP编程支持
  • 方便程序测试
  • 方便和其他框架进行整和
  • 方便进行事务操作
  • 降低API开发难度

二、IOC容器

1. IOC概率和原理

什么是IOC ?

控制反转,把对象创建和对象之间的调用过程,交给spring管理
使用IOC的目的:为了降低耦合度

IOC底层原理

主要使用了xml解析、工厂模式、反射

IOC过程

  • 第一步 xml配置文件,配置要创建的对象
<!--配置User对象创建-->
<bean id="user" class="com.yang.spring5.User"></bean>
  • 第二步 创建工厂类,通过xml解析,获取class属性值,再通过反射创建对象

2. IOC接口(BeanFactory)

  • IOC思想是基于IOC容器完成的,IOC容器的底层就是对象工厂
  • Spring提供IOC容器实现的两种方式
    • BeanFactory:IOC容器基本实现,Spring内部使用接口,不提供开发人员使用(加载配置文件的时候不会创建对象,获取对象的时候才会去创建对象)
    • ApplicationCpntext:BeanFactory的子接口,功能更加强大,一般由开发人员使用(加载配置文件的时候就会把配置文件中的对象进行创建)

3. Bean管理

什么是Bean管理?

Bean管理实际上是指两个操作

  • Spring创建对象
  • Spring注入属性

IOC操作Bean管理(基于xml)

Spring配置文件中,使用bean标签,标签里添加对应属性,就可以实现对象创建。

<!--配置User对象创建-->
<bean id="user" class="com.yang.spring5.User"></bean>

bean标签中常用属性

  • id:唯一标识
  • class:类全路径
  • name:类似与id属性,区别是name可以加特殊标识,如 “/” 等。

创建对象的时候,默认执行无参构造方法,完成对象创建。

属性注入(DI)

set注入、构造器注入、P名称空间注入

FactoryBean的注入

  • 普通beanxml中定义什么类型的bean,即返回什么类型的bean
  • 工厂beanxml中定义的类型可以和返回的类型不一样
  • 工厂bean实现方式:
    • 创建工厂类,实现FactoryBean接口
    • 实现接口中的方法,在方法中定义返回的类型

IOC操作Bean管理(基于注解)

1. 什么是注解?

(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置

2. Spring针对Bean管理提供的注解(下面四个注解功能一样,都可以用来创建实例)

@Component
@Service
@Controller
@Repository

3. 基于注解方式实现对象创建

  • 引入AOP依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>
  • 开启注解扫描
<!--开启注解扫描 1.扫描多个包,多个包使用逗号隔开 2.扫描包的上层目录 -->
<context:component-scan base-package="com.yang.spring5"></context:component-scan>
  • 创建类,加上注解
//在注解里面 value 属性值可以省略不写,
//默认值是类名称,首字母小写
//StudentService -- studentService
@Service(value = "studentService") //注解等同于XML配置文件:<bean id="studentService" class=".."/>
public class StudentService {
    public void show() {
        System.out.println("service show ......");
    }
}
  • 开启组件扫描细节配置
<!--示例 1
     use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter
     context:include-filter ,设置扫描哪些内容
-->
<context:component-scan base-package="com.yang.spring5" use-default-filters="false">
  <!--代表只扫描Controller注解的类-->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--示例 2
 下面配置扫描包所有内容
 context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.yang.spring5">
    <!--表示Controller注解的类之外一切都进行扫描-->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
  • 基于注解方式实现属性注入

@AutoWired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入,这个@Qualifier 注解的使用,和上面@Autowired 一起使用
@Resource:可以根据类型注入,也可以根据名称注入
** @Value**:普通类型值注入

  • 完全注解开发

创建配置类,替换xml配置文件

@Configuration //作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.yang.spring5"})
public class SpringConfig {
    
}