昔洛 的个人博客

Bug不空,誓不成佛

  menu
70 文章
14633 浏览
2 当前访客
ღゝ◡╹)ノ❤️

第一篇 新的学习,一步一个脚印,Spring 程序员的春天

一、Spring概述

1.1.1  什么是Spring

       Spring以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程) 为内核,使用基本的JavaBean来完成以前只可能由EJB(Enterprise Java Beans,Java企业Bean)完成的工作,取代了EJB的臃肿、低效的开发模式。
       Spring致力于JavaEE应用各层的解决方案,在表现层它提供了Spring MVC 以及与Struts Hibernate、JdbcTemplate等技术。因此可以说Spring是企业应用开发很好的“一站式”选择。虽然Spring贯穿于表现层、业务逻辑层和持久层,但它并不像取代那些已有的框架,而是以高度的开放性与他们进行无缝整合。

1.1.2  Spring框架的优点

  • 非入侵式设计:Spring是一种非入侵式(non-invasive)框架,它可以使应用程序代码对框架的依赖最小化
  • 方便理解、简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理、大大地降低了组件之间的耦合性。
  • 支持AOP:Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
  • 支持声明式事务处理:只需要通过配置就可以完成对事物的管理,而无需手动编程。
  • 方便程序测试:Spring提供了对Junit4/5的支持,可以通过注解方便地测试Spring程序。
  • 方便集成各种优秀框架:Spring不排斥各种优秀的开源框架(如Struts、Hibernate、MyBatista、Quartz等)的直接支持。
  • 降低JavaEE API的使用难度:Spring对JavaEE开发中非常难用的一些API(如JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。

1.1.3  Spring的体系结构

Spring框架采用的是分层架构,它一系列的功能要素被分成20个模块,这些模块大体分为Core Container、Data Access/Integration、Web、AOP、Instrumentation、Messaging和Test 。

  • 1.Core Container(核心容器)
      Spring的核心容器是其他模块建立的基础,他主要由Beans模块、Core模块、Context模块、Context-support模块和SpELl(Spring Expression Language,Spring 表达式语言)模块组成。
  • 2.Data Access/Integration(数据访问/集成)
      数据访问/集成层包括JDBC、ORM、OXM、JMS和Transactions模块。
  • 3.Web
      Spring的Web层包括WebSocket、Servlet、Web和Portlet模块,其中介绍下Servlet模块和Web模块
        Servlet模块:也称为Spring-webmvc模块,包含了Spring的模型-视图-控制器(MVC) 和REST Web Service实现的Web应用上下文。
        Web模块:提供了基本的Web开发集成特性,例如:多文件上传功能、使用Servlet监听器来初始化IOC容器以及Web应用上下文。
  • 4.其他模块
      Spring的其他模块还有AOP、Aspects、Instrumentation以及Test模块

1.1.4  Spring 的下载及目录结构

  • 1. Spring框架包
         通过地址点我下载可以到官方框架包目录找到想要的Release版本进行选择下载,完成后将压缩包解压到自定义文件夹中,目录结构如图所示
    image.png
    其中docs文件夹包含Spring的API文档和开发规范;libs文件夹中包含开发需要的Jar包和源码;schema文件夹包含开发所需要的schema文件,这些文件中定义了Spring相关配置文件的约束。我们所需要的jar包主要都在libs目录中,jar包分为三类,其中以Release.jar结尾的是Spring框架class文件的jar包;以Release-javadoc.jar结尾的是Spring框架API文档的压缩包;以Release-sources.jar结尾的是Spring框架源文件的压缩包。整个Spring框架由20个模块组成,该目录下Spring为每个模块都提供了这三类压缩包
在libs目录中,有四个Spring的基础包,他们分别对应Spring核心容器的四个模块,具体介绍如下:
   spring-core-4.3.6.RELEASE.jar:包含Spring框架基本的核心工具类,Spring其他组件都要用到这个包里的类,是其他组件的基本核心。
   spring-beans-4.3.6.RELEASE.jar:所有应用都要用到JAR包,它包含访问配置文件、创建和管理Bean以及进行Inversion of Control(IoC)或者Dependency InJection(DI)操作相关的所有类
   spring-context-4.3.6.RELEASE.jar:Spring提供了在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等。
   spring-expression-4.3.6.RELEASE.jar:定义了Spring的表达式语言。
  • 2. 第三方依赖包
      在使用Spring开发时,除了要使用自带的JAR包外,Spring的核心容器还需要依赖commons.logging的JAR包。该JAR包可以通过网址点我下载里面找到image.png
    进行点击下载,解压后找到commons-logging1.2.jar即可

二、Spring的核心容器

1.2.1  BeanFactory

BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用他们的生命周期方法

创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"));

注:这种加载方式在实际开发中并不多。

1.2.2  ApplicationContext

    ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。
其中创建ApplicationContext接口实例通常采用两种方法,具体如下

  • 通过ClassPathXmlApplicationContext创建
      ClasspathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,语法如下:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

上述代码中,configLocation参数用于指定Spring配置文件的名称和位置。如果其值为"applicationContext.xml",则Spring会去类路径中查找名称为applicationContext.xml的配置和文件。(类路径也是常用方法)

  • 通过FileSystemXmlApplicationContext创建
      FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件这个也并不推荐使用

创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种办法

  • Object getBean(String name):根据容器中Bean的id或name来获取指定的Bean,获取之后需要强制转换类型。
  • <T> T getBean(Class<T> requiredType):根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。

三、Spring的入门程序

  (1)导包

      在eclipse中创建一个Web项目将四个Spring的基础包和commons-logging的jar复制到lib目录中,如下图所示:
image.png

  (2)创建接口UserDao

在src目录下创建一个com.itheima.ioc包,并在包中创建接口UserDao,然后顶一个say()方法

package com.itheima.ioc;
public interface UserDao {
    public void say();
}

  (3)创建实现接口类

在com.itheima.ioc包下创建UserDao接口的实现类UserDaoImpl,并实现say()方法

package com.itheima.ioc;
public class UserDaoImpl implements UserDao {
    public void say(){
        System.out.println("userDao say hello World !");
    }
}

  (4)配置applicationContext.xml,并创建id为UserDao的Bean

<?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.itheima.ioc.UserDaoImpl"/>
</beans>

图中2~5行代码是Spring的约束配置。该配置信息不需要我们手写,可以在Spring的帮助文档中找到(Spring的解压文件夹中docs目录,在spring-framework-reference文件夹下打开html文件夹并找到index.html打开,在浏览器页面的Overview of Spring Framework 下的7.2.1小节中Configuration metadata中即可找到配置文件约束)。第6行代码表示在Spring容器中创建一个id为userDao的Bean实例,其中class属性用于指定需要实例化的Bean类。

  (5)创建测试类

在com.itheima.ioc包下创建测试类TestMain,编写主函数main用来初始化容器并加载配置文件获取userDao实例(对象),最后调用实例中的say方法

package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
	public static void main(String []args) {
		//1.初始化spring容器,加载配置文件
		ApplicationContext appt = new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.通过容器获取userDao实例
		UserDao user = (UserDao)appt.getBean("userDao");//appt.getBean("userDao",UserDao.class);
注明要加载的类可以不用强制转换了
		user.say();
	}
}

执行程序后将显示如图所示
image.png

四、依赖注入

1.4.1 依赖注入的概念

    依赖注入(Dependency Injection,简称DI)与控制反 转(IOC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。
    当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖者)时,在传统模式下,调用者通常采用“new被调用者“的代码方式来创建对象,这种方式会导致调用者之间的后和兴增加,不利于后期项目的升级维护。
    在使用Spring框架后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制,这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转。
    从Spring容器的角度上看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于调用者注入了它依赖的实例,这就是Spring的依赖注入

1.4.2 依赖注入的实现方式

依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入Bean组件中,其实现方式通常有两种,一种是属性setter方法注入,另一种是构造方法注入

  • 属性setter方法注入:指Spring容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入

  • 构造方法注入:指Spring容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖

  • 在com.itheima.ioc包中,创建接口UserService,编写一个say()方法

package com.itheima.ioc
public interface UserService{
    public void say();
}
  • 在com.itheima.ioc中,创建UserService接口的实现类UserServiceImpl,类中声明UserDao属性,并添加属性的setter方法
package com.itheima.ioc
public class UserServiceImpl implements UserService{
    //声明UserDao属性
    private UserDao userDao;
    //添加UserDao属性的setter方法,用于实现依赖注入
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    //实现接口类中的say方法
    public void say(){
        //调用userDao中的say()方法,并执行输出语句
        this.userDao.say();
        System.out.println("userService say hello World !");
    }
}
  • 在配置文件applicationContext.xml中,创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao的实例注入到userService中
<?xml version="1.0" encoding="UTF-8"?>

<beans  vxmlns="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.itheima.ioc.UserDaoImpl"/>
	<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
		<property name="userDao" ref="userDao"/>
 <!-- ref 的值为第一个bean定义的id就是要用来依赖的bean,name属性在这里则为UserServiceImpl的属性UserDao 定义的对象名称 -->
	</bean>
</beans>
  • 在com.itheima.ioc包中创建测试类TestDI,采用测试单元@Test方法进行测试
package com.itheima.ioc;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
	@Test
	public void DI() {
		//1.初始化spring容器
		ApplicationContext appt = new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.通过容器获取UserService实例
		UserService userService = (UserService)appt.getBean("userService");
		userService.say();
	}
}
  • 采用JUnit Test运行测试程序后提示如下
    image.png

五、总结

初步学习了Spring第一章内容,让我了解了Spring的由来以及强大的应用能力,了解Spring的基本特性,模块和优点,也根据教程写出了第一个spring hello程序。望接下来的时间能够坚持总结和更新博客文章来一步一步提升自己。
(゚д゚)σ弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌弌⊃