Spring学习笔记--Spring简介
1.spring:给软件行业带来了春天;
2.spring的理念:spring框架的初衷是使的现有的更加实用,spring不是创造轮子(技术或框架),而是使现有的轮子更好的运转;spring本身是一个大杂烩,整合现有的框架技术;
3.Spring优点:
轻量级框架:不具备侵入性(使用某个框架,我们不需要实现它的某个接口,方便框架的替换,原有的代码不需要替换);
Ioc容器:控制反转;
Aop:面向切面编程;
对事务的支持;
对矿建的支持;
...................
4.主要内容:

从下向上看spring的主要内容:
Test:Spring支持Junit单元测试
核心容器(IOC):Bean(Bean工厂,创建对象)、Core(一切的基础)、Context(上下文)、SpEL(Spring的表达式语言);
AOP:AOP、Aspects
对数据访问的支持:JDBC、ORM、Transaction、JMS(java邮件服务)
对web的支持:Spring MVC
5.Ioc--inversion of control控制反转:
首先引用一篇文章的内容,简单了解一下DAO和Service层,Controller层、View层(http://www.jianshu.com/p/403acf6df656),另一篇文章http://www.cnblogs.com/xdp-gacl/p/4249939.html对Spring IOC设计思想的总结比较全面和通俗易懂;
、Dao层
Dao层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,Dao层的设计首先是设计Dao的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,Dao层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。 、Service层
Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的Dao层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。 、Controller层
Controller层负责具体的业务模块流程的控制,在此层里面要调用Service层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。 、View层
View层与控制层结合比较紧密,需要二者结合起来协同工作。View层主要负责网页前台的Jsp页面的表示。 文/睡在客厅里的人(简书作者)
原文链接:http://www.jianshu.com/p/403acf6df656
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
鉴于上面文章中的介绍我们首先给出IOC(控制反转)思想的代码示例:
第一步:定义DAO接口UserDao
package cn.sxt.dao;
//降低耦合性
public interface UserDao {
public void getUser();
}
第二步:定义DAO接口的实现类UserDaoMysqlImpl和UserDaoOracleImpl
UserDaoMysqlImpl:
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser(){
System.out.println("mysql获取用户数据");
}
}
UserDaoOracleImpl:
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser(){
System.out.println("mysql获取用户数据");
}
}
第三步:定义Service层接口UserService,实现具体的业务
package cn.sxt.service;
public interface UserService {
public void getUser();
}
第四步:定义Service接口的实现类UserServiceImpl,Service层的业务实现,具体要调用到已定义的Dao层的接口
我们传统的JavaSe设计思想,代码是这样组织的:我们直接在对象内部(应用程序本身)通过new进行创建对象,是程序主动去创建依赖对象
package cn.sxt.service.impl; import cn.sxt.dao.UserDao;
import cn.sxt.service.UserService; public class UserServiceImpl implements UserService{
//直接依赖(耦合)
private UserDao userDao=new UserDaoMySqlImpl();
@Override
public void getUser(){
userDao.getUser();
}
}
在我们的测试类Test(可以理解成客户端)中
package cn.sxt.test; import cn.sxt.dao.impl.UserDaoMySqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.service.impl.UserServiceImpl; //原来是在UserServiceImpl中创建Userdao对象(应用程序本身)
//现在是客户端(调用端)来创建
public class Test {
public static void main(String args[]){
UserServiceImpl userService=new UserServiceImpl();
userService.getUser();
}
如果需要替换DAO接口的具体实现类的时候,我们需要将UserServiceImpl中的
private UserDao userDao=new UserDaoMySqlImpl();
修改为:
private UserDao userDao=new UserDaoOracleImpl();
控制反转(IOC)的设计思想,我们不需要应用程序本身来创建对象,而是将创建对象的任务交付给IOC容器:此时,我们在UserServiceImpl可以这样编写代码
package cn.sxt.service.impl; import cn.sxt.dao.UserDao;
import cn.sxt.service.UserService; public class UserServiceImpl implements UserService{
//直接依赖(耦合)
// private UserDao userDao=new UserDaoMySqlImpl();
//瞬间隔离开来
private UserDao userDao=null;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser(){
userDao.getUser();
}
}
添加一个set方法,当调用端需要创建对象的时候,创建具体实现类的对象,此时我们在Test类中就可以这样组织代码:
package cn.sxt.test; import cn.sxt.dao.impl.UserDaoMySqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.service.impl.UserServiceImpl; //原来是在UserServiceImpl中创建Userdao对象(应用程序本身)
//现在是客户端(调用端)来创建
public class Test {
public static void main(String args[]){
UserServiceImpl userService=new UserServiceImpl();
userService.setUserDao(new UserDaoMySqlImpl());
userService.getUser();
System.out.println("-----分割线------");
userService.setUserDao(new UserDaoOracleImpl());
userService.getUser(); }
}
Test测试类运行结果:
mysql获取用户数据
-----分割线------
Oracle获取用户数据
通过上面的例子:
1).对象由原来程序本身创建,变为了程序接收对象
2).程序员主要精力集中与业务的实现
3).实现了service和dao的解耦工作,没有直接依赖关系,层与层之间实现了分离(service和DAO没有关系,完全分离)
4).如果dao的实现发生改变,应用程序本身不用改变(更改Spring的配置文件)
Spring学习笔记--Spring简介的更多相关文章
- Spring学习笔记--spring+mybatis集成
前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...
- Spring学习笔记--Spring IOC
沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...
- Spring学习笔记—Spring之旅
1.Spring简介 Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...
- Spring学习笔记--Spring配置文件和依赖注入
Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...
- Spring学习笔记——Spring中的BeanFactory与FactoryBean
BeanFactory BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范.他的实现类有D ...
- Spring学习笔记——Spring依赖注入原理分析
我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...
- Spring学习笔记--Spring表达式语言SpEL
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...
- 转:Spring学习笔记---Spring Security登录页
转:http://axuebin.com/blog/2016/06/21/spring-security/?utm_source=tuicool&utm_medium=referral. 提示 ...
- Spring学习笔记——Spring中lazy-init与abstract具体解释
Spring的懒载入的作用是为了避免无谓的性能开销,就是当真正须要数据的时候才去运行数据的载入操作.不只在Spring中.我们在实际的编码过程中也应该借鉴这种思想,来提高我们程序的效率. 首先我们看一 ...
随机推荐
- 如何在Windows 10上访问NFS的share
大致过程是: 1. 开启名为"Services for NFS"的Windows Feature. 2. 如果需要拥有写权限,需要修改注册表. 3. Mount即可. 具体步骤详见 ...
- Spark2.3(三十六):根据appName验证某个app是否在运行
具体脚本 #/bin/sh #LANG=zh_CN.utf8 #export LANG export SPARK_KAFKA_VERSION=0.10 export LANG=zh_CN.UTF- # ...
- JFinal项目部署到Weblogic注意事项
1:修改web.xml配置文件增加以下监听配置 <listener> <listener-class>com.jfinal.ext.kit.ElResolverListener ...
- ios实例开发精品源码文章推荐(8.22)
1.iOS源码:简单阅读器 http://www.apkbus.com/android-112176-1-1.html 2.iOS源码:音频声效--Audio Streamer<ignore_j ...
- 【Android】解析Android的路径
目录结构: contents structure [+] 内部路径 外部路径 Assets目录 Android中的路径主要分为内部路径和外部路径. 一.内部路径 常见的内部存储路径有: File f1 ...
- Swift 柯里化
前言 由于柯里化在业务层的应用较少,所以从 Swift 3.0 开始移除了柯里化的用法,但是 Swift 的很多底层特性是使用柯里化来表达的. 1.柯里化 1.1 柯里化简介 柯里化(Currying ...
- 1 翻译系列:什么是Code First(EF 6 Code First 系列)
原文链接:http://www.entityframeworktutorial.net/code-first/what-is-code-first.aspx EF 6 Code-First系列文章目录 ...
- Atitit easyui翻页组件与vue的集成解决方案attilax总结
Atitit easyui翻页组件与vue的集成解决方案attilax总结 ===============使用1 ===========\paggingUtil_easyui_vue.js2 C:\U ...
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...
- TP支持菜单动态生成RBAC权限系统数据库结构设计方案
最简单基于RBAC权限系统数据库结构设计 包括如下几个表 1. 用户表 -- Table "t_user" DDL CREATE TABLE `t_user` ( `id` int ...