一、Spring概述
1.Spring简介
1.1为什么要Spring
Spring 让每个人都可以更快、更轻松、更安全地编写 Java。Spring 对速度、简单性和生产力的关注 ,使其成为世界上最受欢迎的Java 框架。
1.2Spring是什么
Spring是以IOC(inverse of control控制反转)和AOP(aspect oriented progamming面向切面编程)为内核的轻量级、分层、松耦合的开源框架,提供了企业级复杂性的一站式解决方案,是整合的第三方开源技术的容器
紧耦合可以两个人绑在了一起, 行动起来相互限制。 两个人最好都别动。
松耦合可以比喻为两个人结队行动。 但是没有绳子连接着。行动不怎么受限
1.3Spring的组成
Spring的7大模块
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,它 是工厂模式的实现。 BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范 与实际的应用程序代码分开。
Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以 将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次 结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
二、IOC简单理解
ioc控制反转是一种思想,以后就不需要我们自己去new一个对象,管理一个对象,这些事情全部交给spring去做,spring会自动帮我们去创建 、管理对象,我们只管使用就是。
三、快速入门一个Spring
3.1导入spring相关依赖
<packaging>jar</packaging>
<dependencies>
<!--spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
3.2创建一个实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Integer id;
private String name;
private String pwd;
}
3.3创建一个application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--注册bean交给spring管理创建、管理、分配 我们不需要做任何事情
Ioc inverse of control 创建对象的角色反转
-->
<bean id="user" class="com.hq.hml.User"></bean>
</beans>
3.4测试
public void Test(){
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//获取配置文件里面的bean
Object user = context.getBean("user");
System.out.println(user);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkUleIK6-1661496067504)(C:\Users\huang\AppData\Roaming\Typora\typora-user-images\image-20220812152347464.png)]
四、对象的创建和获取
4.1对象的创建
<bean id="student" name="stu" class="com.hq.hml.Student">
<!--1.通过构造方法的名称构造-->
<!-- <constructor-arg name="name" value="杨梅梅"/>
<constructor-arg name="sex" value="女"/>-->
<!--2.通过构造方法的索引进行初始化-->
<!-- <constructor-arg index="0" value="杨梅梅"/>-->
<!-- <constructor-arg index="1" value="nv"/>-->
<!--3.通过构造方法的类型进行初始化-->
<constructor-arg type="java.lang.String" value="杨梅梅"/>
<constructor-arg type="java.lang.String" value="女"/>
</bean>
4.2对象的获取
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//获取配置文件里面的bean对象
//1.强制类型转换
Student stu = (Student) context.getBean("stu");
System.out.println(stu);
//2.通过反射
Student stu1 = context.getBean("stu", Student.class);
System.out.println(stu1);
//通过类型获取(不需要id)
Student bean = context.getBean(Student.class);
System.out.println(bean);
}
五、依赖注入DI(就是赋值)
5.1通过构造方法注入
<bean id="student" name="stu" class="com.hq.hml.Student">
<!--1.通过构造方法的名称构造-->
<!-- <constructor-arg name="name" value="杨梅梅"/>
<constructor-arg name="sex" value="女"/>-->
<!--2.通过构造方法的索引进行初始化-->
<!-- <constructor-arg index="0" value="杨梅梅"/>-->
<!-- <constructor-arg index="1" value="nv"/>-->
<!--3.通过构造方法的类型进行初始化-->
<constructor-arg type="java.lang.String" value="杨梅梅"/>
<constructor-arg type="java.lang.String" value="女"/>
</bean>
5.2通过set注入
<bean id="user" name="u" class="com.hq.hml.User">
<!--DI依赖注入 实际上是set注入
将属性名首字母大写拼接set 找到set方法-->
<property name="id" value="1"/>
<property name="name" value="黄明亮"/>
<property name="pwd" value="love"/>
<!--对象注入-->
<property name="date" ref="date"/>
<!--数组注入-->
<property name="list" >
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<!--空值注入-->
<property name="nul"><null/></property>
<property name="map">
<map>
<entry key="1" value="Huang"></entry>
<entry key="2" value="dddd"></entry>
</map>
</property>
</bean>
<bean id="date" class="java.util.Date"/>
5.3通过p和c注入
需要导入依赖
xmlns:p=“http://www.springframework.org/schema/p”
xmlns:c=“http://www.springframework.org/schema/c”
<!-- p空间注入 等价于set注入 -->
<bean id="user1" name="u1" class="com.hqyj.entity.User" p:userName="zhang3"/>
<!-- c空间注入 等价于构造方法注入,构造方法注入必须为每个参数赋值 -->
<bean id="user2" name="u2" class="com.hqyj.entity.User" c:id="1"
c:userName="li4" c:password="123"/>
六、自动装配
自动装配:spring会在应用(配置文件)的上下文中为某个组件寻找其依赖的bean。
本质:
组件扫描(component scanning): spring会自动发现配置文件上下文中所创建的bean。
自动装配(autowiring):spring会自动装配满足bean之间的依赖关系。
6.1byName通过名称自动装配
原理:
查找实体类中属性set方法
将set方法拆分为set+属性,将属性首字母变小写得到字符串
根据字符串寻找spring容器中的id
如果有则装配,如果没有则为null
<bean id="people" class="com.hqyj.entity.People" autowire="byName">
<property name="name" value="li4"/>
</bean>
6.2 byType方式通过类型装配
通过类型装配,必须保证spring容器中的类型是唯一的,如果不唯一则会报
<bean id="people" class="com.hqyj.entity.People" autowire="byType">
<property name="name" value="li4"/>
</bean>
6.3通过注解进行装配
首先开启注解支持并注册三个bean
<!--开启注解支持-->
<context:annotation-config></context:annotation-config>
<!--注册三个bean-->
<bean id="person" class="com.hq.hml.entity.Person"/>
<bean id="son" class="com.hq.hml.entity.Son"/>
<bean id="father" class="com.hq.hml.entity.Father"/>
private String name;
@Autowired//通过byType进行自动装配
@Qualifier("son")//指定name 不能单独使用
private Son son
@Resource(name = "father")//如果没有指定name按照byType装配,等价于 @Autowired和qualifier的结合体
private Father father;
@Qualifier和@Autowired配合使用可以选择id自动装配【推荐】
注意:@Qualifier不能单独使用
七、注解开发
/*为了分层开发的友好 提供了额外的注解
* Repository dao层
* Service service层
* Controller controller层
* */
@Component(value = "user")//在xml文件中注册了一个bean value="" 设置别名
public class User {
@Value("1") //初始化
private Integer userId;
@Value("黄明亮")
private String userName;
@Value("love")
private String passWord;
}
只需要在xml文件中开启扫描包即可
<!--开启扫描包-->
<context:component-scan base-package="com.hq.hml.entity"/>
八、spring整合junit
首先在pom文件中导入spring-test 不要忘记刷新maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
直接进行测试
@RunWith(SpringJUnit4ClassRunner.class)//以junit方式启动
@ContextConfiguration(locations = "classpath:user.xml")//指定位置
public class TestJunit1 {
@Autowired//自动装配
private User user;
@Test
public void Test1(){
System.out.println(user);
}
}
ersion>4.13
test
直接进行测试
```java
@RunWith(SpringJUnit4ClassRunner.class)//以junit方式启动
@ContextConfiguration(locations = "classpath:user.xml")//指定位置
public class TestJunit1 {
@Autowired//自动装配
private User user;
@Test
public void Test1(){
System.out.println(user);
}
}