一、概述
Spring的核心技术就是IOC和AOP,分别是控制反转和面向切面编程。
IOC(Inversion of Control)控制反转(反转资源获取方向),顾名思义就是
将获取资源的方式转换方向,传统的资源获取需要组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件要做的仅是选择一种合适的方式来接收资源,这种方式也被称为被动的查找形式。
DI(Dependency Injection)依赖注入,也就是IOC的另一种表达方式:即组件以一些预先定义好的方式来接收来自容器的资源注入,相对IOC而言表达形式更加直接了当。
Spring框架,作用是由IOC容器来管理Bean,并且为我们的程序提供bean的实例。
二、Bean的配置
1. 基本配置
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="user" class="edu.spring.ioc.beans.User">
<property name="name" value="张三"></property>
</bean>
</beans>
说明:
- id属性:bean的名称,在ioc容器中,bean的名称是唯一的。
- 如果没有指定id属性,则会把class属性作为bean的名称。
- class属性:类的全限定名(包名+类名)
2. 获取bean
首先通过ClassPathXmlApplicationContext加载XML配置文件创建bean实例工厂,然后通过ClassPathXmlApplicationContext实例的getBean方法获取实例bean。
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("Application.xml");
User user = (User)context.getBean("user");
System.out.println(user.getName());
getBean方法的参数则是在配置bean时的id属性值。
- getBean()参数可以传入配置bean时的id
- getBean()参数可以传入需要获取的bean的类型的class对象
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("Application.xml");
User user = context.getBean(User.class);
System.out.println(user.getName());
注:如果xml中配置了两个相同类型的bean时,使用这种方法则会抛异常
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
三、依赖注入
1. 概述
所谓的依赖注入就是通过配置文件,构造方法等方式向bean的属性中注入值。在spring中依赖注入有三种方式:属性注入、构造方法注入、通过工厂方法注入。
1.1 属性注入
属性注入又称setter方法注入bean的属性值或依赖对象。
属性注入使用 < property >元素,使用name属性指定bean的属性名称,value属性或< value> 子节点指定bean的属性值。属性注入是实际应用中对常用的注入方式。
<bean id="user" class="edu.spring.ioc.beans.User">
<property name="name" value="张三"></property>
</bean>
向user这个bean的name属性注入值“张三”
1.2 构造方法注入
定义类
public class Address {
private String province;
private String city;
private String area;
public Address(String province, String city, String area) {
this.province = province;
this.city = city;
this.area = area;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
}
配置bean
<bean id="address" class="edu.spring.ioc.beans.Address">
<constructor-arg index="0" value="四川省"/>
<constructor-arg index="1" value="成都市"/>
<constructor-arg index="2" value="锦江区"/>
</bean>
注:在配置文件中的 constructor-arg 节点的顺序要和构造方法中参数的顺序一致(设置的参数个数与构造方法中的参数数量一致)
index属性表示构造方法中的参数顺序。
1.3 字面值
字面值:可用字符串表示的值,可以< value>标签或value属性进行注入。
基本数据类型及其封装类、String等类型都可以采用字面值注入的方式,若字面值中包含特殊字符,可以使用< ![CDATA[]]>把字面值包起来。
<bean id="address" class="edu.spring.ioc.beans.Address">
<constructor-arg index="0" value="四川省"/>
<constructor-arg index="1" value="成都市"/>
<constructor-arg index="2">
<value><![CDATA[<锦江区>]]></value>
</constructor-arg>
</bean>
1.4 引用其它bean(ref)
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相 互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用。
在bean的配置文件中,可以通过< ref>元素或ref属性为bean的属性或构造器参数指定引用的bean。
<bean id="address" class="edu.spring.ioc.beans.Address">
<constructor-arg index="0" value="四川省"/>
<constructor-arg index="1" value="成都市"/>
<constructor-arg index="2">
<value><![CDATA[<锦江区>]]></value>
</constructor-arg>
</bean>
<bean id="user" class="edu.spring.ioc.beans.User">
<property name="name" value="张三"></property>
<!-- <property name="address" ref="address"></property> -->
<!-- 或者 -->
<property name="address">
<ref bean="address"></ref>
</property>
</bean>