Spring的核心思想与注解

Spring: 一个开源的企业级应用开发框架,由 Rod Johnson 于 2003 年推出,核心目标是简化 Java 开发,提供一致的编程模型,同时解决企业级应用中的复杂性问题(如依赖管理、事务控制、安全性等)。Spring 框架以 "控制反转(IoC)""面向切面编程(AOP)" 为核心,衍生出一系列子项目(如 Spring Boot、Spring Cloud 等),形成了完整的生态体系,广泛应用于后端服务开发。

目录

一、Spring的核心特性

1、控制反转(IoC/DI(依赖注入)):

2、面向切面编程(AOP):

3、模块化设计:

4、常用Spring生态项目:

二、Spring环境搭建

1、添加坐标(pom.xml)添加spring-context依赖

[2、创建主配置文件(bean.xml 导入依赖后才会出现)](#2、创建主配置文件(bean.xml 导入依赖后才会出现))

[三、Spring IOC / DI](#三、Spring IOC / DI)

1、IOC含义:

2、IOC使用步骤:

(1)将类注入,SpringIOC容器(xml配置,注解实现)

(2)加载Spring主配置文件:

[①. 接口](#①. 接口)

[②. 实现类:](#②. 实现类:)

3、DI含义:

4、DI使用步骤:

实现方式:

[(1)set 注入:](#(1)set 注入:)

[(2) 构造方法注入](#(2) 构造方法注入)

[(3) 属性注入:(一般不用)](#(3) 属性注入:(一般不用))

[四、Spring 对Bean的管理](#四、Spring 对Bean的管理)

1、bean的创建(选其一)

[2、bean 的作用域 (bean的创建方式)](#2、bean 的作用域 (bean的创建方式))

3、bean的生命周期

(1)、实例化:创建对象

(2)、初始化:

(3)、操作使用

(4)、销毁了

五、Spring的注解的使用

1、Spring的发展

2、注解的使用:

(1)、注入类:使用@compone注解标注在类上替换掉之前的xml写法

(2)、注入数据:

方式一:

[@value :修饰成员变量](#@value :修饰成员变量)

方式二:

@Autowired:修饰成员变量注入javaBean

(3)、其他注解:

[1、@Primary 类上](#1、@Primary 类上)

[2、@Qualifier(value="名称") 装配javaBean属性时](#2、@Qualifier(value="名称") 装配javaBean属性时)

[3、@Resource(name="名称") jdk自带的注解 javabean属性](#3、@Resource(name="名称") jdk自带的注解 javabean属性)

[4、@Scope 作用域 修饰类](#4、@Scope 作用域 修饰类)

(4)、配置类注解:

一、Spring的核心特性

1、控制反转(IoC/DI(依赖注入)):

传统开发中,对象的创建和依赖关系由开发者手动管理;而 IoC 模式下,对象的创建、组装权交给 Spring 容器,开发者只需定义对象之间的依赖关系,容器会自动完成实例化和注入。

核心实现:Spring IoC 容器(如 ApplicationContext),通过 XML 配置、注解(如 @Component@Autowired)或 Java 代码定义对象。

2、面向切面编程(AOP):

将日志记录、事务管理、权限校验等横切关注点与业务逻辑分离,通过动态代理实现代码复用,避免重复编码。

典型应用:声明式事务(@Transactional)、日志切面、异常统一处理等。

3、模块化设计:

Spring 框架由多个模块组成,可按需引入:

  • spring Core:Spring框架的最基础部分,提供DI(依赖注入)特性
  • Springweb:为Spring在web应用程序中的使用提供了支持
  • SpringORM:对主流ORM框架(Hibernate、Toplink 等)进行集成
  • Spring Context:Spring上下文,提供bean容器的集合
  • Spring AOP:基于SpringCore的符合规范的其外面编程的实现
  • SpringJDBC:提供了JDBC的抽象层,简化了JDBC编码

4、常用Spring生态项目:

  • Spring Boot:简化 Spring 应用开发,通过 "自动配置" 减少 XML 配置,内置服务器(如 Tomcat),支持快速构建独立运行的应用。
  • Spring Cloud:基于 Spring Boot 的微服务框架,提供服务注册与发现、配置中心、负载均衡等分布式系统解决方案。
  • Spring Data:简化数据访问层开发,支持多种数据库(MySQL、MongoDB 等),通过统一接口减少重复代码。
  • Spring Security:处理认证与授权,保护应用程序安全

二、Spring环境搭建

1、添加坐标(pom.xml)添加spring-context依赖

复制代码
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>5.3.39</version>
</dependency>

2、创建主配置文件(bean.xml 导入依赖后才会出现)

三、Spring IOC / DI

1、IOC含义:

**IOC:(Inversion of Control:控制反转)**是Spring框架的核心思想之一。

**作用:主要用于解耦,提高灵活度,**IOC是指将创建对象的控制权转移给Spring框架进行管理,由Spring框架根据配置文件或注解方式,创建bean对象并管理各个bean对象之间的依赖关系,使对象之间形成松散耦合的关系,实现解耦

  • 控制 :指的是对象创建(实例化,管理)的权利
  • 反转 :控制权交给外部环境(Spring框架,IOC容器)

2、IOC使用步骤:

(1)将类注入,SpringIOC容器(xml配置,注解实现)

复制代码
<bean id="唯一标识" class="实现类的完全限定名称"></bean>

(2)加载Spring主配置文件:

①. 接口

ApplicationContext(接口子): 多例

BeanFactory(父接口):单例

②. 实现类:

ClassPathXmlApplicationContext(实现类):通过加载配置文件的相对路径获取容器对象

FileSystemXmlApplicationContext(实现类):通过加载配置文件的绝对路径获取容器对象

AnnotationConfig Application Context(实现类):通过加载配置类获取容器对象

3、DI含义:

**DI : (dependency inject : 依赖注入)**是对IOC概念的不同角度的描述,是指应用程序再运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象

**作用:**胶水,帮助spring IOC容器,把有依赖关系的javaBean对象粘合在一起

4、DI使用步骤:

实现方式:
(1)set 注入:
  • 提供set 方法

  • 配置xml <ean>子标签<property name =''类属性'' 属性名="属性值"></property>

    java 复制代码
    // 属性:
    // name=======>属性名
    // value======>属性值
    // ref========>属性值的引用
    <bean id="controllerImp" class="com.ape.controller.AccountControllerImpl">-->
          <property name="service" ref="serviceImp"/>-->
     </bean>
(2) 构造方法注入
  • 提供构造方法
  • 配置xml <bean>子标签<constructor-arg 属性名="属性值" value=" "/>
java 复制代码
// 属性:
// name=======>构造方法参数名
// type======>构造方法参数类型
// index========>构造方法参数的下标
    <bean id="controllerImp" class="com.ape.controller.AccountControllerImpl">
        <constructor-arg name="sname" value="张三"/>
    </bean>
(3) 属性注入:(一般不用)

四、Spring 对Bean的管理

1、bean的创建(选其一)

  • 通过反射调用类的无参构造
  • 通过指定的工厂,创建bean对象
  • 通过指定的工厂的静态方法创建bean对象
java 复制代码
<!--     ============================== bean创建的三种方法注入 ====================            -->
<!--     ============================== 1 默认无参创建 ======================            -->
<bean id ="singer" class="com.ape.bean.Singer1"></bean>

<!--     ============================== 2 工厂创建 ======================            -->
   <bean id ="singer" class="com.ape.bean.Singer1" factory-bean="singerFactory" factory-method="createSinger"></bean>
   <bean id ="singerFactory" class="com.ape.factory.Singerfactory"></bean>

<!--     ============================== 2 静态工厂创建 ======================      createSinger为静态方法       -->
    <bean id ="singer" class="com.ape.factory.SingerStaticFactory"  factory-method="createSinger"></bean>

2、bean 的作用域 (bean的创建方式)

  • 含义:bean的创建方式
  • 语法:<bean scope="属性值"></bean>
  • 属性值: singleton: 默认单例 prototype 多例 request:一次请求new一个对象 session 一个会话new一个对象
java 复制代码
<!- beande 作用域  singleton 单例  prototype 多例 request 一次请求  session 一次会话  globalSession 全局会话 默认是singleton ============            -->
<bean id="animal" class="com.ape.bean.Animal" scope="singleton"></bean>

3、bean的生命周期

(1)、实例化:创建对象
(2)、初始化:
  • 接口初始化 实现 implements InitalizingBean 接口
  • 属性初始化 自定义方法 还需要再配置文件<bean>标签中添加 init-method ="方法名"
(3)、操作使用
(4)、销毁了
  • 接口销毁了: 实现 implements DisposableBean 接口
  • 属性销毁了:自定义方法还需要再配置文件<bean>标签中添加 distory-method ="方法名"
java 复制代码
<!--     ============================== bean生命周期 ======================            -->
<!--     ==============================bean生命周期 ======================            -->
<!--    接口方式    -->
   <bean  id="tea" class="com.ape.bean.Teacher1"></bean>
<!--    属性方法方式-->
<bean id="tea" class="com.ape.bean.Teacher1" init-method="doinit" destroy-method="dodispose"></bean>
java 复制代码
package com.ape.bean;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Teacher1 implements InitializingBean, DisposableBean {
    private String name;
    private int age;
    private String subject;

    public Teacher1() {
        System.out.println("===>生命周期:实例化");
    }
    //接口方式实现两个接口类的方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("====》生命周期初始化");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("===》生命周期----销毁了");
    }
    //    属性方式方法
    public void doinit(){
        System.out.println("===>doinit方法初始化");
    }
    public void dodispose(){
        System.out.println("===》dodispose方法销毁了");
    }
}

五、Spring的注解的使用

1、Spring的发展

  • spring2.5前==xml
  • spring2.5后==xml+annotation(优化代码)
  • spring3.0后==annotation+JavaConfig配置类

2、注解的使用:

(1)、注入类:使用@compone注解标注在类上替换掉之前的xml写法

①语法:@Component(value="注入容器中的id,如果省略id为类名且首字母小写,value属性名称可以省略")

②举例:

java 复制代码
<bean id="user" class="com.apesource.包.User"></bean>
等价于
@Component
Class User{
    
}

③注意:

  • @Component 不能单独使用,要配合包扫描使用
java 复制代码
<context:component-scan base-package=""></context:component-scan> //设置包扫描才能扫到注入的此包下的类
  • @ Repository====》注入数据访问层
  • @ Service========>注入业务层
  • @ Controller=====>注入控制层
  • 以上三个注解与**@Component功能语法一**致
(2)、注入数据:
方式一:
@value :修饰成员变量
  • 含义:注入基本数据与String
  • 替换:<property></property>
  • 语法:@Value("数据内容") @Value("${动态获取}")
  • 不能单独用,配合加载配置文件标签:
java 复制代码
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
方式二:
@Autowired:修饰成员变量注入javaBean
  • 语法:@Autowired(required = "true-默认、false、是否必须进行装配")
  • 含义:注入javaBean
  • 注意:默认是按照类型装配,如果容器中有多个类型,则会自动切换为名称装配,若没有该名称,会报NoUniqueBeanDefinitionException异常,如果没有该类型会报NoSuchBeanDefinitionException异常
(3)、其他注解:
1、@Primary 类上
  • 含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)
  • 修饰:类
  • 注意:不能单独使用,必须与@Component....联合使用
2、@Qualifier(value="名称") 装配javaBean属性时
  • 含义:按照名称装配
  • 修饰:成员变量
  • 注意:不能单独使用,必须与@Autowired联合使用
3、@Resource(name="名称") jdk自带的注解 javabean属性
  • 含义:按照名称装配
  • 修饰:成员变量
  • 注意:单独使用
4、@Scope 作用域 修饰类
  • 含义:配置类的作用域
  • 修饰:类
  • 注意:不能单独使用,必须与@Component....联合使用
java 复制代码
@Scope("prototype")
@Scope("singleton")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
//标注在类上
public class test(){
    
}
(4)、配置类注解:

@Configuration:标记为配置类

@ComponentScan(basePackages = "com.ape") :包扫描

@PropertySource(value = "classpath:message.properties"):加载配置文件properties

@Import(DateSourceConfig.class):加载另一个配置类

@Bean:注入类可以注入系统类

相关推荐
21号 15 小时前
9.Redis 集群(重在理解)
数据库·redis·算法
爬山算法5 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
数据库·redis·分布式
嘗_5 小时前
sql特训
数据库·sql
Chen-Edward6 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
云创智城-yuncitys6 小时前
SpringCloud 架构在智慧交通路侧停车系统中的实践:从技术落地到城市级服务升级
spring·spring cloud·架构·智慧城市·停车系统·充电系统源码
wan5555cn7 小时前
周末之美:慢下来,拥抱生活的温柔
数据库
yumgpkpm7 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
1024小神7 小时前
为已有nextjs项目添加supabase数据库,不再需要冗余后端
数据库
天若有情6737 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart