一、 spring是什么?

我们知道struts 是 web 框架 (jsp/action/actionfrom)。hibernate 是 orm框架,处于持久层。

spring 是容器框架,用于配置bean,并维护bean之间关系的框架。

spring中非常重要的概念:

bean (是java中的任何一种对象 javabean/service/action/数据源./dao

ioc(控制反转 inverse of control)

di( dependency injection 依赖注入)

二、 快速入门

开发一个spring项目.

1.引入spring的开发包(最小配置spring.jar 该包把常用的jar都包括, 还要 写日志包 common-logging.jar

2.创建spring的一个核心文件(容器文件) applicationContext.xml, [hibernate有核心 hibernate.cfg.xml struts核心文件 struts-config.xml], 该文件一般放在src目录下,该文件中引入 xsd文件 :可以从给出的案例中拷贝一份.

3.配置bean

<!-- 在容器文件中配置bean(service/dao/domain/action/数据源) -->

<!-- bean元素的作用是,当我们的spring框架加载时候,spring就会自动的创建一个bean对象,并放入内存

UserService userSerivce=new UserService();

userSerivce.setName("韩顺平");

-->

<bean id="userService" class="com.service.UserService">

<!-- 这里就体现出注入的概念. -->

<property name="name">

<value>韩顺平</value>

</property>

</bean>

4.在Test.java中,我们怎么使用

//我们现在使用spring来完成上面的任务

//1.得到spring 的applicationContext对象(容器对象)

ApplicationContext  ac=new ClassPathXmlApplicationContext("applicationContext.xml");

UserService us=(UserService) ac.getBean("userService");

us.sayHello();

讨论:

传统的方法和使用spring的方法

1.使用spring ,没有new 对象,我们把创建对象的任务交给spring框架

2.spring的运行原理图:

总结:

spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以getBean(id),使用即可.

ioc是什么?

答 :ioc(inverse of controll ) 控制反转: 所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml),而程序本身不再维护.

DI是什么?

答: di(dependency injection) 依赖注入: 实际上di和ioc是同一个概念,spring设计者认为di更准确表示spring核心技术

注意:Applicationcontext是一个重量级对象,所以要把Applicationcontext做成一个单例的。

三、spring与接口编程

spring开发提倡接口编程,配合di技术可以层与层的解耦

举例说明:

现在我们体验一下spring的di配合接口编程的,完成一个字母大小写转换的案例思路:

  1. 创建一个接口 ChangeLetter
  2. 两个类实现接口
  3. 把对象配置到spring容器中
  4. 使用

在业务层中使用接口调用方式,改变Spring容器中的配置切换不同的接口实现方式即可改变业务逻辑而不需要改变业务层的代码。

通过上面的案例,我们可以初步体会到di配合接口编程,的确可以减少层(web层) 和 业务层的耦合度.

四、从ApplicationContext 应用上下文容器中获取bean和从bean工厂容器中获取bean

具体案例:

//从ApplicationContext中取bean

ApplicationContext ac=new ClassPathXmlApplicationContext("com/hsp/ioc/beans.xml");

//当我们去实例化beans.xml,该文件中配置的bean被实例(该bean scope是 singleton)从bean中取出student

//如果我们使用beanfactory去获取bean,当你只是实例化该容器, 那么

//容器的bean不被实例化,只有当你去使用getBean某个bean时,才会实时的创建.

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("com/hsp/ioc/beans.xml"));

factory.getBean("student");

结论:

1.如果使用ApplicationContext ,则配置的bean如果是 singleton (非singleton则不会)不管你用不用,都被实例化.(好处就是可以预先加载,缺点就是耗内存)

2.如果是 BeanFactory ,则当你获取beanfacotry时候,配置的bean不会被马上实例化,当你使用的时候,才被实例(好处节约内存,缺点就是速度)

3.规定: 一般没有特殊要求,应当使用ApplicatioContext完成

三种获取ApplicationContext 对象引用的方法

1.ClassPathXmlApplicationContext -> 通过类路径

2.FileSystemXmlApplicationContext -> 通过文件路径

举例:

ApplicationContext ac=new FileSystemXmlApplicationContext("文件路径beans.xml / applicationContext.xml");

D:\\myspringsrc\\com\\hsp\\ioc\\beans.xml 要用绝对路径

3.XmlWebApplicationContext  当tomcat启动的时候加载

五、bean的生命周期

为什么总是一个生命周期当做一个重点?

Servlet -> servlet生命周期 init() destory()

①  实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是scope=singleton)实例化到内存(spring 容器)

②  调用set方法设置属性

③  如果你实现了bean名字关注接口(BeanNameAware) 则,可以通过setBeanName获取id号(bean的名字)

④  如果你实现了 bean工厂关注接口,(BeanFactoryAware),则可以获取BeanFactory

如果是单例模式bean工厂在每个bean创建的时候都创建一次。

如果是prototype模式bean工厂则只会创建一次。

⑤  如果你实现了 ApplicationContextAware接口,则调用方法

 如果bean 和 一个后置处理器关联,则会自动去调用 Object postProcessBeforeInitialization方法

⑦  如果你实现InitializingBean 接口,则会调用 afterPropertiesSet

⑧  如果自己在<bean init-method=”init” /> 则可以在bean定义自己的初始化方法.

 如果bean 和 一个后置处理器关联,则会自动去调用 Object postProcessAfterInitialization方法

⑩ 使用我们的bean

其中非常有价值的是⑥⑨ 面向切面编程。相当于一个filter过滤器。配置关联之后将对所有的bean有效。

11. 容器关闭

12. 可以通过实现DisposableBean 接口来调用方法 destory

13. 可以在<bean destory-method=”fun1”/> 调用定制的销毁方法

小结: 我们实际开发中往往,没有用的这么的过程,常见的是:

1->2->6->9->10->11

问题:通过BeanFactory来获取bean对象,bean的生命周期是否和Applicationcontext 是一样吗?

不是一样的,bean是工厂中创建的生命周期会简单一些:

Spring(一)的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  3. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  4. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  5. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  6. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  7. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  8. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  9. Spring之旅(2)

    Spring简化Java的下一个理念:基于切面的声明式编程 3.应用切面 依赖注入的目的是让相互协作的组件保持松散耦合:而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件. AOP面向切面 ...

  10. Spring之旅

    Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...

随机推荐

  1. jQuery DateTimePicker 日期和时间插件

    jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等. 日期选择插件是一个配 ...

  2. 今天不谈技术,说说一些常用的软件~By 逆天

    前端工具:http://www.cnblogs.com/dunitian/p/5640147.html    在线办公: http://word.baidu.com/welcome.html http ...

  3. OpenCASCADE Documentation System

    OpenCASCADE Documentation System eryar@163.com Abstract. Doxygen is the de facto standard tool for g ...

  4. WPF gridview 不允许编辑

    WPF gridview正常双击是运行编辑的,如何让他不允许编辑呢,如果采用readonly属性,在双击时会报错,当然可以通过try catch处理,但是这样不好,好一点的解决办法就是在绑定数据时采用 ...

  5. SqlServer用sql对表名、字段做修改

    1.重命名表  下例将表 users重命名为 userdd.  EXEC sp_rename 'users', 'userdd'  2. 重命名列  下例将表 userdd中的列 sex 重命名为 s ...

  6. ASP.NET MVC5 网站开发实践(一) - 项目框架

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...

  7. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  8. npm上传自己的项目

    npm安装就不介绍了,自行度娘.本文介绍npm上传 先初始化:npm init 根据提示填完系统介绍信息(package.json): 再登录npmjs: npm login 效果如图: 输入注册的用 ...

  9. canvas学习(一)

    Canvas 学习之路 (一) canvas 是H5 里面神一样的东西,使得只是通过html和js就能做出非常棒的游戏和画面. 因为对前端无限的爱好,更加对canvas充满好奇,将我学习canvas的 ...

  10. C# 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...