【Spring 框架(自学)】Day01--2022/3/20
Spring概述
- Spring是一个轻量级的开源的Java EE框架
- Spring可以解决企业应用发的复杂性
- Spring有两个核心部分:IOC、Aop
IOC:控制反转,把对象的创建、赋值、管理工作交给代码之外的容器实现,
对象的创建由其它外部资源完成
Aoc:面向切面,不修改源代码的情况加进行功能的增强或添加
- Spring的特点
1、方便解耦,简化开发
2、Aop编程支持
3、方便程序的测试
4、方便继承各种优秀的框架
5、方便进行事务操作
6、降低API开发
Spring的第一个核心:IOC
综上所述,IOC是控制反转,有两层意思:
控制:创建对象,对象的属性赋值,对象之间的关系管理
反转:把原来的开发人员的管理,创建对象的权限交给代码以外的容器负责,由容器代替开 发人员创建、管理并给对象赋值
正转:由开发人员去创建对象,并对其进行管理与赋值
//例如:
public static void main(String[] args){
OOP oop = new OOP();
}
为什么使用IOC:其目的是减少对代码的改动,也能实现不同的功能,并实现解耦合
Java中创建对象的方式:
- 构造方法,new OOP()
- 反射
- 序列化
- 克隆
- IOC:容器创建对象
- 动态代理
其中,除IOC外,其它方法都需要手写创建对象的代码
IOC的体现:
之前学习servlet的过程中,Tomcat服务器会自动为你创建Servlet的对象,从而方便操作,而Tomcat也是作为一个容器,里面存放的有Servlet对象、Filter、Listener
IOC的技术实现
DI(Dependency Injection 依赖注入)是IOC的技术实现:只需要提供对象的名称即可,至于对象的创建、赋值、查找则都交给容器来完成,而Spring底层创建的对象,则对运用的是反射机制
第一个入门程序
1.创建一个实体类和实体类接口
//实体类接口
public interface UserMapper{
void test();
}
//实体类
public class UserMapperImpl implements UserMapper{
@Override
public void test(){
sout("用户测试方法")
}
public UserMapperImpl(){
sout("执行无参构造方法")
}
}
2.创建Spring配置文件(spring_config.xml)
<!--
头文件
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--
告诉spring并创建对象
声明bean,创建一个对象
id:自定义对象名称,也是其唯一值 spring通过id来找到对象
class:类的全限定名称,不能是接口 因为spring是反射机制,必须使用类
到了这一步,Spring就完成了以下操作:
UserMapper userMapper = new UserMapperImpl();
-->
<bean id="userTest" class="路径.路径.类文件"></bean>
<!--
Spring是如何将其保存的呢?
Spring把创建好的对象存入map当中,并进行赋值操作
如:map.put(id的值,对象)
map.put("userMapper",new UserMapperImpl());
-->
</beans>
3.Junit测试
public class UserDaoTest(){
//使用Spring创建对象
@Test
public void userTest(){
//指定Spring配置文件的名称:读取配置文件
String config = "spring_config.xml";
//创建表示Spring容器的对象,ApplicationContext
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config);
/*
Application表示Spring的容器
ClassPathXmlApplicationContext则表示从类路径中加载配Spring的置文件
*/
//从容器中获取某个对象,就要使用调用对象的方法:getBean("配置文件中id的值")
UserMapper userMapper = (UserMapper) applicationContext.getBean("userTest")
//转换成所需要的类型然后使用
//以上便完成了使用Spring的容器创建对象的操作,借下来直接调用即可
userMapper.test();
}
}
需要注意的是:当Spring创建好容器是,会默认创建配置中的所有对象
且对象创建时间为:从类路径中加载Spring的配置文件时
<!--头文件-->
<bean id="自定义名称" class="路径.路径.类文件"></bean>
<bean id="自定义名称1" class="路径.路径.类文件"></bean>
public class UserDaoTest(){
@Test
public void userTest(){
String config = "spring_config";
ApplicationContext applicationContext = ClassPathXmlApplicationContext(config);
//以上为创建对象的时间
//UserMapper userMapper = (UserMapper) applicationContext.getBean("配置文件中的id")
//userMapper.test();
}
}
获取Spring容器中Java的对象信息
public class UserDaoTest(){
@Test
public void springTest(){
String config = "spring_config.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config)
//使用Spring提供的方法,获取容器中对象的数量
int num = applicationContext.getBeanDefinitionCount();
sout("容器中所含对象的数量为:"+num)
//获取容器对象中的名字
String name[] = applicationContext.getBeanDefinitionNames();
for (String s : name) {
System.out.println(s);
}
}
}
Spring创建一个非自定义类的对象
<!--Spring中可以创建:自定义类的对象、非自定义类的对象-->
<!--头文件-->
<bean id="myDate" class="java.util.Date"></bean>
public class UserDaoTest(){
@Test
public void dateTest(){
String config = "spring_config.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(config)
Date date = (Date) applicationContext.getBean("myDate");
//注意:此处并没有调用任何方法,所以默认调用的是无参构造
sout(date);
}
}
综上所述:
当Spring创建好容器是,会默认创建配置中的所有对象,其创建对象时,默认调用的是无参构造
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?