Spring的开发环境搭建

Spring是一个eclipse插件,它替代了原有的EJB开发模式,简化了开发过程,是一企业级软件开发工具。

Jar包的配置

为了使用Spring,我们需要加载一些Spring所依赖的jar包。通过maven的pom.xml文件我们可以很自动地加载这些jar包。
其中包括spring-beans,spring-context,spring-core和spring-expression

<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>5.2.0.RELEASE</version>
	</dependency>
	    
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-core</artifactId>
	    <version>5.2.0.RELEASE</version>
	</dependency>
	    
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-beans</artifactId>
	    <version>5.2.0.RELEASE</version>
	</dependency>
	    
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-expression</artifactId>
	    <version>5.2.0.RELEASE</version>
	</dependency>

XML的配置

为了应用这些jar包,我们需要新建一个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>

此后我们的很多操作将在这个xml文件中进行。
同时Spring提供了很多的工具也将通过这个xml文件配置并使用。

Bean的创建及依赖注入

在原Java中,我们通常需要通过new关键字构造方法实例化对象。例如:

Apple apple = new Apple();

而Spring提供了一个IOC容器存放Bean节点,再通过调用容器来实例化Bean对象。当我们需要实例化大量对象时,这种方法会非常便利。虽然现在还没怎么好用。

Bean的创建

  • 创建目标class,设置对应属性及方法;
  • 在applicationContext.xml中配置目标class的Bean;
  • 实例化目标Bean;
<bean id="apple" class="com.zzxtit.factory.Apple"></bean>
<!-- XML中配置Apple的Bean
	注意:  id:不允许重复  class:全类名=包名+类名 
-->
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
Apple apple = ioc.getBean("apple", Apple.class);
//实例化IOC容器并通过IOC容器实例化Apple对象
  • 在IOC容器中的Bean对象具有生命周期,在对象实例化时,可以通过Bean的申明中设置init-method和destroy-method方法,调用class中的方法,为Bean对象设置初始化和销毁时所要执行的指令。
package com.zzxtit.factory;

public class Apple {

	public void initApple() {
		System.out.println("Apple has been instantiated!");
	}

	public void destroyApple() {
		System.out.println("Apple has been destroyed!");
	}
}
<bean id="apple" class="com.zzxtit.factory.Apple" init-method="initApple" destroy-method="destroyApple"></bean>
  • 在实例化Bean对象时,我们发现当默认实例化同一Bean出来的对象是相等的。在bean标签的scope属性可以控制Bean实例化的作用域。
<bean id="apple" class="com.zzxtit.factory.Apple" scope="prototype"></bean>

scope

说明

Singleton

IOC容器中只允许一个对象实例。(默认为此方法)

Prototype

每次从IOC容器中获取对象时都是新对象。

Request

HTTP请求时创建新Bean。(只适用于WebApplicationContext)

Session

HTTP会话时创建新Bean。(只适用于WebApplicationContext)

Bean的依赖注入

依赖注入即通过xml文件的配置,在实例化的Bean时实现属性的注入。
该方法优点在于可以避开硬编码,直接控制所有从IOC容器中获取的对象的属性。

属性注入

通过property标签配置属性。

<bean id="apple" class="com.zzxtit.factory.Apple">
		<property name="Species" value="![CDATA[<Red Fuji>]]"></property>
		
		<property name="originPlace">
			<value>China</value>
		</property>
    	
    	<property name="appleCore" ref="appleCore"></property>
    	<!-- 内部类Bean -->
    	<property name="Time">
			<bean class="com.zzxtit.factory.Time">
				<property name="manufacture" value="191106"></property>
			</bean>
		</property>
	
	</bean>   
    
    <bean id="appleCore" class="com.zzxtit.factory.AppleCore"></bean>
    <!--
		基本类型通过value直接注入属性值。
		若所注入属性包含特殊字符,可通过<![CDATA[]]>将其包围。
		非基本类型的注入需要先配置被注入类型的Bean并通过ref注入。
		注意:Bean不分先后顺序。
	-->

构造器注入

通过class中设置的构造器类型或者次序注入属性。

<bean id="fruits" class="com.zzxtit.factory.Fruits">
    	<constructor-arg type="String" value="fruits"></constructor-arg>
    	<constructor-arg type="com.zzxtit.factory.Apple" ref="apple"></constructor-arg>
    	<constructor-arg type="com.zzxtit.factory.Orange" ref="orange"></constructor-arg>
    </bean>
    
	<bean id="fruits" class="com.zzxtit.factory.Fruits">
    	<constructor-arg index="0" value="fruits"></constructor-arg>
    	<constructor-arg index="1" ref="apple"></constructor-arg>
    	<constructor-arg index="2" ref="orange"></constructor-arg>
    </bean>

集合注入

Spring可以方便直接注入List、Map、Set、Prop等。

<bean id="pear" class="com.zzxtit.factory.Pear" >
    	<property name="kindsList">
    		<list>
    			<value>鸭梨</value>
    			<value>雪花梨</value>
    			<value>五九香梨</value>
    		</list>
    	</property>
    	
    	<property name="kindsSet">
    		<set>
    			<value>鸭梨</value>
    			<value>鸭梨</value>
    			<value>五九香梨</value>
    		</set>
    	</property>
    	
    	<property name="kindsMap">
    		<map>
    			<entry key="鸭梨" value="50"></entry>
    			<entry key="五九香梨" value="120"></entry>
    			<entry key="雪花梨" value="150"></entry>
    		</map>
    	</property>
    	
    	<property name="kindsProp">
    		<props>
    			<prop key="鸭梨">450</prop>
    			<prop key="鸭梨">350</prop>
    			<prop key="鸭梨">250</prop>
    			<prop key="鸭梨">150</prop>
    			<prop key="五九香梨">350</prop>
    			<prop key="雪花梨">250</prop>
    		</props>
    	</property>
    </bean>

当被注入对象需要复用时,我们可以将其注册成Bean,再注入。
Spring提供了util工具,方便我们复用注入集合。首先应在xml中应用util依赖。

<beans xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
 		....
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.xsd">  
</beans>
<util:list id="kindsListUtil" list-class="java.util.ArrayList">
    	<value>鸭梨</value>
    	<value>鸭梨</value>
    	<value>雪花梨</value>
    	<value>五九香梨</value>
    </util:list>
	<bean id="pear" class="com.zzxtit.factory.Pear">
    	<property name="kindsList" ref="kindsListUtil"></property>	
    </bean>

Bean的继承

Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的。

<bean id="orange" class="com.zzxtit.factory.Orange">
    	<property name="kinds" value="orange"></property>
    	<property name="from" value="HuangYan"></property>
    </bean>    
    
    <bean id="bigOrange" parent="orange">
    	<property name="kinds" value="bigOrange"></property>
    </bean>
    
    <bean id="smallOrange" parent="orange" p:kinds="smallOrange" p:from="HuangYan"></bean>

p命名空间

当越来越多的属性需要注入时,XML文件的配置也显得臃肿。从Spring2.5开始引入了p命名空间,简化了属性注入,进一步简化XML的配置。

<beans xmlns:p="http://www.springframework.org/schema/p"></beans>
<!--配置p命名空间所需的依赖 -->
<bean id="apple" class="com.zzxtit.factory.Apple" p:Species="RedFuji" p:originPlace="China"></bean>

引用外部文件注入

Spring可以通过${}提取外部文件的内容注入Bean中
例如在新建的fruits.properties文件中配置

fruit-apple=富士山苹果
fruit-orange=黄岩蜜桔
fruits-bigOrange=${fruit-orange}

那么在xml中即可直接配置

<context:property-placeholder location="fruits.properties" />
    <bean id="staticFruitBean" class="com.zzxtit.factory.StaticFruitInfo" p:Apple="${fruit-apple}">
    	<property name="Orange" value="${fruit-orange}"></property>
    </bean>

SpEl工具

为了实现更加灵活的注入,Spring内置SpEL工具,由#{ }构成,可以引用Bean的属性与方法。

<bean id="apple" class="com.zzxtit.factory.Apple">
    	<property name="appleCoreColor" ref="#{appleCore.Color}"></property>
    	<property name="appleCoreSize" value="#{appleCore.getSize()}"></property>
    </bean>   
    
    <bean id="appleCore" class="com.zzxtit.factory.AppleCore"></bean>

SpEl同时支持许多数学运算符、逻辑运算符和关系运算符。

运算符

内容

数学运算符

等于 (==, eq),不等于 (!=, ne),小于 (<, lt),小于等于(<= , le),大于(>, gt),大于等于 (>=, ge)

逻辑运算符

and,or,not,&&,!

关系运算符

加 (+),减 (-),乘 (*),除 (/),取模 (%),幂指数 (^)

条件运算符

(a>b)?true:false

classPath自动扫描与自动装配

Spring通过自动扫描的方式,扫描指定包内带指定注释的类,并自动生成Bean。
特定的注释包括

注释

用途

@Component

基本组件

@Repository

常用于Dao层

@Service

常用于Service层

@Controller

常用于控制层

@AutoWired注解可以在IOC容器中寻找类型匹配的Bean并自动装配到被注释Bean的某个属性,若无成功匹配Bean或成功匹配到多个Bean,则抛出异常。@AutoWired注解可以注解至set方法上。
@Qualifier() 注解可以手动指定配置Bean的某个属性。

@Service
public class UserService {

	@Autowired
	@Qualifier("LUserDao") 
	private LUserDao luDao;
	
	private HUserDao huDao;

	public LUserDao getLuDao() {
		return luDao;
	}

	public void setLuDao(LUserDao luDao) {
		this.luDao = luDao;
	}

	public HUserDao getHuDao() {
		return huDao;
	}

	@Autowired
	public void setHuDao(HUserDao huDao) {
		this.huDao = huDao;
	}	
}
<!--扫描方法: -->
<context:component-scan base-package="com.zzxtit.auto"></context:component-scan>

Summary

软磨硬泡终于完结了第一篇Blogger笔记。虽然内容空洞,语句不畅,情感不真,如有错误,多多包涵。小白在这里给您拜年了。 细数着寥寥无几的头发,满是沧桑,当代大学生的苦逼日常,都是命a。