Javaspring 1-6课 基本概念及第一个Javaspring程序

只会前端还是差点事,开坑后端。参照教程为http://c.biancheng.net/spring/

首先Javaspring是一个框架,之前一直没搞明白什么是框架,现在的理解框架就是毛坯房,已经设计好了一些功能,具体的实现需要编程人员来实现,所以编程人员在这里就相当于装修人员,好的房子不仅要建筑坚实,内部装修也是很重要的,所以一个程序要想坚挺,框架要选择功能强大的,同时功能的实现也必须要完善。

Javaspring就是这样一个主流的Java web开发框架,是一个轻量级的应用框架,因其强大的功能以及卓越的性能受到了众多开发人员的喜爱。在实际开发中,通常服务器端采用三层体系架构,分别为表现层(web)、业务逻辑层(service)和持久层(dao)。从设计上看,Spring 框架给予了 Java 程序员更高的自由度,对业界的常见问题也提供了良好的解决方案,因此,在开源社区受到了广泛的欢迎,并且被大部分公司作为 Java 项目开发的首选框架。

Spring框架采用分层架构,根据不同的功能被划分成了许多个模块:
在这里插入图片描述
开发过程中可以根据需要使用不同的模块,这里作为入门者看的是一头雾水,估计以后用到了就能看懂了。

对于Spring的配置,不需要太麻烦,下载好基础jar包放在程序中就可以了,下载可以从网址 http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 下载名称为 springframework-3.2.13.RELEASE-dist.zip 的压缩包,解压后有三个文件夹:
①docs
包含Spring的API文档和开发规范,相当于说明书。
②libs
包含开发需要的JAR包和源码包,我们要做的就是从这里面找出基本的四个JAR包放到项目文件里。
③schema
包含开发所需要的schema文件,在这些文件中定义了Spring相关配置文件的约束。

这个压缩包里,我们需要的是下面四个jar包:
在这里插入图片描述
将这四个包复制出来,还需要一个命令包,这个命令包需要通过网址 http://commons.apache.org/proper/commons-logging/download_logging.cgi 下载
在这里插入图片描述
下载第二个后解压就可以找到commons-logging-1.2.jar,将这个包和前面四个Spring基础包放进项目的lib文件夹里,这个项目的Spring就算是基本配置好了。

Javaspring的一个关键思想就是loC控制反转思想。官方的话是这样介绍的:IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。

我个人的理解就是一般我们写的Java程序,定义一个对象完全是自己程序定义的,定义和使用在本程序之内,而采用loC思想的Javaspring采用对象统一管理,程序不能控制对象,对象是容器管理,而程序只能够通过容器来使用对象。这就好比你找了一个厨师,一般程序可以看做你直接雇了一个厨师,这个厨师只给你办事并且听命于你,而Javaspring则是你加入了一个厨师协会,你想找人给你做饭,就只能联系这个协会,协会可以让厨师来给你做饭,但是这个厨师并不是听你的命令。

Spring提供了两种容器:
①BeanFactory
这是一种基础类型的loC容器,是一个管理Bean的工厂,负责初始化各种B玩,创建实例时需要提供Spring所管理容器的详细配置信息,一般采用XML文件形式管理,加载代码如下:

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

②ApplicationContext
也被称为应用上下文,是BeanFactory的子接口,是其扩展版本,有两个常用的实现类,一个是ClassPathXmlApplicationContext,这个类从类路径中寻找指定的XML配置文件,所以在实例化的时候,不需要写很长的地址,写在类内的地址即可,加载代码如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

另一个是FileSystemXmlApplicationContext,该类从文件系统里面寻找XML文件,所以地址要写从根目录一点一点到XML文件的地址,加载代码如下:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

在使用Spring时,可以使用上面两个方法的任何一个去实例化一个ApplicationContext容器,如果是Java项目会通过第一种方法实例化一个ApplicationContext容器,而在web项目中,容器的实例化工作会交给服务器完成,需要在web.xml文件中进行配置。一般实际开发中也会采用ApplicationContext容器。

下面就利用这些基础知识实现以下Javaspring的第一个程序,首先创建项目,并且导入之前抠出来的五个JAR包,放在lib文件夹下:
在这里插入图片描述
之后再src下创建接口,接口代码如下:

package com.mengma.ioc;

public interface PersonDao {
    
    
    public void add();
}

在eclipse中可以直接用新建接口的方法,能省一点时间是一点,之后再创建一个Java文件去实现这个接口,代码如下:

package com.mengma.ioc;

public class PersonDaoImpl implements PersonDao {
    
    
	@Override
	public void add() {
    
    
        System.out.println("save()执行了...");
	}
}

在这里插入图片描述
在eclipse中可以直接添加接口,搜索你要实现的接口名称,这样创建出来的文件就直接带着实现接口的代码。
之后再sec目录下创建核心配置文件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" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <!-- 由 Spring容器创建该类的实例对象 -->
    <bean id="personDao" class="com.mengma.ioc.PersonDaoImpl" />
</beans>

其中前面几行都是Spring的约束语句,倒数第二行是创建了一个bean,其中id是这个bean的名称,而class是其对应文件的位置。这之后我们就可以利用junit制作一个测试类FirstTest,代码如下:

package com.mengma.ioc;

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

public class FirstTest {
    
    
    @Test
    public void testl() {
    
    
        // 定义Spring配置文件的路径
        String xmlPath = "applicationContext.xml";
        // 初始化Spring容器,加载配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                xmlPath);
        // 通过容器获取personDao实例
        PersonDao personDao = (PersonDao) applicationContext
                .getBean("personDao");
        // 调用 personDao 的 add ()方法
        personDao.add();
    }

}

从这个代码我们可以看出,我们是找容器要了一个对象,而不是我们在程序中自己实例化了一个对象,这就是Javaspring的loC思想。运行结果如下:
在这里插入图片描述
除了控制反转,依赖注入(DI)也是Javaspring的另一个很重要的思想,本质上依赖注入和控制反转是对同一件事的两个不同表达,是从两个角度描述的同一个概念。
当某个Java实例需要另一个Java实例时,传统的方法是由调用者创建被调用者的实例(例如,使用new关键字获得被调用者实例),而使用Spring框架后,被调用者的实例不再由调用者创建,而是由Spring容器创建,这称为控制反转。Spring容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过Spring容器获得被调用者实例,这称为依赖注入。
在这里我个人的理解是如果我在一个Java实例1中要用到另一个Java实例2的方法,那么按照传统的方式,我需要在我的Java实例1中new一个被实例2的对象,利用这个对象来使用其方法,而使用了spring之后,我可以直接从spring容器中得到一个实例1对象,而实例2对象是spring容器注入的,不需要我再单独new。

依赖注入主要有两种实现方式,分别是属性setter注入和构造方法注入。
第一种方法指IoC容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参static工厂方法实例化bean后,调用该bean的setter方法,即可实现基于setter的DI。
第二种方法方法教程上也是一笔带过,大概是不常用。构造方法注入指IoC容器使用构造方法注入被依赖的实例。基于构造器的DI通过调用带参数的构造方法实现,每个参数代表一个依赖。

结合教程的实例代码理解一下。首先要再在前面的代码基础上加一个PersonService的接口,该接口中包含一个addPerson()方法,再用PersonServiceImpl类实现这个接口,代码如下:

package com.mengma.ioc;
public interface PersonService {
    
    
    public void addPerson();
}
package com.mengma.ioc;
public class PersonServiceImpl implements PersonService {
    
    
    // 定义接口声明
    private PersonDao personDao;
    // 提供set()方法,用于依赖注入
    public void setPersonDao(PersonDao personDao) {
    
    
        this.personDao = personDao;
    }
    // 实现PersonService接口的方法
    @Override
    public void addPerson() {
    
    
        personDao.add(); // 调用PersonDao中的add()方法
        System.out.println("addPerson()执行了...");
    }
}

这里所谓的setter方法,就是一个构造函数,可以看到实现接口的代码中,只声明了PersonDao对象,但是并没有实例化,按照一般的Java编程思想,这里是要new一下的,所以这里实例化的方法是用了依赖注入,通过set方法,给这个定义实例化。
接下来就要修改XML文件了,在原来的基础上增加这样一句:

<bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
    <!-- 将personDao实例注入personService实例中 -->
    <property name="personDao" ref="personDao"/>
</bean>

和之前不一样的是,这里在bean标签内新增了一段,这一句起的作用,就是将一个personDao实例注入到personService实例中,其中name是相应的setter方法,这里试了很久终于搞明白是什么意思了,这个名字在前面加上set就是personServiceImpl类里面的构造方法,这两个必须是一一对应的。
编写测试用的junit代码:

@Test
public void test2() {
    
    
    // 定义Spring配置文件的路径
    String xmlPath = "applicationContext.xml";
    // 初始化Spring容器,加载配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
            xmlPath);
    // 通过容器获取personService实例
    PersonService personService = (PersonService) applicationContext
            .getBean("personService");
    // 调用personService的addPerson()方法
    personService.addPerson();
}

运行后得到结果如下:
在这里插入图片描述
所以这里的第一句并不是我们实例化的结果,而是spring容器将personDao对象注入了personService对象,我们利用spring容器得到了personService对象,进而利用这个对象调用了save()。

作为Javaspring最重要的两个思想,一定要理解透彻。这样第一个Javaspring程序就算是成功了,开坑有点多,一边是Javaspring一边是jQuery,还有服务器和复试,少说多做事,自己做了什么不用和别人全盘托出。

猜你喜欢

转载自blog.csdn.net/weixin_43849505/article/details/113838358
今日推荐