这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
前言
随着技术发展,现在想要搭建一个工程,开发一个小项目变得越来越简单,直接创建一个
spring boot工程,引入一些需要的依赖,就可以上手开发。简单到我们慢慢的忽略技术最初始的样貌,当出现一些问题的时候,就只能靠搜索关键字,面向百度编程,其实后来发现有很多问题,我们只要静下心来,结合所学合理分析,多半也能解决问题,而且可以定位问题所在,心里也有底气。所以我们在使用现有框架的时候,有必要也应该去简单了解一下底层。
一、Spring框架概述
Spring是轻量级的开源JavaEE框架,可以解决企业应用开发的复杂性
Spring的两个核心部分:IOC 和 AOP
- 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的注入
- 普通
bean:xml中定义什么类型的bean,即返回什么类型的bean- 工厂
bean:xml中定义的类型可以和返回的类型不一样- 工厂
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 {
}