Spring 框架详解

本文详细介绍了Spring框架,包括其轻量级特性和作为容器管理对象生命周期的优势。Spring提供了AOP支持、声明式事务管理,降低了Java EE API的使用难度,并能与其他框架无缝集成。主要学习内容为Spring Core和AOP,即IOC和AOP功能。文中还探讨了IOC的控制反转概念及其带来的好处,如降低模块间耦合度和提高代码重用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Spring框架的相关概念
轻量级:spring是一种轻量级框架,spring给用户提供的功能完全由用户自己决定,用户想用什么功能需要自己去选择并使用(spring是一种模块化的框架)但是一般的重量级的框架都是只要你用,就把所有的功能都给你,用户不能自己定制
容器:spring框架中的容器可以管理项目中各种对象的生命周期(对象的创建、初始化、使用、销毁),前提是项目中要使用spring框架,并且把这些需要管理的对象配置给spring的容器
二、spring框架给项目带来的好处
1)动态解藕,方便开发,面向接口设计
通过Spring提供的容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免因编码所造成的过度程序耦合
2)方便程序的测试
spring框架也提供了测试模块,可以和很多主流的测试框架相结合
3)降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个简单的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低
4)方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持
5)AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程
6)声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量
7)spring是一个模块化的项目,可以根据自己的需要定制功能模块
spring的核心宗旨:简化企业级应用开发,同时给复杂问题提供强大的、非侵入性解决方案
三、 Spring核心功能模块
1)Spring Core(spring的核心容器)
核心容器提供Spring框架的基本功能Spring以bean的方式组织和管理Java应用中的各个组件及其关系Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现BeanFactory使用控制反转(IOC)模式将应用的配置和依赖性规范与实际的应用程序代码分开BeanFactory使用依赖注入的方式提供给组件依赖
Spring Context(spring的上下文)
2)Spring上下文向Spring框架提供上下文信息Spring上下文包括各种信息和功能服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能
3)Spring Web
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文Web层中使用的web框架可以是Spring自己的MVC框架,或者是其他的Web框架,如Struts、Webwork等
4)Spring DAO
一般三层架构中的DAO,主要目的是将持久层相关问题与一般的的业务规则隔离开Spring中的DAO模块提供了一致的方式访问数据库,不管采用何种持久化技术,Spring都提供一致的编程模型
5)Spring ORM
Spring与所有的主要的ORM映射框架都集成的很好,包括Hibernate、MyBatis等Spring为所有的这些框架提供了类似于模板的辅助类,达成一致的编程风格
6)Spring AOP(面向切面编程)
Spring AOP模块将面向切面编程的功能集成到了 Spring框架中所以,可以很容易的让Spring框架管理的对象都能支持AOP功能
7)Spring MVC(Spring WebMVC)
MVC框架是一个全功能的构建Web应用程序的MVC实现通过策略接口,MVC框架变成为高度可配置的Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器
我们主要学习的是spring Core和spring AOP,也就是spring框架所提供的ioc和aop功能
四、Spring中的IOC
IOC:Inversion of Control 控制反转
1)spring核心容器也可以称为IOC容器,该容器主要负责管理各种对象的生命周期(对象的创建、初始化、销毁等)
2)IOC容器并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了各种对象的可靠的管理,极大地降低了开发的复杂性。
注意:控制反转指的是创建对象的权限被反转了,以前创建对象是由程序自己完成的,而现在是IOC在程序需要的时候创建对象并注入程序中,这就是控制权的反转。运行程序由主动创建变被动接受需要的对象的过程就是反转的过程。
五、为什么要反转控制-----用它有什么好处
先来看一下不使用反转控制的开发模式
传统
在这里插入图片描述
传统的应用开发就像这些齿轮,他们之间的耦合度很高,每一个模块都需要依赖于其他模块,想想其中如果某个模块出现了问题,是不整个系统就崩溃了,不能运行了;而且在开发的过程中整个系统的各个模块要一起开发,因为在开发B模块的时候可能需要A模块,如果想在之后添加新的功能需要改动的工作量可能会很大,这些都给开发带来了很大的不方便。
框架处理
在这里插入图片描述
而反转控制:各模块之间出现了第三者来协调他们之间的关系,也就是各模块不用直接接触了,你需要什么Ioc容器给你创建。此时一个模块出现问题了其他模块依旧是正常的,维护起来也很方便。这种方式降低了模块间的耦合度,同时比如说B模块如果在其他系统也是用,那就可以直接将B模块移接过去,这不提高代码的重用了吗。
DI:Dependency Injection 依赖注入
DI的概念的提出是用来代替IOC的,表示让调用类对某一接口实现类的依赖关系由容器注入,以移除调用类对某一接口实现类的依赖。(思考servlet和service层接口以及service层接口实现类这三者的关系)
依赖注入 这个名词显然比 控制反转 更直接明了,并且易于理解。
六、IOC的相关功能
1)set方式注入(必须依靠set方法)
可以注入的内容有:
基本类型(8中基本类型+字符串)的装配
对象类型的装配
集合的装配

public class HelloBean {
		private String name;
		private int age;
		public String sayHello(){
			return "hello "+name +",your age is" + age;
		}
		//省略set/get方法
	}
<bean id="helloBean" class="ioc.HelloBean">
	<property name="name">
		<value>tom</value>
	</property>
	<property name="age" value="20">
	</property>
</bean>
ApplicationContext ac = 
		new ClassPathXmlApplicationContext("set.xml");
		//获取容器的一个实例
		HelloBean hb = (HelloBean) ac.getBean("helloBean");
		System.out.println(hb.sayHello());

注意:id是Bean的唯一标识,要求在整个配置文件中要唯一,也可使用name属性,bean标签里面的id和name属性都可以用来标识这个配置的对象,但是id会帮我们检查给对象起的名字是否规范(名字不能重复、不能用数字开头、不能有空格等等),如果检查出来了那么就会报错name属性不会帮检查。
2)基于构造器注入
方式: 配置元素,在Bean中不用写set方法,但是要有相应的构造器,构造器注入有俩种形式 一个是根据参数类型 一个是根据参数位置的下标。
例如:

//根据参数类型注入
<bean name="student" class="com.briup.bean.Student">
	<constructor-arg type="int" value="25">
	</constructor-arg>
	<constructor-arg type="java.lang.String" value="tom">
	</constructor-arg>
	<constructor-arg type="long" value="100">
	</constructor-arg> 	 
</bean>
//根据参数下标注入
<bean name="student" class="com.briup.bean.Student">
<constructor-arg index="2">
	<value>30</value>
</constructor-arg>
<constructor-arg index="0">
	<value>200</value>
</constructor-arg>
<constructor-arg index="1">
	<value>lily</value>
</constructor-arg>
</bean>

3)自动注入
容器依照一些规则去装配bean中的一个属性
注意:自动装配只对[对象类型]起作用,对基本类型不起作用。
第一种情况:在beans标签中配置装载方式:default-autowire=“byName”
第二种情况:在bean标签中指定配置方式
autowire=“byName”:spring容器会到当前的类中找property的名字,然后再根据这个名字去spring容器中找有没有和这个property名字相同的对象,有的话,就把这个对象当做参数放到setXxxx这个方法里面注入进来.
autowire=“byType”:spring容器会根据当前类中的set方法里面参数的类型,去容器中找相匹配的对象,如果没找到就算了,如果找到一个就注入进来,如果找到多个,那么就会报错了.
autowire=“constructor” :根据构造器的参数类型去匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值