spring 知识点

本文深入探讨Spring框架,包括其四层体系结构:表示层、业务逻辑层、持久化层和数据层。核心内容涵盖Spring入门、IOC/DI、AOP以及集成其他框架。Spring作为轻量级、非侵入式框架,提供了控制反转和面向切面编程,降低了组件间的耦合。此外,文章介绍了Spring Bean的生命周期、配置方式、依赖注入以及作用域。Spring的自动装配特性简化了Bean的装配过程。文中还讨论了AOP的基础,解释了为何需要AOP以及其带来的好处,包括日志和验证等应用场景。最后,文章提到了Spring对JDBC和事务管理的支持,强调了事务的ACID属性和传播行为,以及事务隔离级别在并发事务中的重要性。
摘要由CSDN通过智能技术生成

四层体系结构
表示层:提供用户界面的显示和与用户所进行的交互
业务逻辑层:进行软件核心业务的逻辑处理
持久化层:用户进行对象的持久化操作
数据层:用户保存持久化数据

Structs:用于表示层,主要负责前台
Hibernate、mybatis:用于持久化层,实现数据的持久
Spring:是个大型的容器,用来管理协调各层之间的调用

1.Spring主要内容
Spring入门
IOC/DI详解(控制反转(Inversion of Control,IoC)与依赖注入(Dependency Injection))
AOP(Aspect Oriented Programming:面向切面编程)入门及应用
Spring DAO
S2SH集成详解
与其它框架及技术的支持

2.什么是Spring?
(1)它是一个开源的框架,它的源代码写得非常优雅,如果大家有时间去看看、搞搞它的源代码、它的业务逻辑的编写,对大家的水平的提高大有裨益的。
(2)为简化企业级开发而生,Spring提供了对开源社区中很多框架及JavaEE中很多技术的支持,让程序员能很轻松的整合及使用这些框架技术
(3)Spring是一个IOC(DI)和AOP容器框架,这两个也是Spring的核心部分。

3.Spring的具体描述:与项目类型无关(C/S B/S)、招聘量、Spring的官网
(1)轻量级:并不是它的代码量少,而是Spring是非侵入性的。
基于Spring开发的应用中对象可以不依赖于Spring的API。
即:在使用Spring时,我们并不需要去实现或继承Spring的任何接口或父类,
就可以享用Spring给我们提供的任何功能。润物细无声的意思。
(2)控制反转(Inversion of Control,IoC)与依赖注入(Dependency Injection)
(3)AOP(Aspect Oriented Programming:面向切面编程)
(4)容器:Spring是一个容器,因为它包含并管理应用对象的生命周期
(5)一站式的框架:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库,如整合struts2、mybatis、hibernate等
Spring还实现了使用简单的xml配置或Java注解组合成一个复杂的应用,所以说它是一个框架。

4.第一个Hello world
(1)必须的包:
spring-beans、spring-context、spring-core、spring-expression、commons-logging

(2)bean.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">

		<!-- id:用来标识这个对象  class:类的全路径,到时候由spring来帮我们实例化这个对象 -->
		<bean id="usersBiz" class="com.yc.biz.impl.UsersBizImpl">
			<!-- 
				property:属性    指定class类下的msg属性的注入值"你好"
				记住:必须对此属性提供setter方法,且格式必须为setMsg()
			-->
			<property name="msg" value="你好"></property>
		</bean>
	</beans>

(3)java类
	public interface UsersBiz {
		public void login(String uname,String pwd);
	}
	
	public class UsersBizImpl implements UsersBiz {
		private String msg;
		
		@Override
		public void login(String uname, String pwd) {
			System.out.println("注入的信息为:"+msg);
			System.out.println(msg+":"+uname);
		}
		
		public void setMsg(String msg) {
			this.msg = msg;
		}
	}


	public static void main(String[] args) {
		/*
		此时这里的实例化对象和注值,我们可以由spring来完成
		UsersBizImpl usersBiz=new UsersBizImpl();
		usersBiz.setMsg("您好");
		 */

		/*
		 另外,在实际应用中,容器一般使用ApplicationContext,ApplicationContext是高级别的BeanFactory,
		 使用ApplicationContext,实例化Spring容器常用的两种方式:
		 方法一:
			在类路径下寻找配置文件来实例化容器
			ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});可以在整个类路径中寻找xml文件
			通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下
			classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。

		方法二:
			在文件系统路径下寻找配置文件来实例化容器 (不推荐使用)
			ApplicationContext ctx = new FileSystemXmlApplicationContext("d:\\beans.xml");
			Spring的配置文件可以指定多个,可以通过String数组传入。

		当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命周期,
		所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。
		 */

		//1.创建Spring的IOC容器对象  ApplicationContext:IOC容器的接口,它还提供了国际化支持、 资源访问、事件传播
		//ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"bean.xml"});
		ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

		//2.从IOC容器中获取bean的实例     根据配置文件中bean的id来获取
		UsersBiz usersBiz=(UsersBiz) context.getBean("usersBiz"); 

		//3.调用对应的方法
		usersBiz.login("navy","a");


		Resource res=new ClassPathResource("bean.xml");
		BeanFactory factory=new XmlBeanFactory(res);
		UsersBiz ub=(UsersBiz)factory.getBean("usersBiz");
		ub.login("navy", "a");
	}

6.IOC模拟案例(spring4.1_2)

7.spring案例1(spring4.1_3 打印机)

至少在我看来,在项目中引入spring立即可以带来下面的好处
降低组件之间的耦合度,实现软件各层之间的解耦。
可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,
开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
容器提供单例模式支持,开发人员不再需要自己编写实现代码。
容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

8.IoC控制反转(Inversion of Control)与DI依赖注入(Dependency Injection)的详细讲解
(1)容器
a.什么是容器?
英文container,汉语中解释是指用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料。
在软件领域,容器是指一个可以容纳其他元件的部件。对于企业级应用软件来说,容器是指贮存并管理各种对象及对象的生命周期、组件以及组件间的关系的部件。

	b.容器的性质
		(a)容器的普遍性及广泛性
			容器是普遍存在于我们的日常生活中的,一个漱口杯,一个垃圾袋,一套房间,一幢大楼,都可以算是容器。
			软件领域也同样,一个对象、一个集合、一个Web服务器、一个操作系统、以及一套由多种操作系统、应用软件组成的大型系统,很多都扮演着容器的角色。
			因此,容器具有普遍性及广泛性。
		
		(b)容器的大小
			容器的大小取决于看待事物的角度及出发点。在实际生活中,容器可大可小,小的比如一个装水的瓶子,大的比如一个城市,乃至整个宇宙。
			容器可以贮存其它的东西,容器本身又贮存于更大或者更上层的容器中。同样的道理,软件中的容器也一样,小的如一个存放对象的集合Collection或Map,
			大的如一套群集服务器,都可以称为容器。
		
		(c)容器的规范性
			大多数的容器都具有一定的规范性。包括一些传统的意识及习惯上的规范,也包括一些行业标准、国标以及ISO标准等明文规范的标准及规范。比如Web容器,EJB容器等。
		
		(d)容器功能的多样性
   		传统的容器基本上就是用于包装或装载物品,充当贮存器的功能以外,没有太复杂的东西。对于21世纪的今天来说,容器的已经不仅仅具有贮存功能。
			在软件中,容器除了存放部件,容器还要管理部件的生命周期,管理容器中的元件的创建、组合、存取等。

(2)Java中的容器
	Java已经不再指一个开发语言,而是一个开发体系,Java技术是微软体系以外的一个阵营。Java的容器也是根据看问题角度的不同,按不同的标准,
	可以分成很多类别,如轻量级与重量级、对象容器与组件容器等。从Java软件系统的本质来看,Java虚拟机本身就是一个很大的容器,
	然后是运行在虚拟上的各种Java应用服务器,比如Applet容器、EJB容器、Web容器,然后是管理对象及生命周期的一些框架,
	如PicoContainer、HiveMind、Spring等,还有JDK中内置的一些集合也属于对象容器,如Collection、Set、Map等。
	最后就是开发人员根据实际软件项目中的需要,自己所设计、制造的容器。

当然,由于所从事的技术专业的不同,对容器的研究重点也不同。我们这门课程主要讲的是企业级应用软件中的容器,
因此研究的重点也放在了处于底层JDK对象容器与大型J2EE应用软件容器中间的对象及组件容器。
我们关于容器的话题,重点是分析在Java软件开发历程中,各个时期的容器是怎样创建对象、贮存对象、管理对象及组件的生命周期、
管理对象及组件间的关系,为对象及组件提供一些附加的对象及组件管理功能等。

(3)容器发展分析
	a.原始容器时代(无容器时代)
		(a)主要使用数组及集合等作容器
		(b)谁负责管理组件及对象关系:"程序员+JVM本身"
		(c)是程序员以及JVM一起我们管理对象的生命周期、对象之间的关系等,
			必要时会借助JDK提供的一些对象集合类来贮存对象,
			但都需要自己在程序中进行初始化、手动添加各种对象到容器中。
	
	b.工厂时代
		设计模式应用,组建了简单专门生产及管理对象的工厂。

	c.旧EJB容器时代(EJB容器)
		EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。
		其特点包括网络服务支持和核心开发工具(SDK)。在J2EE里,Enterprise Java Beans(EJB)称为Java企业Bean,
		是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
			SessionBean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。
				Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
			Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,
				创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,
				容器会自动将Entity Bean的状态和数据库同步。
				
			MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。
				MDB实际上是一个异步的无状态SessionBean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。
				这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。
			EJB实际上是SUN的J2EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品。
	
	d.轻容器时代(PicoContainer、Spring、Apache HiveMind、Guice)
	
	e.新EJB时代EJB3.0

	f.容器展望(中庸理论)

(4)IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组建向容器发起请求查找资源,
	作为相应容器适时的返回资源,
	而应用了IOC之后,则是容器主动地将资源推送给它所管理的组件。组件所要做的仅是选择一种合适的方式来接受资源。
	
	DI(Dependency Injection):IOC的另一种表达形式,即组件以一些预先定义好的方式(例如:setter方法)接受来自,如容器的资源注入,
	相对IOC而言,这种表述更直接。

(5)IOC的前生(有图片)
	a.分离接口与实现
		现在有一需求,年终了公司要从系统中导出打印报表,报表有不同的类型如:Exel、PDF,
		我们在设计这个系统的时候可能会这样设计:先定义一个报表打印的接口,
		然后写一个导出PDF格式的类实现这个接口,这个时候如果你想要导出就必须知道这个接口以及现实了这个接口的类的细节。
		就如远古人要一把斧头,他除了要知道这把斧头的形状外,还必须知道怎么做。
	
	b.采用工厂模式
		这个时候我就只需要知道这几个接口和一个工厂,具体怎么做有工厂负责。
		就好比现在我只要知道这把斧头的形状,然后找一个工厂,告诉他我要做成什么样子就行,至于怎么做那是工厂的事。
		
	c.反转控制
		按需给,你需要什么东西,我给你什么东西。就好比我现在需要一颗白菜,那么我只要把装白菜的篮子放在门口就行。
		我只需要告诉容器我要打印报PDF格式的报表,其它事情又容器完成。

9.Bean
基于Spring框架的应用程序中:一切都是Bean。
Bean是Spring应用程序中(其实是Spring容器中)的基本元素,在Spring框架上运行的应用程序,
就是由一个又一个的Bean组合在一起、像搭积木一样堆出来的。
所有的Bean都由Spring的核心容器负责管理、创建、销毁,同时Bean之间的相互依赖也由Spring容器中的依赖注入功能自动管理。
Bean的名称
工厂中的每个Bean用一个唯一的名称来标识,可以在配置的过程中指定Bean的名称。理论上,Spring的名称可以由除"&"、","、":"及空格以外任务可见字符组件,
一般情况下我们使用字母及数字的组合来表示Bean的名称。若在Bean配置信息中没有指定Bean的名称,系统将会把Bean的类型全名作为Bean的名称,
若有多个Bean名称,则系统会自动使用类型名称加#及数字等分隔来生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值