大数据、Java EE 学习资料请关注 B 站:https://space.bilibili.com/204792350

使用 maven 构建 spring 环境 - 一个简单 example

使用 Maven 构建 Spring 环境

从 spring 的手册看来,一个最基本的 spring 项目,需要包含五个 jar 包。分别是:spring-beans、spring-core、spring-context、spring-expression、commons-logging。

可以看到,需要用到的 spring 本身的包有四个,core 是核心包,beans 和 expression 依赖 core,而 context 的依赖除前面三个外,还有 spring-aop。除了 spring 本身的包之外,可以看到,还有 commons-logging 包,这个包是用于输出信息使用的,而且是 spring 唯一的强制依赖,被 core jar 依赖。

通过它们的之间的依赖关系,不难发现,依赖最多的是 context 包,就这种情况来看,若是使用一个构建工具,只需要加载这个 context jar 即可,构建工具会自动处理它们之间的依赖管理,不论直接依赖还是间接依赖。

使用 maven 构建

<dependencies>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>4.0.0.RELEASE</version>
	</dependency>
</dependencies>

上面简简单单的一段 xml 自定义标签,那么 maven 是如何通过这个加载依赖的呢?

先从上面来解析一些它们的含义:

  • dependencies:声明一组依赖,这个标签是包含多个依赖关系。
  • dependency:声明依赖,其中包含依赖的坐标。
  • groupId:组id,通常是域名倒着写。
  • artifactId:项目名称。
    • spring 命名规范为: spring-*
  • version:版本号。
    • 版本号为:*.*.*.RELEASE。

通过一组坐标,就可以从远程仓库中找到这个依赖的,并且自动处理依赖的依赖。当然优先从本地参数检索,一般首次会从远程仓库中加载。依赖就这样的被加载了,不用手动去处理其它操作,对于 example 来说,通过简单的元数据配置,就可以使用 spring 提供功能。

XML 配置

spring 依赖加载之后,还需要元数据配置的支持,这些配置描述 spring 如何工作。

元数据有几种:

  • xml 格式
  • Java annotaion
  • Java code

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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<beans id="HelloWorld" class="com.huasio.spring.HelloWorld">
		<property name="name" value="huasio" />
	</beans>
</beans>

HelloWorld 类:

@Component("helloWorld")
/**
 * Autowired
 * Qualifile
 */
public class HelloWorld {
    private String name;

    public HelloWorld() {
    }

    public HelloWorld(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void sayHello() {
        System.out.println("hello " + this.name);
    }
}

接下来通过一个 test 来看看效果

public class SpringTest {
	public void test() {
		ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
		HelloWorld helloWorld = ioc.getBean("helloWorld", HelloWorld.class);
		System.out.println(helloWorld.sayHello("spring"));
	}
}

若是程序运行正常,这个小栗子不出意料会输出: “hello spring”。

spring 是如何加载 HelloWorld 对象的呢?

在 applicationContext.xml 配置文件中,以一个 bean 标签配置了 HelloWorld,bean 标签的作用就是配置对象。然后在 ClassPathXmlApplicationContext 对象,加载这个配置文件,spring ioc 容器就可以管理配置的对象。

有几点需要注意的:

  1. POJO 对象需要符和规范,也就是get/set 方法都有。spring 赋值的时候通过 setXxx() 赋值,而不是属性。
  2. bean 中的 id 标识着当前 bean,并且在 ioc 容器中是唯一的。
  3. class 的值为 POJO 的全类名。

一个简单的 spring example 就是这样。

注解

上面的方式是使用 xml 文件的配置方式,这样的方式比较繁琐,需要配置大量的 bean 标签。所以可以通过在 xml 通过一点点配置,来开启其它配置方式。

Java annotaion 本身没有作用,学过反射都知道,Java 中可以通过反射来获取注解。而 spring 中,就是基于这种技术,来赋予了注解的功能。

在 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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 扫描包的范围 -->
	<context:component-scan base-package="com.huasio.spring" />
</beans>

上面的配置就是设置了,spring 将扫描的范围,扫描的内容其中就包含:注解。

当然,可能会有疑问,spring 怎么知道哪些类需要被加载呢?注解是什么注解?

上面有两个问题,可以归纳为一个。spring context 提供了几个注解,来标识不同的类。

  • @Component
    • 基础组件,其它三个注解继承该注解。
    • 可以修饰一些没有特殊作用的 POJO。
  • @Controller
    • 控制层注解,在 spring 没有特殊作用。
    • 在 SpringMVC 中代表着控制层
  • @Service
    • 服务层,注解一些编写业务逻辑的类。
  • @Repository
    • 数据层注解,一般使用在 DAO 类。

当然,这个几个注解本身都一样,没有区别,可能唯一的区别就是表明这个类是什么作用,这个标识是给自己看的。

上面那句话是在没有配置情况下,spring 赋予了注解的作用,在配置文件中,只要配置了扫描包的位置,然后通过这几个注解来确定需要加载的类。

一个简单的 example:

@Component
public class HelloWorld {
    private String name;

    public HelloWorld() {
    }

    public HelloWorld(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("hello " + this.name);
    }
}

就这样,同样通过上面的 test 方法,可以获取相同的打印结果。

使用注解的方式,bean 的 id 若是没有显式指定,那么 id 将是类名的首字母小写。可以通过给注解 value 赋值,来指定 id。

同样的方式,使用注解在操作上,明显很简洁。而 xml 需要配置大量的 bean 标签来满足 spring ioc 管理 POJO。当然,每种方式都各有优缺点,xml 在不接触 source code 情况可以修改配置。而 annotaion 方式从很明显,很简洁,操作上面省去繁杂的配置。

两种方式可以共存,使用方式取决于自身或者项目需要。

更多的资料还是要看文档,介绍了各种注解。

在文章末尾有标注文档的具体文档位置。

相关链接

# Java   Maven   Spring   框架  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×