Spring入门

1 Spring的概述

1.1 什么是Spring?

Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架

一站式框架:有Java EE开发的每一层的解决方案

  • WEB层       :SpringMVC
  • Service层   :Spring的Bean管理,Spring编程式、声明式事务
  • DAO层         Spring的Jdbc模板,Spring的ORM模块

1.2 Spring优势(摘自百度百科)

  • 方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

  • AOP的支持

通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

  • 声明式事务的支持

在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

  • 方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

  • 方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

  • 降低Java EE API的使用难度

Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

2 Spring的简单入门

2.1 Spring的jar包的下载

http://spring.io/

2.2 解压Spring的开发包

  • docs       :Spring的开发规范和API
  • libs         :Spring的开发的jar和源码
  • schema  :Spring的配置文件的约束

2.3 创建项目,引入最基本所需要的jar包

在lib中引入6个基本包:

  • spring-core-4.2.4.RELEASE.jar
  • spring-beans-4.2.4.RELEASE.jar
  • spring-context-4.2.4.RELEASE.jar
  • spring-expression-4.2.4.RELEASE.jar
  • com.springsource.org.apache.commons.logging-1.1.1.jar(Apace提供的日志记录的接口
  • com.springsource.org.apache.log4j-1.2.15.jar

前四个包对应着下图红框所示的四个core Container

6个基本jar包的路径为:

 spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\libs(前四个包的路径)

spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1 

 spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15

2.4 创建接口和实现类 

2.4.1 UserDao接口

package com.itykd.dao;

public interface UserDao {
	public void save();
}

2.4.2 UserDaoImpl实现类

package com.itykd.dao;

public class UserDaoImpl implements UserDao {

	@Override
	public void save() {
		System.out.println("UserDaoImpl的save方法执行了....");
	}
}

2.5 将类交给Spring管理(默认的配置文件名:applicationContext.xml)

 2.5.1 引入Spring约束

在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html,找到

the beans schema(bean约束)

<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">

2.5.2 在配置文件中将实现类交给Spring管理

<?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">
	<bean id="userDao" class="com.itykd.dao.UserDaoImpl" />
</beans>

2.5.3 书写测试类

package com.itykd.spring;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itykd.dao.UserDao;

public class SpringDemo {
	@Test
	public void StartSringIOC() {
		//创建Spring的工厂
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		userDao.save();	
	}
}

3 IOC和DI

3.1 IOC(Inverse of Control)

控制反转,将对象的创建权反转给了Spring

3.2 DI(Dependency Injection) 

依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来

4 传统面向对象和面向接口编程的问题

传统的面向对象和面向接口的方式在切换底层的时候需要修改源代码,比如以面向接口编程为例:

比如UerDao接口有两个实现类,分别是UserDaoImplUserDaoHibernateImpl,假设一开始我们选择的实现类是UserDaoImpl,那么当我们需要切换成Hibernate实现的时候需要将UserDao userDao = new UserDaoImpl()改成UserDao userDao = new UserDaoHibernateImpl(),如果修改的地方很多会很不方便;

5 Spring管理对象的原理

我们都知道,Spring利用IOC管理对象的创建,那么这里简单介绍IOC的底层原理:工厂+反射+配置文件

5.1 工厂模式

Spring用BeanFactory来减少接口和抽象类的耦合

如下代码所示:Spring利用工厂模式使接口和实现类之间没有耦合,但是接口和工厂有耦合,而UserDao和CustomerDao都有两种实现方式,当我们想要选择不同的实现类时,仍然需要一个个地修改代码

package com.itykd.spring;

import com.itykd.dao.UserDao;
import com.itykd.dao.impl.CustomerDaoHibernateImpl;
import com.itykd.dao.impl.UserDaoHibernateImpl;

public class BeanFactory {

	public static UserDao getUserDao(){
		//实现方式1:
		//return new UserDaoImpl();
		//实现方式2:
		return new UserDaoHibernateImpl();
		
	}
	public static UserDao getCustomerDao(){
		//实现方式1:
		//return new CustomerDaoImpl();
		//实现方式2:
		return new CustomerDaoHibernateImpl();
	}
}

5.2 反射和配置文件

首先解析配置文件,根据参数id找到对应的类路径,并利用反射加载在配置文件中的class,然后生成类的实例;

<bean id="userDao" class="com.itykd.dao.UserDaoImpl" />


public class BeanFactory {

	public static Object getBean(String id){
        //该方法首先解析XML文件
        //然后用反射生成对象
        Class clazz = Class.forName(UserDaoImpl.class);
        return clazz.newInstance();
        
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值