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 导入依赖后才会出现)
三、Spring IOC / DI
1、IOC含义:
2、IOC使用步骤:
(1)将类注入,SpringIOC容器(xml配置,注解实现)
(2)加载Spring主配置文件:
①. 接口
②. 实现类:
3、DI含义:
4、DI使用步骤:
实现方式:
(1)set 注入:
(2) 构造方法注入
(3) 属性注入:(一般不用)
四、Spring 对Bean的管理
1、bean的创建(选其一)
2、bean 的作用域 (bean的创建方式)
3、bean的生命周期
(1)、实例化:创建对象
(2)、初始化:
(3)、操作使用
(4)、销毁了
五、Spring的注解的使用
1、Spring的发展
2、注解的使用:
(1)、注入类:使用@compone注解标注在类上替换掉之前的xml写法
(2)、注入数据:
方式一:
@value :修饰成员变量
方式二:
@Autowired:修饰成员变量注入javaBean
(3)、其他注解:
1、@Primary 类上
2、@Qualifier(value="名称") 装配javaBean属性时
3、@Resource(name="名称") jdk自带的注解 javabean属性
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>
// 属性: // name=======>属性名 // value======>属性值 // ref========>属性值的引用 <bean id="controllerImp" class="com.ape.controller.AccountControllerImpl">--><property name="service" ref="serviceImp"/>--></bean>
(2) 构造方法注入
- 提供构造方法
- 配置xml <bean>子标签<constructor-arg 属性名="属性值" value=“ ”/>
// 属性:
// name=======>构造方法参数名
// type======>构造方法参数类型
// index========>构造方法参数的下标<bean id="controllerImp" class="com.ape.controller.AccountControllerImpl"><constructor-arg name="sname" value="张三"/></bean>
(3) 属性注入:(一般不用)
四、Spring 对Bean的管理
1、bean的创建(选其一)
- 通过反射调用类的无参构造
- 通过指定的工厂,创建bean对象
- 通过指定的工厂的静态方法创建bean对象
<!-- ============================== 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一个对象
<!- 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 =“方法名”
<!-- ============================== 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>
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("===>生命周期:实例化");}//接口方式实现两个接口类的方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("====》生命周期初始化");}@Overridepublic 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属性名称可以省略")
②举例:
<bean id="user" class="com.apesource.包.User"></bean>
等价于
@Component
Class User{}
③注意:
- @Component不能单独使用,要配合包扫描使用
-
<context:component-scan base-package=""></context:component-scan> //设置包扫描才能扫到注入的此包下的类
- @Repository====》注入数据访问层
- @Service========>注入业务层
- @Controller=====>注入控制层
- 以上三个注解与@Component功能语法一致
(2)、注入数据:
方式一:
@value :修饰成员变量
- 含义:注入基本数据与String
- 替换:<property></property>
- 语法:@Value("数据内容") @Value("${动态获取}")
- 不能单独用,配合加载配置文件标签:
-
<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....联合使用
-
@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:注入类可以注入系统类