Spring学习笔记
spring 框架概述
- spring是一个开源的轻量级的javaEE框架
- spring可以解决企业应用开发的复杂性
- spring有两个核心部分:IOC和AOP
- IOC:控制反转,把创建对象的过程交给spring进行管理
- AOP:面向切面,不修改源代码进行功能增强
- spring优点:
- 方便解耦,简化开发
- AOP编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低API开发难度
IOC容器
- IOC底层原理
- IOC接口
- IOC操作Bean管理(基于xlm)
- ICO操作Bean管理(基于注解)
IOC底层原理
什么是IOC
(1)控制反转,把对象创建和对象之间的调用过程,交给Spring管理
(2)使用IOC的目的:为了降低耦合度
IOC底层原理
- IOC底层原理:反射+工厂模式
IOC接口
- IOC思想基于IOC容器实现,IOC容器底层就是对象工厂
- Spring提供IOC容器实现两种方式:(两个接口)
- BeanFactory: IOC容器的基本实现,是Spring内部使用接口,不提供开发人员使用(加载配置文件的时候不会创建对象,在获取对象的时候才会创建对象)
- ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员使用(加载配置文件的时候就会创建)耗时耗力的事情在开始完成
- ApplicationContext有实现类
IOC操作Bean管理
什么是bean
简单来说,bean就是哪些被IoC容器所管理的对象。我们需要告诉IoC容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是XML、注解或者java配置类。
Bean管理
(1)创建对象
(2)注入属性
org.springframework.context
和org.springframework.context
这两个包是IoC实现的基础
Bean管理操作实现方式
- 基于xml配置文件方式
- 基于注解方式
基于xml方式创建对象
1 | <!--配置user对象属性--> |
- 创建对象的时候,默认也是执行无参构造方法完成对象创建
基于xml方式注入属性
依赖注入(DI):注入属性
- 使用set进行注入
1 | <!--使用set进行属性注入,需要写set函数--> |
- 使用有参数构造方法进行注入
1 | <!--使用有参构造函数方式进行注入--> |
两种方式对比
p名称空间注入
只是简化xml配置的一种写法
基于xml方式注入其他类型的属性
字面量
- null
1
2
3
4<property name="属性名" >
<null>
</null>
</property>特殊符号(包含<,>等)
- 把特殊符号进行转义:<,> - 把特殊符号写入![CDATA[]]中
注入集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<bean id="student",class="com.spring.Student">
<preperty name="list">
<list>
<value>java课程</value>
<value>数据库</value>
</list>
</preperty>
<!--map属性注入-->
<property name="maps">
<map>
<entry key="" value=""></entry>
</map>
</property>
<preperty name="sets">
<set>
<value>java课程</value>
<value>数据库</value>
</set>
</preperty>
</bean>4. 注入对象集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14<!--集合中要保存的对象-->
<bean id="couese1" class="com.spring.collection.Couese">
<property name="cname" value="Spring5框架"></property>
</bean>
<bean id="couese2" class="com.spring.collection.Couese">
<property name="cname" value="MyBatis框架"></property>
</bean>
<!--对象集合-->
<property name="courseList">
<list>
<ref bean="couese1"></ref>
<ref bean="couese2"></ref>
</list>
</property>注入属性-外部bean
注入对象类型的属性
1
2
3
4
5
6<!--对象参数注入-->
<bean id="service" class="com.spring.Service">
<property name="userDAO" ref="userdao"></property>
</bean>
<bean id="userdao" class="com.spring.UserDAO">
</bean>注入属性-内部bean
1
2
3
4
5
6<!--对象参数注入-->
<bean id="service" class="com.spring.Service">
<property name="userDAO">
<bean id="userdao" class="com.spring.UserDAO"></bean>
</property>
</bean>
基于注解的方式
将一个类声明为 Bean 的注解
@Component
:通用的注解,可以标注任意类为Spring组件@Repository
:对应持久化层即Dao层,主要用于数据库相关操作@Service
:对应服务层@Controller
:对应Spring MVC控制层,主要用于接受用户请求并调用Service层返回数据给前端页面
@Component
和@Bean
的区别是什么
@Component
注解作用于类,而@Bean
注解作用于方法@Component
通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用@ComponentScan
注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean
注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean
告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。@Bean
注解比@Component
注解的自定义性更强,而且很多地方我们只能通过@Bean
注解来注册 bean。比如当我们引用第三方库中的类需要装配到Spring
容器时,则只能通过@Bean
来实现。
@Bean
注解使用实例:
1
2
3
4
5
6
7
public class AppConfig {
public TransferService transferService() {
return new TransferServiceImpl();
}
}相当于下面的
XML
配置:
1
2
3 <beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>下面这段通过
@Component
无法实现
1
2
3
4
5
6
7
8
9
10
11
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
参考
- [Spring常见面试题总结](Spring常见面试题总结 | JavaGuide(Java面试+学习指南) )
- bilibili尚硅谷Spring教程
- Title: Spring学习笔记
- Author: suiyueliushang
- Created at: 2023-04-22 18:02:02
- Updated at: 2023-04-27 16:23:17
- Link: https://suiyueliushang.github.io/2023/04/22/Spring学习笔记/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments