1、Spring简介
Spring -> 春天
1.1 什么是Spring
Spring框架是一个开源的J2EE应用程序框架,是对Bean的生命周期进行管理的轻量级容器。它的主要作用是将其他框架进行整合,以一种统一的通用的方法进行管理。
1.2 什么是Bean
被Spring容器管理的对象称之为Bean。
1.3 Spring理念
使现有的技术更加容易使用,解决企业应用开发的复杂性,整合了现有的技术框架。
1.4 Spring官网地址
1.5 Spring优点
- Spring是一个开源免费的框架
- Spring是一个轻量级的、非侵入式的框架
- 控制反转(IOC),依赖注入(DI),面向切面编程(AOP)
- 支持事务的处理,因为AOP的原因对事务的支持特别优秀
- 对框架整合的支持
1.6 Spring与其它框架的整合
- SSH : Struct2 + Spring + Hibernate(全自动的持久层框架)
- SSM :SpringMvc(视图框架) + Spring + MyBatis(半自动的持久层框架,可定制性更高,Sql更加灵活)
1.7 Spring核心技术
- IOC/DI
- AOP
2、Spring核心技术之IOC
2.1 什么是IOC
控制反转(Inversion of Control,缩写为IoC)它是Spring框架的核心内容,通常我们创建和管理装配对象的主动权是在我们程序猿自己的手里。通过控制反转,我们不再有创建管理装配对象的主动性,而是变为被动的接收这种控制权的转换,我们称为控制反转,它是一种设计思想。DI(Dependency Injection 依赖注入)是实现IOC的一种方式,或者说我们是通过依赖注入的方式去实现我们的控制反转。
概念: 将对象创建的权利交给Spring容器管理,由Spring容器控制对象的生命周期(创建/初始化/使用/销毁)。
作用:降低了代码之间的耦合性。
2.2 Spring入门案例
创建项目
- 在IdeaProjets中创建一个空文件夹 jsd2103projects
- 通过IDEA打开这个文件夹
- 打开后目录结构如下
- 创建模块module --> spring_1_demo_ioc
2.2.1 通过maven项目中的pom.xml的方式引入jar包
<!-- 引入spring-context包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
2.2.2 创建pojo类
- 在项目中创建pojo包,在保重创建User类,项目中目录结构如下
public class User {
public void say(){
System.out.println("您好,Spring框架");
}
}
2.2.3 在resources下创建application.xml配置文件
Spring中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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Spring容器管理对象
id: Spring容器中对象的唯一标识符 不能重复 一般类名首字母小写
class:类的全路径名 包名.类名 -->
<bean id="user" class="com.jt.pojo.User"></bean>
</beans>
2.2.4 测试是否能获取创建好的User对象
通过maven项目中的pom.xml的方式引入jar包
<!--引入测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
创建测试类并测试
public class TestUser {
//测试方法返回值必须为void, 方法名不能是类名
@Test
public void testSpring01(){
//1. 通过加载配置文件,创建Spring容器对象 容器创建则对象创建
ApplicationContext context =
new ClassPathXmlApplicationContext("application.xml");
//2. 从容器中获取对象
// 1)通过bean的id获取对象
User user = (User) context.getBean("user");
// 2)通过bean的class获取对象
User user1 = context.getBean(User.class);
// 3)通过bean的id和class获取对象
User user2 = context.getBean("user", User.class);
// 测试是否是统一个对象
System.out.println(user == user1);
System.out.println(user == user2);
System.out.println(user1 == user2);
//3. 执行方法
user.say();
}
}
3、 Spring创建对象的方式
3.1 反射机制
我们可以通过反射机制去创建对象,但是反射机制创建对象需要用到无参的构造方法,一下是测试案例:
测试:
在User类中添加一个无参构造
public class User {
/*
* 反射机制调用时,必然调用对象的无参构造,所以写构造方法时必须先写无参构造方法
* 如果类中没有无参构造,会报错
*/
public User(){
System.out.println("我是一个无参构造");
}
// public User(int i){
// System.out.println("我是一个有参构造");
// }
public void say(){
System.out.println("您好,Spring框架");
}
}
在测试类中添加一个测试方法
当我们在User类中自己手动添加一个有参的构造方法时,类中的无参构造就被自动覆盖掉,我们执行以下测试方法时就会报错;
错误信息如下:
当我们手动添加一个无参的构造方法时,并在构造方法中添加一条输出语句,当我们执行以下的测试方法时,会正常执行并将输出语句打印到控制台上。
由此可以说明:我们在通过反射机制创建对象时,要创建的对象所属的类必须含有无参的构造方法。
@Test
public void demo() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
/*
* IOC
* 实际我们Spring框架的底层就是通过反射机制获取类对象,并实例化对象,
* 然后帮助我们将对象存储在Spring容器中,这里我们是通过Map<K,V>集合存储的
* bean中的id当做map中的key,实例化好的对象当做Value
* 然后我们想从容器中获取对象,就从Map集合中通过id(key)获取对象(value)即可
*/
//1. 通过类的路径实例化类型...
Class userClass = Class.forName("com.jt.pojo.User");
//2. 实例化对象
User user = (User) userClass.newInstance();
user.say();
}
3.2 静态工厂模式
3.2.1 编辑静态工厂类
public class StaticFactory {
/*
* 通过静态工厂获取数据
* Calendar是util包下的工具类 -- 日历类,它是一个抽象类;
* 因为抽象类我们不能直接实例化,所以我们不能通过反射的机制去创建他的对象
* 我们只能通过Calendar中提供的getInstance()的静态方法来获取他的对象
*/
public static Calendar getCalendar(){
return Calendar.getInstance();
}
}
3.2.2 编辑静态工厂配置文件
<!-- 1.静态工厂实例化对象的写法 方法必须是static -->
<bean id="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>
3.2.3 测试类
/**
* 静态工厂模式测试类
*/
@Test
public void testStatic(){
ApplicationContext context =
new ClassPathXmlApplicationContext("application.xml");
Calendar calendar1 = (Calendar) context.getBean("calendar1");
System.out.println("获取当前时间:"+calendar1.getTime());
}
3.2 实例工厂模式
...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。