狂神 spring笔记
-
官网:https://docs.spring.io/spring-framework/docs/current/reference/html/overview.html#overview
-
官方下载地址:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.2</version>
</dependency>
1.2. 优点
-
Spring是一个开源的免费的框架(容器)
-
Spring是一个轻量级的,非侵入式的框架
-
控制反转(IOC
Inversion of Control
和面向切面编程(AOPAspect Oriented Programming
) -
支持事务的处理,对框架整合的支持!
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
1.3. 组成
-
Spring-Core:Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
-
Spring-Context:核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了消息、事件传播以及验证的支持。另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。
-
Spring-Aop:Spring在它的AOP模块中提供了对面向切面编程的丰富支持。例如方法拦截器(servletListener ,controller....)和切点,可以有效的防止代码上功能的耦合,这个模块是在Spring应用中实现切面编程的基础。Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。
-
Spring-Dao:使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接、旧代码中迁移自定义工具类JDBCUtil 也让开发变得繁琐。Spring的Dao模块对传统的JDBC进行了抽象,还提供了一种比编程性更好的声明性事务管理方法。
-
Spring-Web:Web上下文模块建立于应用上下文模块之上,提供了WEB开发的基础集成特性,例如文件上传。另外,这个模块还提供了一些面向服务支持。利用Servlet listeners进行IOC容器初始化和针对Web的applicationcontext。
-
Spring Web MVC:(Model-View-Controller)Spring为构建Web应用提供了一个功能全面的MVC框架。它提供了一种清晰的分离模型,在领域模型代码和web form之间。并且,还可以借助Spring框架的其他特性。
-
Spring-ORM:关系映射模块,ORM包为流行的“关系/对象”映射APIs提供了集成层,包括JDO,Hibernate和iBatis(MyBatis)。通过ORM包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,方便开发时小组内整合代码。
2. IOC理论推导spring-01-ioc1
3. HelloSpringspring-02-hellospring
4. IOC创建对象的方式
-
使用无参构造创建!默认
-
有参构造创建
5. Spring配置说明
-
别名
<!-- 别名 -->
<alias name="user" alias="xiaofan"/>
-
Bean的配置
<!--使用spring来创建对象,在spring这些都是bean-->
<bean id="hello" class="com.xiaofan.pojo.Hello" name="hello2, h2">
<property name="name" value="spring..."/>
</bean>
6. 依赖注入spring-03-di
-
构造方法注入
-
set方式注入[重点]
-
依赖: bean对象的创建依赖容器
-
注入:bean对象中的所有属性,由容器来注入!
-
-
拓展方式注入
注意点:p命名和c命名空间不能直接使用,需要导入xml约束!
-
bean的作用域
-
单例模式(Spring默认机制)
-
原型模式
-
其余的request、session、application、这些个只能在web开发中使用
-
7. Bean的自动装配
8. 使用注解开发
-
bean
@Component
-
属性如何注入
@Value("kuangshen")
-
衍生的注解
-
自动装配配置
-
作用域
9. 使用Java的方式配置Springspring-07-appconfig
package com.xiaofan.config;
import com.xiaofan.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* 这个也会被spring容器托管,注册到容器中,因为他本来就是一个@Component
* @Configuration代表这是一个配置类,就和我们之前看到的beans.xml一样
*/
10. 代理模式spring-08-proxy
-
静态代理
-
动态代理
11. AOP
-
方式一 (使用原生的Spring API接口)
package com.xiaofan.log;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class Log implements MethodBeforeAdvice {
// method: 要执行的目标对象的方法
// args: 参数
// target: 目标对象
import com.xiaofan.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.query();
}
}
-
方式二(使用自定义类)
package com.xiaofan.diy;
public class DiyPointCut {
public void before() {
System.out.println("========方法执行前========");
}
public void after() {
System.out.println("========方法执行后========");
}
}
<bean id="diy" class="com.xiaofan.diy.DiyPointCut"/>
<aop:config>
<!--自定义切面,ref 要引用的类-->
<aop:aspect ref="diy">
<!--切入点-->
<aop:pointcut id="point" expression="execution(* com.xiaofan.service.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
-
方式三(使用注解实现)
package com.xiaofan.diy;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
* 使用注解实现AOP
*/
<!--方式三-->
<bean id="annotationPointCut" class="com.xiaofan.diy.AnnotationPointCut"/>
<!--开启aop注解支持-->
<aop:aspectj-autoproxy />
12.整合mybatis
12.1. 整合Mybatis方式一spring-10-mybatis
-
UserMapperImpl
.java
package com.xiaofan.mapper;
import com.xiaofan.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
// 我们的所有操作,都是用sqlSession来执行,在原来,现在都是用sqlSessionTemplate;
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
-
UserMapper.xml
-
mybatis-config.xml
-
spring-dao.xml
-
applicationContext.xml
-
MyTest.java
import com.xiaofan.mapper.UserMapper;
import com.xiaofan.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
import java.util.List;
public class MyTest {
12.2. 整合mybatis方式二
-
UserMapperImpl2.java
package com.xiaofan.mapper;
import com.xiaofan.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
-
applicationContext.xml
-
spring-dao.xml
13. 声明式事务
-
声明式事务AOP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端