Spring框架从入门到入土(一):初识Spring框架
核心技术:ioc、aop
依赖:classa中使用的classb的属性或者方法,叫做classa依赖classb
核心功能ioc(Incersion of Control)
控制反转,是一个理论,概念,思想。
描述的:把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是对象的创建是有其他外部资源完成。
-
控制:创建对象,对象的赋值属性,对象之间的关系管理。
-
反转:把原来的开发人员管理,创建对象的权限交给代码之外的容器实现。由容器代替开发人员管理对象。创建对象,给属性赋值。
-
正转:由开发人员在代码中,使用new构造方法创造对象,开发人员主动管理对象。
public static void main(String[] args) { Student student = new Student(); }
-
容器:是一个服务软件,一个框架。
为什么要使用ioc?
目的是为了减少对代码的改动,也能实现不同的功能。实现解耦合!
java中创建对象的方式
- 构造方法,new 对象()
- 反射
- 序列化
- 克隆
- ioc:容器创建对象
ioc的一个体现:servlet
- 创建类继承HttpServlet
- 在web.xml注册servlet
- 没有创建servlet对象
- Servlet是Tomcat这个容器创建的。
IOC的技术实现:
DI是ioc的技术实现,DI(Dependency Injection):依赖注入,只需要在程序中提供要使用的对象的名称就可以了,对象在容器中如何创建,赋值,查找都是用容器内部来实现的。
spring是使用di实现了ioc的功能,spring底层创建对象,使用的是反射机制。
spring也是一个容器,可以管理对象,给对象赋值,底层是反射创建对象。
第一个例子
- 创建一个自定义对象
实现步骤:
- 创建maven项目。
- 加入maven依赖。
<!--spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 创建类(接口和实现类)和没有使用框架一样,就是普通的类。
package com.liang.service;
/**接口
* @author liar
* @date 编写时间: 2022/3/22 15:12
*/
public interface SomeService {
/**
* 这是一个测试方法
*/
void doSome();
}
package com.liang.service.service.impl;
import com.liang.service.SomeService;
/**
实现类
* @author liar
* @date 编写时间: 2022/3/22 15:14
*/
public class SomeServiceImpl implements SomeService {
@Override
public void doSome() {
System.out.println("执行了someserviceimpl的dosome方法");
}
}
- 创建spring需要使用的配置文件,声明类的信息,这些类由spring创建和管理。
<?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创建对象
声明bean,就是告诉spring要创建某个类的对象
id:对象的自定义名称,唯一值。spring通过这个名称找到对象
class:类的全限定名称(不能是接口,因为spring是反射机制创建对象,必须使用类,不能使用接口)
spring就完成SomeService someservice = new SomeServive();
spring就是把创建好的对象放入到map中,spring框架中有一个map存放对象的。
springMap.put(id的值,对象)
一个bean声明一个java对象
-->
<bean id="SomeService" class="com.liang.service.impl.SomeServiceImpl"/>
</beans>
<!--
spring的配置文件
1. beans:是根标签,spring把java对象称为bean。
2. spring-beans.xsd:是约束文件,和mybatis指定的dtd一样。
-->
- 测试spring的创建。
//spring默认创建对象的时间:在创建spring容器的时候,会创建配置文件中的所有对象。
@Test
public void test02(){
//使用spring容器
//1. 指定spring配置文件名称
String config = "beans.xml";
//2. 创建表示spring容器的对象,ApplicationContext
//ApplicationContext就是表示spring容器,通过容器获取对象
//ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器中获取某个对象,调用对象的方法
SomeService service = (SomeService)ac.getBean("SomeService");
//使用创建好的对象
service.doSome();
}
- 测试结果
- 创建一个非自定义对象
- 编写xml文件
<!--spring能创建一个非自定义的对象吗,创建一个存在的某个类对象-->
<bean id="mydate" class="java.util.Date"/>
- 测试方法
/**
*创建非自定义对象
*spring创建对象,默认调用无参构造
*/
@Test
public void test04(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器中获取某个对象,调用对象的方法
Date date = (Date)ac.getBean("mydate");
//使用创建好的对象
System.out.println(date);
}
- 测试结果