Spring基础篇01

Spring概述

什么是Spring

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

EE开发分成三层结构:

  • WEB层:Spring MVC.
  • 业务层:Bean管理:(IOC)
  • 持久层:Spring的JDBC模板.ORM模板用于整合其他的持久层框架.

为什么学习使用Spring(Spring的作用)

  • 方便解耦,简化开发
  • Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理AOP编程的支持
  • Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能声明式事务的支持
  • 只需要通过配置就可以完成对事务的管理,而无需手动编程方便程序的测试
  • Spring对Junit4支持,可以通过注解方便的测试Spring程序方便集成各种优秀框架
  • Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持降低JavaEEAPI的使用难度(spring对于主流的应用框架提供了集成支持)

Spring主要的7个模块

  • Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
  • Spring Core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务;
  • Spring AOP:AOP服务;
  • Spring Web:提供了基本的面向Web的综合特性,提供对常见框架如Struts2的支持,* * * Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
  • Spring MVC:提供面向Web应用的Model-View-Controller,即MVC实现。
  • Spring DAO:对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务;
  • Spring ORM:对现有的ORM框架的支持;

Spring IOC理解

(1)IOC就是控制反转,指创建对象的控制权转移给Spring框架进行管理,并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部依赖。

(2)最直观的表达就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。

(3)Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。

Spring AOP理解

OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用。

AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

(1)AspectJ是静态代理,也称为编译时增强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring的入门案例(IOC)

IOC的底层实现原理

IOC:Inversion of Control控制反转. 指的是对象的创建权反转(交给)给Spring,作用是实现了程序的解耦合.

在这里插入图片描述

步骤1 下载Spring的开发包

解压:(Spring目录结构)

  • docs :API和开发规范.
    libs :jar包和源码.
    schema :约束

在这里插入图片描述

步骤2 创建web项目,引入Spring的开发包

首先创建一个动态web项目,例如spring_demo01,然后导入Spring框架相关依赖jar包,要导入哪些jar包呢?
在这里插入图片描述
由于我们只是初次入门Spring,所以也只是使用到了Spring的基本功能,从上图红框框中的部分可知,我们需要使用到下面的这4个jar包。
在这里插入图片描述
除此之外,还要导入Spring支持的日志jar包,也就是下面两个jar包。
在这里插入图片描述

关于以上两个jar包,我稍微做一下解释com.springsource.org.apache.commons.logging-1.1.1.jar它里面都是一些接口,有接口,那当然要有实现类了,恰好,com.springsource.org.apache.log4j-1.2.15.jar里面就是那些接口的实现类。使用Log4j,我们可以查看到当前运行程序中对象创建的过程,也可以看到更详细的信息,Log4j适合使用在程序调试中。
导入完日志相关的jar包之后,我们还要导入日志记录文件,即在src目录下引入Log4j的配置文件(log4j.properties),该文件内容如下:
在这里插入图片描述
从上图可知,log4j.rootLogger就是用于设置日志的输出级别,那么日志的输出级别有几种呢?有如下5种。
在这里插入图片描述

所以,最终是这些jar包
在这里插入图片描述

步骤3.引入相关配置文件
log4j.properties
applicationContext.xml

首先,我们需要创建Spring的配置文件,Spring配置文件的名称和位置没有固定要求,一般建议把该文件放到src目录下面,名称可随便写,官方建议写成applicationContext.xml。然后我们还需要在配置文件中引入约束,Spring学习阶段的约束是schema约束。那么问题来了,这个约束又该怎么写呢?可参考docs\spring-framework-reference\html目录下的xsd-configuration.html文件,在其内容最后面找到如下内容。
在这里插入图片描述
将其复制黏贴到配置文件applicationContext.xml中,这样applicationContext.xml文件的内容就是下面的样子了

<?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">
        
</beans>

步骤4.编写相关的类
1 创建编写接口类和其实现类

首先,在src目录下创建一个com.cao.spring.demo01包,并在该包下创建一个名为UserDao的接口。

package com.cao.spring.demo01;
/**
 * 用户管理的dao层接口的接口
 * @author cao
 *
 */
public interface UserDao {

	public void save();
}

实现类:

package com.cao.spring.demo01;
/**
 * 用户管理dao层的实现类
 * @author cao
 *
 */
public class UserDaoImpl implements UserDao {

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

}

2 将实现类交给spring管理

在applicationContext.xml中配置对象的创建

<?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">
        
	<!-- Spring入门的配置 -->
	<bean id="userDao" class="com.cao.spring.demo01.UserDaoImpl"></bean>
	
</beans>

3 编写测试类

使用spring先要来了解一个对象
ApplicationContext

  • 作用:用来解析xml配置文件
package com.cao.spring.demo01;

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



public class SpringTest {
	//传统方式
	@Test
	public void springtest01() {
		UserDao userDao = new UserDaoImpl();
		userDao.save();
	}
	//Spring 方式
	@Test
	public void springtest02() {
		//创建spring工厂
		/**
		 * ApplicationContext:用来解析xml配置文件
		 */
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// classpath就是类路径,src目录下的文件最终要编译到类路径下
		UserDao bean = (UserDao) applicationContext.getBean("userDao");
		bean.save();
	}
}

控制台打印结果为:
在这里插入图片描述

Spring IOC与DI区别

IoC,它指的就是将对象的创建权反转给(交给)了Spring。

DI,即Dependency Injection,翻译过来就是依赖注入,它指的是Spring在管理某个类的时候会将该类依赖的属性注入(设置)进来,也就是说在创建对象的过程中,向类里面的属性中设置值。注意:依赖注入不能单独存在,须在控制反转基础之上完成,用更通俗点的话来说,就是注入类里面的属性值,不能直接注入,须创建类的对象再完成注入。

我们想要给UserDaoImpl这个实现类里面的某一个属性(例如String类型的name)设置值,该咋怎呢?

步骤1.修改UserDaoImpl
package com.cao.spring.demo01;
/**
 * 用户管理dao层的实现类
 * @author cao
 *
 */
public class UserDaoImpl implements UserDao {

	private String name;
	public void setName(String name) {
		this.name=name;
	}
	
	@Override
	public void save() {
		System.out.println("-----UserDaoImpl中的save方法执行了----"+name);
		
	}

}

步骤2.修改applicationContext.xml及测试类

springtest01方法传统的方式来为UserDaoImpl实现类的name属性设置值

缺点:
1. 不能面向接口编程了
2. 你还得手动调用set方法,也得去改变程序的源代码
springtest02方法采用依赖注入

即在applicationContext.xml文件中为配置好的UserDaoImpl实现类的name属性注入一个值,那么情况就完全不同了,以上两个缺点也就不复存在了。
修改applicationContext.xml
在这里插入图片描述
测试类:

public class SpringTest {
	//传统方式
	@Test
	public void springtest01() {
		UserDaoImpl userDao = new UserDaoImpl();
		
		userDao.setName("李四");
		userDao.save();
	}
	//Spring 方式
	@Test
	public void springtest02() {
		//创建spring工厂
		/**
		 * ApplicationContext:用来解析xml配置文件
		 */
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// classpath就是类路径,src目录下的文件最终要编译到类路径下
		UserDao bean = (UserDao) applicationContext.getBean("userDao");
		bean.save();
	}
}

测试类中的springTest01和springTest02运行结果相同,结果为
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CANDH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值