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。