Spring学习笔记

suiyueliushang

spring 框架概述

  • spring是一个开源的轻量级的javaEE框架
  • spring可以解决企业应用开发的复杂性
  • spring有两个核心部分:IOC和AOP
    • IOC:控制反转,把创建对象的过程交给spring进行管理
    • AOP:面向切面,不修改源代码进行功能增强
  • spring优点:
    • 方便解耦,简化开发
    • AOP编程支持
    • 方便程序测试
    • 方便和其他框架进行整合
    • 方便进行事务操作
    • 降低API开发难度

IOC容器

  1. IOC底层原理
  2. IOC接口
  3. IOC操作Bean管理(基于xlm)
  4. ICO操作Bean管理(基于注解)

IOC底层原理

什么是IOC

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

IOC底层原理

  1. IOC底层原理:反射+工厂模式

IOC接口

  1. IOC思想基于IOC容器实现,IOC容器底层就是对象工厂
  2. Spring提供IOC容器实现两种方式:(两个接口)
    • BeanFactory: IOC容器的基本实现,是Spring内部使用接口,不提供开发人员使用(加载配置文件的时候不会创建对象,在获取对象的时候才会创建对象)
    • ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员使用(加载配置文件的时候就会创建)耗时耗力的事情在开始完成
  3. ApplicationContext有实现类

IOC操作Bean管理

什么是bean

简单来说,bean就是哪些被IoC容器所管理的对象。我们需要告诉IoC容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是XML、注解或者java配置类。

Bean管理

(1)创建对象

(2)注入属性

org.springframework.contextorg.springframework.context这两个包是IoC实现的基础

Bean管理操作实现方式

  1. 基于xml配置文件方式
  2. 基于注解方式

基于xml方式创建对象

1
2
3
4
<!--配置user对象属性-->
<beans>
<bean id="user" class="com.spring.User"></bean>
</beans>
  • 创建对象的时候,默认也是执行无参构造方法完成对象创建

基于xml方式注入属性

依赖注入(DI):注入属性

  • 使用set进行注入
1
2
3
4
<!--使用set进行属性注入,需要写set函数-->
<bean id="user" class="com.spring.User">
<property name="属性名" value="属性值"></property>
</bean>
  • 使用有参数构造方法进行注入
1
2
3
4
<!--使用有参构造函数方式进行注入-->
<bean id="user" class="com.spring.User">
<consturctor-arg name="属性名" value="属性值"></property>
</bean>

两种方式对比

  • p名称空间注入

    只是简化xml配置的一种写法

基于xml方式注入其他类型的属性

  1. 字面量

    1. null
    1
    2
    3
    4
    <property name="属性名" >
    <null>
    </null>
    </property>
    1. 特殊符号(包含<,>等)

              - 把特殊符号进行转义:&lt,&gt
      
              - 把特殊符号写入![CDATA[]]中
      
    2. 注入集合

    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 的注解
  1. @Component :通用的注解,可以标注任意类为Spring组件

  2. @Repository :对应持久化层即Dao层,主要用于数据库相关操作

  3. @Service :对应服务层

  4. @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
@Configuration
public class AppConfig {
@Bean
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
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}

参考

  • 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