@mritd
2016-01-02T05:49:24.000000Z
字数 6985
阅读 1618
Spring
Mavne java
项目,POM
加入Spring Context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
Java Bean
package me.mritd.beans;
public class Persion {
private String name;
private int age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Persion [name=" + name + ", age=" + age + ", address=" + address + "]";
}
public Persion() {
super();
// TODO Auto-generated constructor stub
}
public Persion(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
}
Spring
配置文件 applicationContext.xml
,并配置 Bean
信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="persion" name="persion" class="me.mritd.beans.Persion">
<property name="name" value="Hello World"></property>
<property name="age" value="20"></property>
<property name="address" value="伊拉克"></property>
</bean>
</beans>
package me.mritd.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import me.mritd.beans.Persion;
/**
*
* Copyright © 2016 Mritd. All rights reserved.
*
* @ClassName: Test1
* @Description: TODO
* @author: 漠然
* @date: 2016年1月1日 下午8:59:14
*/
public class Test1 {
@Test
public void testHelloWorld(){
// 创建ApplicationContext
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从上下文获取 persion Bean
Persion persion = (Persion) applicationContext.getBean("persion");
// 查看获取的Persion
System.out.println(persion);
}
}
IOC(Inversion of Control)
:其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了IOC
之后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式DI(Dependency Injection)
-IOC
的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于IOC
而言,这种表述更直接。
Spring通过在xml配置文件中的
<bean>
节点来配置放入IOC容器中的bean;
<bean id="persion" name="persion" class="me.mritd.beans.Persion">
<property name="name" value="Hello World"></property>
<property name="age" value="20"></property>
<property name="address" value="伊拉克"></property>
</bean>
- id: IOC容器中Bean的ID
- 在 IOC 容器中必须是唯一的
- 若 id 没有指定,Spring 自动 将全限定性类名 作为 Bean 的名字
- id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔
在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前,必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用;Spring 提供了 两种类型 的 IOC 容器实现:
- BeanFactory: IOC 容器的基本实现.
- ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory
是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext
面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用ApplicationContext
而非底层的BeanFactory
;无论使用何种方式,配置文件时相同的. ApplicationContext UML 图示例如下
ApplicationContext 的主要实现类:
- ClassPathXmlApplicationContext:从 类路径下加载配置文件
- FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:
refresh()
和close()
, 让 ApplicationContext 具有启动、刷新和关闭上下文的能力ApplicationContext 在初始化上下文时就实例化所有单例的 Bean
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作
3、Spring IOC/DI 注入方式:
通过Set方法注入,使用标签设置,name属性指定属性名,value指定属性值
通过有参构造器进行注入,使用 标签,构造器注入既可以按照索引注入,也可是按照参数类型注入:
按索引匹配注入
<!-- 构造器注入(索引方式) -->
<bean id="persion" name="persion" class="me.mritd.beans.Persion">
<constructor-arg value="zhangsan" index="0"></constructor-arg>
<constructor-arg value="10" index="1"></constructor-arg>
<constructor-arg value="伊拉克" index="2"></constructor-arg>
</bean>
按类型匹配注入
<!-- 构造器注入(按照类型) -->
<bean id="persion1" name="persion1" class="me.mritd.beans.Persion">
<constructor-arg value="zhangsan1" type="java.lang.String"></constructor-arg>
<constructor-arg value="11" type="java.lang.Integer"></constructor-arg>
<constructor-arg value="伊拉克1" type="java.lang.String"></constructor-arg>
</bean>
工厂方法注入(很少使用,不推荐)
4、Sping bean 引用其他 bean 配置
首先定义两个
Java Bean
package me.mritd.beans;
/**
*
* Copyright © 2016 Mritd. All rights reserved.
*
* @ClassName: Car
* @Description: TODO
* @author: 漠然
* @date: 2016年1月2日 上午1:09:46
*/
public class Car {
private String carName;
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
@Override
public String toString() {
return "Car [carName=" + carName + "]";
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
public Car(String carName) {
super();
this.carName = carName;
}
}
package me.mritd.beans;
/**
*
* Copyright © 2016 Mritd. All rights reserved.
*
* @ClassName: Persion
* @Description: TODO
* @author: 漠然
* @date: 2016年1月2日 上午1:11:21
*/
public class Persion {
private String name;
private int age;
private String address;
private Car car;
@Override
public String toString() {
return "Persion [name=" + name + ", age=" + age + ", address=" + address + ", car=" + car + "]";
}
public Persion() {
super();
// TODO Auto-generated constructor stub
}
public Persion(String name, int age, String address, Car car) {
super();
this.name = name;
this.age = age;
this.address = address;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
配置 Bean 引用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 首先定义没有引用的 Bean -->
<bean id="car" class="me.mritd.beans.Car">
<property name="carName" value="四个圈"></property>
</bean>
<bean id="persion" name="persion" class="me.mritd.beans.Persion">
<!-- 采用构造器注入(索引位置)的方式 -->
<constructor-arg index="0" value="zhangsan"></constructor-arg>
<constructor-arg index="1" value="10"></constructor-arg>
<!-- 显示指定 某个属性值为null 使用 <null/>标签 -->
<constructor-arg index="2"><null/></constructor-arg>
<!-- 使用 ref 属性指定 引用 Bean -->
<constructor-arg index="3" ref="car"></constructor-arg>
</bean>
<bean id="persion1" name="persion1" class="me.mritd.beans.Persion">
<!-- 采用属性注入 -->
<property name="name" value="zhangsan1"></property>
<property name="age" value="11"></property>
<property name="address" value="伊拉克"></property>
<property name="car" ref="car"></property>
</bean>
</beans>
测试获取两个 Persion Bean,打印里面的 Car
package me.mritd.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import me.mritd.beans.Persion;
/**
*
* Copyright © 2016 Mritd. All rights reserved.
*
* @ClassName: Test2
* @Description: TODO
* @author: 漠然
* @date: 2016年1月2日 上午1:20:49
*/
public class Test2 {
@Test
public void test2(){
// 创建 ApplicationContext
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取Bean 测试
Persion persion = (Persion) applicationContext.getBean("persion");
Persion persion1 = (Persion) applicationContext.getBean("persion1");
System.out.println(persion);
System.out.println(persion1);
}
}