Spring框架介绍及使用(一)

2023-05-16

文章目录

    • 概念
    • 为什么要用?
    • Spring的体系结构
    • Spring框架之控制反转(IOC)
      • 概念
      • Spring文件包解释
      • 入门程序
        • 入门程序需要的jar包
        • 配置文件
        • 入门程序的建立
        • ApplicationContext与BeanFactory的区别
      • Bean的装配
        • 默认装配方式
        • 动态工厂的错误使用
        • 动态工厂的正确使用
          • 静态工厂
      • Bean的作用域
      • Bean后处理器
        • 概念
        • 使用方法
        • 示例代码
        • Bean后处理器增强类中方法的功能
        • 指定增强指定的方法
      • 定制Bean的生命周期始末
        • 实现方法
        • 示例代码
      • Bean的生命周期

概念

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一栈式) 轻量级开源框架。Spring的核心是控制反转(IOC) 以及 面向切面(AOC)

为什么要用?

  1. 解耦,简化开发(高内聚低耦合)
    Spring可以看作一个大工厂,统一管理和维护所有对象,属性,关系等。Spring的Bean由工厂生成。
  2. 事务处理的支持
    通过简单的配置就能实现事务管理,无需手动配置,方便程序扩展
  3. 方便测试
    Spring对Junit4的支持可以通过注解更方便的进行测试
  4. 可以集成其他优秀框架
    可以单用Spring进行开发,同时Spring也支持使用各种优秀框架。(Mybatis,Hibernate等)
  5. AOP编程
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

Spring的体系结构

Spring体系结构

Spring框架之控制反转(IOC)

概念

Spring中IOC可以解决主业务耦合的问题,程序中使用的核心对象,不需要像以前那样NEW(),Spring的容器给我们创建。

Spring文件包解释

enter description here
enter description here
enter description here
enter description here

入门程序

入门程序需要的jar包

  1. 四个核心包
  • beans.jar
  • core.jar
  • context.jar
  • springexpression .jar
  1. 3个依赖包
  • logging.jar
  • log4j.jar(不显示日志信息可以不加)
  • junit.jar
    入门程序jar包

配置文件

  • 位置:任意,一般存放在src
  • 名称:任意,一般使用applicationContext.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">
<!-- 
        <bean> 配置需要创建的对象
            id :用于之后从spring容器获得实例时使用的
            class :需要创建实例的全限定类名
    -->
    <bean id="..." class="..." />
</beans>

入门程序的建立

注意:为了方便截取代码,我的每个packge都放了一个对应的配置文件,所以在测试代码中,path路径为packge里的路径。如果放在src中,就不用写包的路径了。
SomeService.java:

public interface SomeService {
	void doSome();
}

SomeServiceImpl.java:

public class SomeServiceImpl implements SomeService {
	@Override
	public void doSome() {
		System.out.println("gogogogogogogogo");
	}
}

applicationContext.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">
    <!-- 默认方法 -->    
	<bean id="someService" class="com.woniuxy.spring01.SomeServiceImpl"/>
</beans>

SpringText.java:创建Bean默认方式

public void test01() {
		//底层使用的技术,dom4j解析XML,反射,工厂模式
		//对象的创建交给Spring容器,不需要new
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(path);
		SomeService someService=(SomeService) ac.getBean("someService");
		someService.doSome();	
	}

==SpringText.java:使用IO创建 ==

public void test02() {
		//注意这里是文件系统IO的路径规范
		String path="D:\\cdoe\\SpringText\\src\\com\\woniuxy\\spring01\\applicationContext.xml";
		ApplicationContext fc=new FileSystemXmlApplicationContext(path);
		SomeService someService = (SomeService) fc.getBean("someService");
		someService.doSome();
	}

==SpringText.java:使用已经废弃的Beanfactory创建Bean ==

public void test03() {
		//使用Beanfactory
		String path="com/woniuxy/spring01/applicationContext.xml";
		XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource(path));
		SomeService someService=(SomeService) bf.getBean("someService");
		someService.doSome();	
	}

ApplicationContext与BeanFactory的区别

  • ApplicationContext在容器初始化的时候,会将所有的bean对象创建。优点是::第一次请求响应速度块。缺点是:过多的销毁和占用系统资源
  • BeanFactory在调用getBean()方法,获取对象时才会创建,缺点是第一次会惩罚。

Bean的装配

默认装配方式

public void test01() {
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(path);
		SomeService someService=(SomeService) ac.getBean("someService");
		someService.doSome();	
	}

动态工厂的错误使用

创建工厂类:SomeServiceFactory.java

public class SomeServiceFactory {
	public SomeService getSomeService() {
		return new SomeServiceImpl();
	}
}

applicationContext.xml:

<bean id="someService" class="com.woniuxy.spring01.SomeServiceImpl"/>
<bean id="factory" class="com.woniuxy.spring01.SomeServiceFactory"/>

SpringText.java:

public void test04() {
		//动态工厂错误使用
		String path="com/woniuxy/spring01/applicationContext.xml";
		//获取容器
		ApplicationContext fc = new ClassPathXmlApplicationContext(path);
		//从容器中获得对象
		SomeServiceFactory someServiceFactory=(SomeServiceFactory) fc.getBean("factory");
		//调用方法
		someServiceFactory.getSomeService().doSome();
		//注意:这是一个错误用法,将工厂当成了一个普通Bean来使用,不但没有解耦,反而使结构更复杂
	}

动态工厂的正确使用

创建工厂类:SomeServiceFactory.java

public class SomeServiceFactory {
	public SomeService getSomeService() {
		return new SomeServiceImpl();
	}
}
applicationContext.xml:

```xml
<!-- 动态工厂 -->
	<bean id="someService" factory-bean="factory" factory-method="getSomeService"/>
	<bean id="factory" class="com.woniuxy.spring01.SomeServiceFactory"/>

SpringText.java:

public void test05() {
		//动态工厂正确使用
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext fc = new ClassPathXmlApplicationContext(path);
		SomeService service = (SomeService) fc.getBean("someService");
		service.doSome();
	}
静态工厂

创建工厂类:SomeServiceFactory.java

public class SomeServiceFactory {
	public staic SomeService getSomeService() {
		return new SomeServiceImpl();
	}
}
applicationContext.xml:

```xml
<!-- 静态工厂 -->
	<bean id="someService" class="com.woniuxy.spring01.SomeServiceFactory" factory-method="getSomeService"/>

SpringText.java:

public void test06() {
		//静态工厂
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext fc = new ClassPathXmlApplicationContext(path);
		SomeService service = (SomeService) fc.getBean("someService");
		service.doSome();
	}

Bean的作用域

applicationContext.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">

    <!-- scope="singleton":单例设计模式 -->
    <!-- scope="prototype":原型设计模式 -->
	<bean id="someService" class="com.woniuxy.spring01.SomeServiceImpl" scope="prototype"/>
</beans>

SpringText.java:

public void test01() {
		//测试原型模式下输出ture or false
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(path);
		SomeService someService1=(SomeService) ac.getBean("someService");
		SomeService someService2=(SomeService) ac.getBean("someService");
		System.out.println(someService1==someService2);	
	}

Bean后处理器

概念

  • AOP的底层实现和他有关
  • AOP就是增强:底层使用动态代理或者cglib
  • Bean后处理器是一个特殊的bean。

使用方法

自定义一个类,实现bean后处理器的接口–BeanPostProcessor,容器中配一个该类的一个bean,这个bean不需要id,容器中的bean对象在创建时都会自动执行bean后处理器中的两个方法。

示例代码

MyBeanPostProcessor.java类:

public class MyBeanPostProcessor implements BeanPostProcessor{
	//bean:当前容器初始化的bean对象
	//beanname:当前bean对象的name
	//增强当前对象,返回值就是当前对象增强之后的对象
	//如果只是做日志记录操作,不增强该对象的功能,不能返回NULL,直接返回原来的bean
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化之前执行");
		return bean;
	}
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化完毕执行");
		return bean;
	}
}

applicationContext.xml:

<bean id="someService" class="com.woniuxy.spring01.SomeServiceImpl" scope="singleton"/>
	<bean class="com.woniuxy.spring01.MyBeanPostProcessor"/>

SpringText.java:

public void test01() {
		String path="com/woniuxy/spring01/applicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(path);
		SomeService someService=(SomeService) ac.getBean("someService");
		someService.doSome();
	}

测试结果:
enter description here

Bean后处理器增强类中方法的功能

只需要对MyBeanPostProcessor.java类进行修改即可

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化之前执行");
		return Bean;
	}
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化完毕执行");
		Object stongBean = Proxy.newProxyInstance(bean.getClass().getClassLoader(), 
				bean.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						//相当于交叉业务--切面
						System.out.println("前置增强");
						Object obj = method.invoke(bean, args);
						System.out.println("后置增强");
						return obj;
					}
				});
		return stongBean;
	}
}

测试结果:
enter description here

指定增强指定的方法

public class MyBeanPostProcessor implements BeanPostProcessor{
	//bean:当前容器初始化的bean对象
	//beanname:当前bean对象的name
	//增强当前对象,返回值就是当前对象增强之后的对象
	//如果只是做日志记录操作,不增强该对象的功能,不能返回NULL,直接返回原来的bean
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化之前执行");
		return Bean;
	}
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("对象初始化完毕执行");
		Object stongBean = Proxy.newProxyInstance(bean.getClass().getClassLoader(), 
				bean.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						//判断增强的方法
						if(method.getName().equals("doSome")) {
							System.out.println("前置增强");
							Object obj = method.invoke(bean, args);
							System.out.println("后置增强");
							return obj;
						}else {
							Object obj = method.invoke(bean, args);
							return obj;
						}
					}
		return stongBean;
		});
	}
}

定制Bean的生命周期始末

实现方法

在实现类中定义初始化执行的方法,销毁执行的方法,绑定到配置文件中即可。

示例代码

SomeServiceImpl.java:

public class SomeServiceImpl implements SomeService {
	
	public void setUp(){
		System.out.println("初始化成功");
	}
	public void setDown(){
		System.out.println("即将销毁");
	}
	@Override
	public void doSome() {
		System.out.println("gogogogogogogogo");
	}
}

applicationContext.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">

	<bean id="someService" class="com.woniuxy.spring01.SomeServiceImpl"
		init-method="setUp"  destroy-method="setDown" />
	<bean class="com.woniuxy.spring01.MyBeanPostProcessor"/>
</beans>    

测试结果:
enter description here

Bean的生命周期

Spring框架中Bean的生命周期比较复杂,一共有11个阶段。

  1. 构造器
  2. 属性赋值(set)
  3. 实现BeanNameAware,知道配置文件中,ID值。
  4. 实现BeanFactoryAware,找到Bean的创建工厂
  5. Bean后处理器中Bean初始化执行之前方法—创建类,实现BeanPostProcessor接口。
  6. 实现InitializingBean,正在初始化Bean。
  7. Setup—初始化完毕
  8. Bean后处理器中Bean初始化完成之后方法—创建类,实现BeanPostProcessor接口。
  9. 执行主业务方法。
  10. 实现disposableBean接口,Bean销毁之前
  11. teardown—对象销毁之后
    enter description here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring框架介绍及使用(一) 的相关文章

随机推荐

  • java网络故障报修系统J2EE

    目 录 第一章 绪论 1 1 1 课题开发背景 1 1 2 课题研究意义 1 1 3 本课题主要工作 1 第二章 相关技术介绍 3 2 1 JSP技术 3 2 2 MySQL数据库 3 2 3 J2EE 技术 4 2 4 B S架构 5 第
  • linux脚本中的命令command not found的原因及解决方法

    场景描述 xff1a 一个生产的数据库备份脚本 xff0c 使用定时任务crontab配置自动执行bakup sh xff0c 报错信息是 expdp xff1a command not found 可是 xff0c 我在linux中 xf
  • ubuntu防火墙安装和设置-ufw

    ubuntu防火墙使用的是iptables 为了简化iptables设置 xff0c ubuntu提供了一个名为ufw的工具 本文主要介绍ufw使用方法 如果ufw没有安装 xff0c 那么可以使用如下命令安装 xff1a sudo apt
  • Win10/11+Ubuntu 双系统 修改grub默认启动选项 | 默认等待时间

    文章目录 进入Ubuntu xff0c 修改配置更新配置 本文环境为Win11 43 Ubuntu22 04 进入Ubuntu xff0c 修改配置 span class token function sudo span span clas
  • 2022-08-14 SSH 相关命令详解

    SSH 相关命令详解 sshssh keygenssh copy idssh agent 和 ssh addssh keyscansshd ssh ssh OpenSSH 远端登陆客户端 xff0c 默认22端口 描述 xff1a span
  • 浅谈Centos用户权限管理

    一 用户与组的概念 1 xff0e 理解linux多用户 xff0c 多任务的特性 Linux是一个真实的 完整的多用户多任务操作系统 xff0c 多用户多任务就是可以在系统上建立多个用户 xff0c 而多个用户可以在同一时间内登录同一个系
  • Linux centos升级nodejs,解决升级NodeJS遇到的问题,升级GLIBC、GLIBCXX、gcc(含资源包下载)

    公司网站用的Nuxt开发的 xff0c 本地开发环境NodeJS已经升级到16 14 2版本 xff0c 服务器也要从12版本升级到16 14 2 如需本次安装的资源 xff0c 请下滑到文章下面下载整套资源 NodeJS版本下载地址 xf
  • 关于UEFI引导的理解

    UEFI 和 Legacy区别 UEFT和Legacy是引导模式 xff0c 是用来引导系统的 按下开机键到看到windows标识 Legacy 传统BIOS模式 xff0c 启动顺序 xff1a 开机 gt BIOS初始化 gt BIOS
  • IDEA license server 地址

    旧地址 xff1a http jetbrains license server 新地址 xff1a http fls jetbrains agent com
  • 线性探测再散列

    哈希表又称散列表 哈希表存储的基本思想是 xff1a 以数据表中的每个记录的关键字 k为自变量 xff0c 通过一种函数H k 计算出函数值 把这个值解释为一块连续存储空间 xff08 即数组空间 xff09 的单元地址 xff08 即下标
  • 特征选择的几种方法

    目录 1 过滤法 xff08 Filter xff09 1 1 方差选择法 1 2 相关系数法 1 3 卡方检验 1 4 互信息法 1 5 relief算法 2 包裹法 xff08 Wrapper xff09 2 1 递归特征消除法 2 2
  • Excel调用有道词典实现批量翻译

    如图所示 xff0c 我们在B2单元格中写入公式 xff1a 61 FILTERXML WEBSERVICE 34 http fanyi youdao com translate amp i 61 34 amp A2 amp 34 amp
  • Python的使用技巧:any all的短路

    注意迭代类型和list的结果是不一样的 xff1a if name 61 61 39 main 39 a 61 1 2 3 if any print i is None for i in a print 6666666666 1 2 3 6
  • curl升级到7.87(centos7和TencentOS2.4 tk)

    centos7升级curl到7 8 7 按照之前写过的一篇文章 大致按描述操作即可 只不过需要做一点点修正 CentOS 7升级curl 乐大师的博客 CSDN博客 centos7 curl升级 更新操作中会报错安装失败 提示如下 nbsp
  • Python中raise…from用法

    本来这几天是计划阅读string模块的源码 xff0c 恰好其中一段异常处理的代码我觉得很新奇 xff0c 也就是raise from的用法 xff0c raise的用法大家都知道 因为我之前没遇到过 xff0c 所以就去网上查了相关的资料
  • AI模型隐私风险及防护技术

    一 背景 随着AI成为新一代关键技术趋势 xff0c 围绕着AI的服务也越来越普及 特别是结合了云计算以后 xff0c 机器学习数据的标注 模型训练及预测等服务纷纷上云 xff0c 为用户提供了强大的算力和优秀的算法 xff0c 极大方便了
  • 汉诺塔的图解递归算法

    一 xff0e 起源 xff1a 汉诺塔 xff08 又称河内塔 xff09 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆
  • 推荐系统中的矩阵分解总结

    最近学习矩阵分解 xff0c 但是学了好多种类 xff0c 都乱了 xff0c 看了这篇文章 xff0c 系统性的总结了矩阵分解 xff0c 感觉很棒 xff0c 故分享如下 前言 推荐系统中最为主流与经典的技术之一是协同过滤技术 xff0
  • 几种常见的离群点检验方法

    在一组平行测定中 xff0c 若有个别数据与平均值差别较大 xff0c 则把此数据视为可疑值 xff0c 也称离群值 如果统计学上认为应该舍弃的数据留用了 xff0c 势必会影响其平均值的可靠性 相反 xff0c 本应该留用的数 据被舍弃
  • Spring框架介绍及使用(一)

    文章目录 概念为什么要用 xff1f Spring的体系结构Spring框架之控制反转 xff08 IOC xff09 概念Spring文件包解释入门程序入门程序需要的jar包配置文件入门程序的建立ApplicationContext与Be