Spring的核心技术就是IOC和AOP,分别是控制反转和面向切面编程。
IOC(Inversion of Control)控制反转(反转资源获取方向),顾名思义就是
将获取资源的方式转换方向,传统的资源获取需要组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件要做的仅是选择一种合适的方式来接收资源,这种方式也被称为被动的查找形式。
DI(Dependency Injection)依赖注入,也就是IOC的另一种表达方式:即组件以一些预先定义好的方式来接收来自容器的资源注入,相对IOC而言表达形式更加直接了当。
Spring框架,作用是由IOC容器来管理Bean,并且为我们的程序提供bean的实例。
<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>
说明:
首先通过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属性值。
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("Application.xml");
User user = context.getBean(User.class);
System.out.println(user.getName());
注:如果xml中配置了两个相同类型的bean时,使用这种方法则会抛异常
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
所谓的依赖注入就是通过配置文件,构造方法等方式向bean的属性中注入值。在spring中依赖注入有三种方式:属性注入、构造方法注入、通过工厂方法注入。
属性注入又称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属性注入值“张三”
定义类
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属性表示构造方法中的参数顺序。
字面值:可用字符串表示的值,可以< 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>]]>value>
constructor-arg>
bean>
组成应用程序的 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>]]>value>
constructor-arg>
bean>
<bean id="user" class="edu.spring.ioc.beans.User">
<property name="name" value="张三">property>
<property name="address">
<ref bean="address">ref>
property>
bean>