当前位置: 首页 > news >正文

Spring基础知识

1 简介

官网:https://spring.io/projects,Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。

Spring Framework是最底层的框架,是其他项目的根基。

Spring Boot

Spring MVC

Spring Cloud

Spring Framework系统架构图:

Core Container:核心容器,用来管理对象(Beans)

AOP:面向切面编程,依赖于Core Container实现。Aspects实现了AOP思想。

Data Access:数据访问

Data Integration:数据集成,支持JDBC、MyBatis

Web:Web开发

Test:单元测试

2 IOC/DI

2.1 核心概念

使用对象时,由主动new对象转换为由外部提供对象,对象的创建控制权由程序内部转移到外部,这种思想就是控制反转IOC(Inversion of Control),可以降低代码耦合度,这里说的外部就是Spring容器,由Spring容器创建控制对象,Spring容器创建、管理的对象统称为bean。在IOC容器内将有依赖关系的bean进行关系绑定(DI)。

2.2 IOC入门

  1. 导入spring-context坐标

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version>
</dependency>
  1. 定义spring管理的类(接口)

  1. 创建applicationContext.xml 并配置对应类作为spring管理的bean

<?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"><bean class="dao.impl.BookDaoImpl" id="bookDao"/><bean id="bookService" class="service.impl.BookServiceImpl"/>
</beans>
  1. 初始化IOC容器,通过容器获取bean

    public static void main(String[] args) {//获取IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象//BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");BookService bookService = (BookService) applicationContext.getBean("bookService");}

2.3 DI入门

  1. 删除使用new方式创建对象的代码

  1. 提供依赖对象对应的setter方法供IOC容器设置值

public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {System.out.println("book service save");bookDao.save();}
}public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save");}
}
  1. 在配置文件中配置service和dao的依赖关系

<?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"><bean class="dao.impl.BookDaoImpl" id="bookDao"/><bean id="bookService" class="service.impl.BookServiceImpl"><!-- property标签表示配置当前bean的属性name表示配置哪一个具体的属性ref表示参照哪一个bean--><property name="bookDao" ref="bookDao"/></bean>
</beans>

2.3 bean基础配置

2.3.1 id和class

2.3.2 name别名配置

Bean可以起多个名称,通过name属性,可配置多个别名。

2.3.3 scope作用范围

控制容器造的对象是单例还是非单例的。Spring默认创建的bean是单例的,通过scope属性控制bean是单例方式创建还是非单例方式创建。

2.4 bean实例化方式

2.4.1 无参构造方法实例化

使用无参构造方法实例化bean(最常用)

2.4.2 静态工厂实例化bean

public class OrderDaoFactory {public static OrderDao getOrderDao() {return new OrderDaoImpl();}
}public class OrderDaoImpl implements OrderDao {@Overridepublic void save() {System.out.println("OrderDaoImpl save");}
}
<bean id="orderDao" class="factory.OrderDaoFactory" factory-method="getOrderDao"/>

了解即可。

2.4.3 实例工厂与factory-bean

public class UserDaoFactory {public UserDao getUserDao() {return new UserDao();}
}public class UserDao {public void save() {System.out.println("UserDao save");}
}
<bean id="userFactory" class="factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>

了解即可。

2.4.4 FactoryBean实例化bean

public class UserDaoFactoryBean implements FactoryBean<UserDao> {/*** 创建对象的方法,用来得到bean实例* @return* @throws Exception*/@Overridepublic UserDao getObject() throws Exception {return new UserDao();}/*** 用来得到bean类型* @return*/@Overridepublic Class<?> getObjectType() {return UserDao.class;}/*** 控制创建的是否是单例对象,不复写的话默认是单例* @return*/@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}public class UserDao {public void save() {System.out.println("UserDao save");}
}

applicationContext.xml中配置:

<bean id="userDao" class="factory.UserDaoFactoryBean"/>

调用:

       //获取IOC容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象UserDao userDao = (UserDao) applicationContext.getBean("userDao");userDao.save();

重点掌握

2.5 bean的生命周期

2.5.1 init-method、destroy-method

public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao is running");}//对象创建后的初始化操作public void init() {System.out.println("init");}@Overridepublic void save() {System.out.println("book dao save");}//容器关闭前实例销毁操作public void destroy() {System.out.println("destroy");}
}
<bean class="dao.impl.BookDaoImpl" id="bookDao" init-method="init" destroy-method="destroy"/>

调用:

 //获取IOC容器ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//获取Bean对象BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");applicationContext.registerShutdownHook();//注册关闭钩子bookDao.save();applicationContext.close();

2.5.2 InitializingBean、DisposableBean

public class BookServiceImpl implements BookService , InitializingBean, DisposableBean {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {System.out.println("book service save");bookDao.save();}@Overridepublic void destroy() throws Exception {}//setter方法先被调用,afterPropertiesSet后被调用。constructor->setter->afterPropertiesSet->业务方法->destroy@Overridepublic void afterPropertiesSet() throws Exception {}

了解即可。

http://www.lryc.cn/news/4457.html

相关文章:

  • proxy代理与reflect反射
  • 机器视觉 多模态学习11篇经典论文代码以及解读
  • Redis过期删除策略
  • 数据流分析之def-use链分析
  • 【0175】【内存上下文】如何利用context_freelists[]来彻底释放MemoryContext中分配的所有内存(8 - 2)
  • Redis实战—黑马点评(一) 登录篇
  • 建造者模式-搭建Qt窗口案例
  • *from . import _imaging as core : ImportError: DLL load failed: 找不到指定的模块
  • 关于尚硅谷Hadoop-报错解决方案日志
  • 前端高频面试题-HTML和CSS篇(二)
  • 神经网络损失函数分布可视化神器
  • ansible的部署与命令模块
  • 开发人员与测试人员关系的理解
  • 直面原理:5 张图彻底了解 Android TextToSpeech 机制
  • Ruby Socket 编程
  • Vue3+ElementPlus+koa2实现本地图片的上传
  • 常见漏洞之 Fastjson
  • 绕过Nginx Host限制
  • Visual Studio 2022 常用快捷键,记录一下别忘记~
  • 软件测试回顾---重点知识
  • 2D图像处理:2D Shape_Base_Matching_缩放_旋转_ICP_显示ROI
  • HTTP、HTTPS
  • 计算机网络之http03:HTTPS RSA握手解析
  • 一款针对EF Core轻量级分表分库、读写分离的开源项目
  • Linux环境变量讲解
  • iptables和nftables的使用
  • 中小学信息学相关编程比赛清单及报名网站汇总(C++类)
  • 06Makefile
  • 【C++】模板初阶
  • vue+nodejs考研资料分享系统vscode - Visual Studio Code