一、 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. LInux 安装东西

    本机   PHP 安装 ./configure --prefix=/usr/local/php5 --with-gd --enable-gd-native-ttf --enable-gd-jis-co ...

  2. Oozie调度报错——ORA-00918:未明确定义列

    Oozie在执行sqoop的时候报错,同样的SQL在sqoop中可用,在oozie中不可用: Caused by: java.sql.SQLSyntaxErrorException: ORA-0091 ...

  3. javaScript 基础知识

    一.三个对话框 1.alert("提示信息") 弹出只带有一个确定按钮的对话框2.confirm("提示信息") 弹出有确定和取消按钮的对话框3.prompt( ...

  4. addUser

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 2013 duilib入门简明教程 -- 结合win32和MFC (16)

        虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况.如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话 ...

  6. salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)

    此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...

  7. ora-01652无法通过128(在表空间temp中)扩展temp段

    今天提交请求后,提示ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段.最后通过ALTER DATABASE TEMPFILE '/*/*/db/apps_st/d ...

  8. Execute SQL Task 参数和变量的映射

    Execute SQL Task能够执行带参数的SQL查询语句或存储过程(SP),通过SSIS的变量(Variable)对参数赋值.对于不同的Connection Manager,在Task中需要使用 ...

  9. IOS开发之记录用户登陆状态

    上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登 ...

  10. 移动前端开发-单页应用(spa)模型

    一门新的技术诞生总会引来一番争议,单页Web应用程序也不例外,其最大的优势在于用户体验,对于内容的改动不需要加载整个页面:对服务器压力很小,消耗更少的带宽,与面向服务的架构更好地结合.使用HTML+C ...