spring框架篇(一)-------spring简介与配置文件使用控制反转事例
spring简介
Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧。其官方网站是 https://spring.io/ ,可以在官方网站下载到完整的类库,源代码以及文档。spring是一个高度灵活的轻量级框架,其目的是降低企业级应用开发的复杂度。
spring的特点
轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
容器:Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架:Spring 实现了使用简单的组件配置组合成一个复杂的应用,在 Spring 中可以使用 XML 和 Java 注解组合这些对象
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
依赖注入(DI --- dependency injection、IOC)
面向切面编程(AOP --- aspect oriented programming)
(个人认为依赖注入和面向切面变成是spring的核心,也是spring应用时需要主要学习的东西,我是小白,刚接触框架部分,希望有问题大家指出来,欢迎指教。)
(额,还有个声明式事务处理,这一块我还没有去学,学完再来改这个地方吧)
spring3.0和spring4.0的功能组建模块有所不同
spring3.0的主要结构只是7块(摘抄自Java程序员面试宝典)
模块 | 描述 |
Spring AOP | 切面编程的思想,使spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,可以不依赖具体的EJB组建,就可以将事务管理集成到应用程序中 |
Spring ORM | 提供了对现有ORM框架的支持,例如Hibernate、JDO等 |
Spring DAO | 提供对数据库访问对象(DAO)模式和JDBC支持,DAO可以实现把业务逻辑与数据库访问的代码实现分离,降低代码耦合度。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的处理(可以很好的针对不同数据库厂商抛出的异常)。 |
Spring Web | 提供了Servlet监听器的Context和Web应用的上下文。同时还集成了一些现有的Web框架,例如Structs |
Spring Context | 扩展核心容器,提供了Spring上下文环境,给开发人员提供了很多非常有用的服务,例如国际化、E-mail和JNDI访问等 |
Spring Web MVC | 提供了一个构建Web应用程序的MVC的实现 |
Spring Core | Spring框架核心容器,提供了Spring框架的基本功能。这模块最主要的组件为BeanFactory,它使用工厂模式来创建所需的对象。同时BeanFactory使用IOC思想,通过读取XML文件的方式来实例化对象,可以说BeanFactroy提供了组件生命周期管理,组件的创建、装配、销毁等功能。 |
spring4.0建立了灵活的可热插拔的组件结构,基础框架如下图
(原谅我会的真的很少,又在网上摘抄到的)
Spring核心容器
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI(DI—Dependency Injection,即“依赖注入”)的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail、JNDI访问、EJB集成和调度。
所有的Spring模块都构建于核心容器之上。当你配置应用时,其实你隐式地使用了这些类。
Spring的AOP模块
在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安全)从它们所应用的对象中解耦出来。
数据访问与集成
使用JDBC编写代码通常会导致大量的样板式代码,例如获得数据库连接、创建语句、处理结果集到最后关闭数据库连接。Spring的JDBC和DAO(Data Access Object)模块抽象了这些样板式代码,使我们的数据库代码变得简单明了,还可以避免因为关闭数据库资源失败而引发的问题。该模块在多种数据库服务的错误信息之上构建了一个语义丰富的异常层,以后我们再也不需要解释那些隐晦专有的SQL错误信息了!
对于那些更喜欢ORM(Object-Relational Mapping)工具而不愿意直接使用JDBC的开发者,Spring提供了ORM模块。Spring的ORM模块建立在对DAO的支持之上,并为多个ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对许多流行的ORM框架进行了集成,包括Hibernate、Java Persisternce API、Java Data Object和MyBatis。Spring的事务管理支持所有的ORM框架以及JDBC。
Web与远程调用
MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。Java从来不缺少MVC框架,Apache的Struts、JSF、WebWork和Tapestry都是可选的最流行的MVC框架。
虽然Spring能够与多种流行的MVC框架进行集成,但它的Web和远程调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松耦合水平。
除了面向用户的Web应用,该模块还提供了多种构建与其他应用交互的远程调用方案。
Spring远程调用功能集成了RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,
同时Spring还自带了一个远程调用框架:HTTP invoker。Spring还提供了暴露和使用REST API的良好支持。
Instrumentation
Spring的Instrumentation模块提供了为JVM添加代理(agent)的功能。具体来讲,它为Tomcat提供了一个织入代理,能够为Tomcat传递类文件,就像这些文件是被类加载器加载的一样。如果这听起来有点难以理解,不必对此过于担心。
测试
Spring提供了测试模块以致力于Spring应用的测试。
通过该模块,你会发现Spring为使用JNDI、Servlet和Portlet编写单元测试提供了一系列的mock对象实现。对于集成测试,该模块为加载Spring应用上下文中的bean集合以及与Spring上下文中的bean进行交互提供了支持。
控制反转与依赖注入
IOC (Inversion of Control) :控制反转,通过容器来控制对象的创建及维护,对象中成员变量的创建及维护。反转就是将对象的控制权转移给容器处理,目的是获得更好的扩展性和可维护性。用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中
官方下载spring4.x最新开发版本 https://repo.spring.io/release/org/springframework/spring/
控制反转需要导入的jar包
还需要下载commons-logging日志文件 commons-logging-1.1.1.jar
先写一个简单的类HelloService
package com.icss.spring.service.impl; import com.icss.spring.service.HelloService; public class HelloServiceImpl implements HelloService{ @Override
public void sayHello() {
System.out.println("hello");
} }
然后我们新建一个xml文件(在src目录下),配置spring的框架,记得build path哦!
* spring-framework-reference/html/目录下
* 找到xsd-config.html.引入beans约束
<?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="类的完整路径"-->
<bean id="helloService" class="com.icss.spring.service.impl.HelloServiceImpl"></bean>
</beans>
写测试类测试一下我们写的代码吧
package com.icss.spring.test; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource; import com.icss.spring.service.HelloService; public class Test {
public static void main(String[] args) {
//获取容器
ApplicationContext application=new ClassPathXmlApplicationContext("applicationContest.xml");//填入xml文件名,路径在src下
//BeanFactory application=new XmlBeanFactory(new ClassPathResource("applicationContest.xml"));//从bean工厂里面获取对象,与上面获取的区别为 上面的是直接初始化所有bean对象,在执行getBean()之前就开始了初始化工作,而这个是在得到对象时候才进行初始化操作
//获取业务对象
HelloService helloService=(HelloService) application.getBean("helloService");//获得bean对象 需要强转 不再需要去new对象啦
// 已经交给容器去实现了,这就是控制反转的实例
//调用对象的方法
helloService.sayHello();
}
}
(这里编者自己认为是代码的一个更新过程,毕竟这是三种里面最简单的通过配置文件实例化对象的方法,其他两种都稍显复杂,如果不对请指出,积极学习改正。)
这个方法是通过配置文件导入bean,其实是上课有讲到三种方法的,后面两种分别需要用简单静态工厂与工厂方法来创建,只进行简单的说明不做举例。
1.使用类构造器实例化(默认无参数)
<bean id="bean1" class="com.chinasofti.spring.demo1.Bean1"></bean>
2.使用静态工厂方法实例化(简单工厂模式)
<bean id="bean2" class="com.chinasofti.spring.demo2.Bean2Factory" factory-method="getBean2"></bean>
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}
}
3.使用实例工厂方法实例化(工厂方法模式):
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.chinasofti.spring.demo2.Bean3Factory"/>
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
这里插入一张图 配置Eclipse中spring框架的xml的快捷提示 window-->xml catalog-->add-->spring-framework4.3.22.RELEASE\schema\beans\
这是我的第一篇博客,排版什么的都还不会,见证我的成长吧!!!
spring框架篇(一)-------spring简介与配置文件使用控制反转事例的更多相关文章
- Spring框架快速入门之简介
Spring是java平台上的一个开源应用框架.它的第一个版本是由Rod Johnson写出来的.Rod在他的Expert One-On- One Java EE Design and Develop ...
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
- Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程
上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...
- Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- Spring框架学习03——Spring Bean 的详解
1.Bean 的配置 Spring可以看做一个大型工厂,用于生产和管理Spring容器中的Bean,Spring框架支持XML和Properties两种格式的配置文件,在实际开发中常用XML格式的配置 ...
- Spring框架系列(2) - Spring简单例子引入Spring要点
上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
随机推荐
- Django 1.9 + celery + django-celry 实现定时任务
celery可以进行任务异步处理,celery还有一种Celery的常用模式便是执行定期任务. 执行定期任务时, Celery会通过celerybeat进程来完成. Celerybeat会保持运行, ...
- 安装系统后IP配置问题
1.配置静态IP 在/etc/sysconfig/network-script/ifcfg-eth0 文件,网卡管理文件.修改为静态IP.IPADDR.网关.掩码等 同一台机器上的网卡不能配置在同一网 ...
- UVa——1600(巡逻机器人)
迷宫求最短路的话一般用bfs都可以解决,但是这个加了个状态,那么就增加一个维度,用来判断k的值.比较简单的三维bfs.写搜索题的话一定要注意细节.这个题花了好长的时间.因为k的原因,一开始用了k的原因 ...
- Python学习笔记,day4
Python学习第四天 一.装饰器 函数调用顺序: 其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用 高阶函数: 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入 ...
- socket端口绑定后通过bat干掉
@echo off::port为需要去绑定端口set port=8888for /f "tokens=5 delims= " %%a in ('netstat -ano ^|fin ...
- uWSGI+Django (中)
环境是ubuntu 14.0 python3 django 1.10 1:安装uwsgi sudo apt-get install libpcre3 libpcre3-dev sudo pip3 i ...
- 3. Port scanners (端口扫描器 4个)
3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现(“ping扫描”)和端口扫描. 旧的2.x版本只有Windows,但是,新的3. ...
- python的mysql小代码
我因为懒,就想写个批量insert数据的小代码 这里是代码 # _*_ encoding:utf-8 _*_ import os import MySQLdb import numpy as np d ...
- pymongo中的连接操作:Connection()与MongoClient()
class MongoClient(pymongo.common.BaseObject) Connection to MongoDB. Method resolution order: MongoCl ...
- mysql的事务和数据库锁的关系
数据库加事务并不是数据就安全来了,事务和锁要分析清楚和配合使用 问题背景处于对高并发的秒杀环节的理解整理如下: 秒杀的时候高并发主要注意1.在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成 ...