spring框架学习(一)

spring框架学习(一)

Spring概述

    **Spring:春天----给软件行业带来了春天**
    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

优点

1.开源免费
2.轻量级框架
3.控制反转IoC,面向切面Aop
4.对事务的支持,完美兼容其他优秀的框架

一句话概述:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

组成

在这里插入图片描述
Spring-Core:
Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

Spring-Context:(Spring核心容器)

核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了消息、事件传播以及验证的支持。另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。

Spring-Aop:

Spring在它的AOP模块中提供了对面向切面编程的丰富支持。例如方法拦截器(servletListener ,controller…)和切点,可以有效的防止代码上功能的耦合,这个模块是在Spring应用中实现切面编程的基础。Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。

Spring-Dao:

使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接、旧代码中迁移自定义工具类JDBCUtil 也让开发变得繁琐。Spring的Dao模块对传统的JDBC进行了抽象,还提供了一种比编程性更好的声明性事务管理方法。

Spring-Web:

Web上下文模块建立于应用上下文模块之上,提供了WEB开发的基础集成特性,例如文件上传。另外,这个模块还提供了一些面向服务支持。利用Servlet listeners进行IOC容器初始化和针对Web的applicationcontext。

Spring Web MVC:

(Model-View-Controller)Spring为构建Web应用提供了一个功能全面的MVC框架。它提供了一种清晰的分离模型,在领域模型代码和web form之间。并且,还可以借助Spring框架的其他特性。

Spring-ORM:

关系映射模块,ORM包为流行的“关系/对象”映射APIs提供了集成层,包括JDO,Hibernate和iBatis(MyBatis)。通过ORM包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,方便开发时小组内整合代码。

IoC原型

新建一个空白的maven项目(maven环境配置问题查看上篇文章)

分析实现过程

1先写一个UserDao接口

   public interface UserDao {
    void getUser();
}

2 写接口的实现类

public class UserDaoImpl implements UserDao {
    public void getUser() {
        System.out.println("获取用户的信息");
    }
}

3在写一个UserServive的接口

public interface UserService {
    void getUser();
}

4写Service实现类

public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImpl();
@Override
    public void getUser() {
        userDao.getUser();
} }
  1. 测试一下
@Test
public void test(){
    UserService service = new UserServiceImpl();
    service.getUser();
}
public class UserDaoMySqlImpl implements UserDao {
    @Override
public void getUser() { System.out.println("MySql获取用户数据");
} }
public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoMySqlImpl();
@Override
    public void getUser() {
        userDao.getUser();
} }

在假设, 我们再增加一个Userdao的实现类 .

public class UserDaoOracleImpl implements UserDao {
    @Override
public void getUser() { System.out.println("Oracle获取用户数据");
} }

那么我们要使用Oracle , 又需要去service实现类里面修改对应的实现 . 假设我们的这种需求非常大 , 这种 方式就根本不适用了, 甚至反人类对吧 , 每次变动 , 都需要修改大量代码 . 这种设计的耦合性太高了, 牵一 发而动全身 .
那我们如何去解决呢 ?

我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下 .

public class UserServiceImpl implements UserService { 
private UserDao userDao;

// 利用set实现

public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
@Override
    public void getUser() {
        userDao.getUser();
} }

现在去我们的测试类里 , 进行测试 ;

@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() ); service.getUser();

//那我们现在又想用Oracle去实现呢

service.setUserDao( new UserDaoOracleImpl() ); service.getUser(); }

大家发现了区别没有 ? 可能很多人觉得没啥区别 . 他们已经发生了根本性的变化 , 很多地方都 不一样了 . 仔细去思考一下 , 以前所有东西都是由程序去进行控制创建 , 而现在是由我们自行控制创建对 象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了 . 它只负责提供一个接口 .
这种思想 , 从本质上解决了问题 , 我们程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合 性大大降低 . 这也就是IOC的原型 !

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值