spring学习(一)
spring的核心是IOC和DI,首先要明白IOC和DI的概念。
IOC,即Inverse of Control,反转控制,就是将原本在程序中手动创建service对象的控制权交给spring容器管理,简单的说就是对象的创建权交给了spring容器管理。
DI,即Dependency Injection,依赖注入,在web应用中,action调用service层,service调用dao层,也就是action依赖service,service依赖dao,而在spring容器管理对象时,在创建bean对象的同时,会讲他依赖的对象一起注入。
个人认为,有依赖就会有反转,不使用spring时,action需要service的方法,就自己手动创建,需要什么方法就创建什么方法;使用spring容器管理时,容器中提供了什么方法,你就只能用什么方法。
使用spring管理对象时,spring会将对象依赖的属性一同注入,代码如下:
applicationContext.xml:
<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="userService" class="对象的完整路径类名">
<property name="username" value="admin"/>
</bean>
服务器端:
//1、初始化spring容器
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、 从容器获得需要Bean <bean id="userService" ..>
IUserService service = (IUserService) applicationContext.getBean("userService") ;// 从spring容器得到管理Bean对象
// 3、 调用service中的业务方法
service.login();
</beans>
备注:ApplictionContext接口是BeanFactory接口的子接口
区别:BeanFactory会延迟加载配置文件中的bean对象,当调用getBean时, 才会创建Bean对象;
ApplicationContext会在加载配置文件时,完成Bean对象的创建和注入。
spring依赖注入的方式有两种:1、构造函数依赖注入 2、setter方法注入
1、构造函数依赖注入:
实体类book
public class Book{
private string name;
private double price;
//构造时,将name和price注入car对象
public Book(String name,double price){
super();
this.name=name;
this.price=price;
}
}
applicationComtext.xml
<bean id="book" class="book类的完整路径名">
<constructor-arg index="0" type="java.lang.String" value=“java开发”></constructor-arg>
<constructor-arg index="1" type="double" value="100"></constructor-arg>
</bean>
备注:index="0"表示,第一个参数,index="1",表示第二个参数
2、setter方法注入
public class Book{
private string name;
private double price;
public void setName(String name){
this.name=name;
}
public void setPrice(double price){
this.price=price;
}
}
applicationContext.xml
<bean id="book" class="book的完整路径类名">
//一个property就是一个属性,如果是复杂属性用<property name=" " ref="引用目标bean的id">
<property name="name" value="web 开发"></property>
<property name="price" value="80"></property>
</bean>