当前位置: 首页 > news >正文

Spring入门(一):创建Spring项目

本篇博客作为Spring入门系列的第一篇博客,不会讲解什么是Spring以及Spring的发展史这些太理论的东西,主要讲解下如何使用IntelliJ IDEA创建第一个Spring项目以及通过一个示例讲解下Spring的简单原理。

1.创建Spring项目

IDE:IntelliJ IDEA

1.1新建项目

1.2选择项目类型

如果这里忘记了选择"Create empty spring-config.xml",也可以新建完项目再新建配置文件

1.3确定项目名称及保存路径

因为需要下载Spring依赖的包,因此需要加载一会

新建完的项目结构图如下:

2.Spring简单测试

新建一个Book类,定义两个字段bookName,author和一个实例方法printBookInfo()

public class Book {
    private String bookName;

    private String author;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void printBookInfo() {
        System.out.println("Book Name:" + this.bookName + ",Author:" + this.author);
    }
}
复制代码

如果我们想要输出图书信息,按照传统的方式,需要以下几步:

  1. 创建Book类的实例对象
  2. 设置实例对象的bookName字段和author字段
  3. 调用实例对象的printBookInfo()方法
public class Main {
    public static void main(String[] args) {

        Book book = new Book();
        book.setBookName("平凡的世界");
        book.setAuthor("路遥");

        book.printBookInfo();
    }
}
复制代码

运行结果:

Book Name:平凡的世界,Author:路遥

那么在Spring项目中,如何实现同样的调用呢?

首先,修改spring-config.xml,添加如下配置:

<bean id="book" class="Book">
    <property name="bookName" value="平凡的世界"></property>
    <property name="author" value="路遥"></property>
</bean>
复制代码

然后修改Main的方法为:

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

public class Main {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        Book book = applicationContext.getBean("book", Book.class);
        book.printBookInfo();
    }
}
复制代码

运行结果:

我们会发现,运行结果和传统方式一样,只是多了一些Spring的日志信息。

在以上代码中,我们并未使用new运算符来创建Book类的实例,但是却可以得到Book类的实例,这就是Spring的强大之处,所有类的实例的创建都不需要应用程序自己创建,而是交给Spring容器来创建及管理。

3.Spring简单讲解

虽说实例的创建交给Spring容器来创建及管理,但是在上述的代码中,什么时候创建了Book类的实例并对字段赋值了呢?

为验证这个疑问,我们修改下Book类

public class Book {
    private String bookName;

    private String author;

    public Book(){
        System.out.println(("This is Book constructor."));
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        System.out.println("This is Book setBookName().");
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        System.out.println("This is Book setAuthor().");
        this.author = author;
    }

    public void printBookInfo() {
        System.out.println("Book Name:" + this.bookName + ",Author:" + this.author);
    }
}
复制代码

添加一个Author类

public class Author {
    private String name;

    private int age;

    public Author() {
        System.out.println(("This is Author constructor."));
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("This is Author setName().");
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("This is Author setAge().");
        this.age = age;
    }

    public void printAuthorInfo() {
        System.out.println("Name:" + this.name + ",Age:" + this.age);
    }
}
复制代码

修改下spring-config.xml文件

<bean id="book" class="Book">
    <property name="bookName" value="平凡的世界"></property>
    <property name="author" value="路遥"></property>
</bean>
<bean id="author" class="Author">
    <property name="name" value="路遥"></property>
    <property name="age" value="60"></property>
</bean>
复制代码

最后,我们修改下Main类的代码来Debug下,看下代码的执行顺序

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

public class Main {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");

        Book book = applicationContext.getBean("book", Book.class);
        book.printBookInfo();

        Author author = applicationContext.getBean("author", Author.class);
        author.printAuthorInfo();
    }
}
复制代码

为更直观的展示,请看如下的Gif图

从图中,我们可以看出,在执行完 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");后,控制台先输出了以下内容:

This is Book constructor. This is Book setBookName(). This is Book setAuthor(). This is Author constructor. This is Author setName(). This is Author setAge().

也就是这句代码执行完后,Book类和Author类的实例已经被创建并且字段已经被赋值,接下来的代码只是从Spring容器中获取实例而已。

4.注意事项

获取Bean时,第一个参数(bean name)要与spring-config.xml定义的bean id保持一致,比如我们在spring-config.xml中定义的是book,如果在获取时写的是Book,就会报错

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

public class Main {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");

        // 错误的beanName
        Book book = applicationContext.getBean("Book", Book.class);
        book.printBookInfo();
    }
}
复制代码

报错信息如下:

5.参考链接

【Spring】IntelliJ IDEA搭建Spring环境

idea中Spring项目创建以及实现一个小的IoC案例

6.源码

源码地址:github.com/zwwhnly/spr…,欢迎下载。

转载于:https://juejin.im/post/5c80b0ade51d457cb608986b

相关文章:

  • 如何判断我们的代理ip是高匿
  • Java初学者最佳的学习方法以及会遇到的坑(内含学习资料)!
  • python发送邮件
  • VMware下ubuntu与Windows实现文件共享的方法(zhuan)
  • 接口测试与Postman
  • antiX 17.4 发布,轻量级 Linux 发行版
  • ansible一键部署脚本
  • Android后台任务(HandlerThread、AsyncTask、IntentService)
  • 为什么开发人员必须要了解数据库锁?
  • 前嗅ForeSpider脚本教程:基本语句
  • Redis保证事务一致性,以及常用的数据结构
  • LNMP基础知识及简单搭建(用于个人学习与回顾)
  • Gnu/Linux 链接XServer方法
  • vue中添加favicon.ico
  • 面试篇三
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 08.Android之View事件问题
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • codis proxy处理流程
  • CSS中外联样式表代表的含义
  • exif信息对照
  • Github访问慢解决办法
  • React-flux杂记
  • Redis字符串类型内部编码剖析
  • Solarized Scheme
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • XML已死 ?
  • 机器学习中为什么要做归一化normalization
  • 将回调地狱按在地上摩擦的Promise
  • 目录与文件属性:编写ls
  • 前端学习笔记之观察者模式
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Semaphore
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #pragma 指令
  • (C#)一个最简单的链表类
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (二)WCF的Binding模型
  • (分布式缓存)Redis持久化
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (推荐)叮当——中文语音对话机器人
  • (转)Scala的“=”符号简介
  • (转)大道至简,职场上做人做事做管理
  • (转)四层和七层负载均衡的区别
  • (转载)CentOS查看系统信息|CentOS查看命令