Spring是一个分层的一站式轻量级开源框架,它的核心是IOC(控制反转)以及AOP,面向切面编程;javaEE开发的三个阶段:web层(JSP,Struts2),业务层(Javabean)以及持久层(Dao,Hibernate)。
为什么要学习Spring?Spring是一个大的工厂,同样可以把它理解成为一个大的对象容器,它的里面可以存放许多的对象,这些对象可以包含各种功能,它的最强大之处就是可以实现和其他优秀框架的整合;
关于IOC和DI:
IOC:控制反转,所谓的控制反转就是创建对象的方式不同而已,以前写一个程序,创建对象都是由我们的开发人员来完成,包括依赖的注入也是我们自己去完成,使用了Spring之后,对象的创建和依赖都由Spring独自完成。
DI:依赖注入,实现IOC需要DI的支持
注入的方式分为:set方法注入,构造方法注入,字段注入
注入类型:值类型,引用类型
首先我们创建一个比较简单的Spring入门项目:IDE使用eclipse
下载Spring的开发包:http://repo.springsource.org/libs-release-local/org/springframework/spring
第一步:创建一个web项目,命名为SpringDay01;
第二步:导入jar包(开发包中解压获取);
第三步:创建一个简单的实体User类
public class User {
private String name;
private Integer age;
public User(String name,Integer age) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
导入约束:第一步:从功能栏中选择window —>preferences
之后在src目录下创建一个ApplicationContext.xml文件,输入<beans></beans>,点击下方的design;右键 Edit Namespaces;先直接添加一个xsi,之后再add newNameSpace,下第三行选框中选择自己刚才导入的约束,第二行上面将不带名称的约束进行复制粘贴进行即可;
约束导入成功显示如下图:
接下来我们需要书写xml中的配置,如下图:
书写测试类检测Spring是否创建了User对象:
控制台打印输出为:
关于BeanFactory&ApplicationContext
BeanFactory是最原始的接口,针对原始接口的功能比较单一;
BeanFactory接口实现类的容器,每次getBean时才会去创建对象
ApplicationContext:算是后来从BeanFactory发展的一个接口,它的特点是每次容器启动时就会创建所有的对象,并且提供更多的功能;关于ApplicationContext有两种形式,一种是通过从类路径下加载配置文件ClassPathXmlApplicationContext(“默认是src下的xml文件”),另一种是通过硬盘的绝对位置加载配置文件FileSystemXmlApplicationContext(“文件存放的绝对位置”)
二者相比之后的结论:在web开发的过程中使用ApplicationContext,在资源环境比较缺乏的时候使用BeanFactory。
关于Bean元素的配置:
<bean name="user" class="com.bean.User"></bean>
Class属性中是被管理对象完整类名,name属性是给被管理的对象起一个名字,获取对象时根据该名称进行获取;name属性可以重复,可以含有特殊字符。
Spring中三种对象创建方式:
第一种空参构造(默认):
public class User { private String name; private int age; public User() { System.out.println("空的构造方法创建对象!"); } 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 class UserFactory { public static User createFactory() { System.out.println("静态工厂的方式创建对象!"); return new User(); } } |
Bean中配置如下:
利用UserFactoy中的createFactory来创建名为user02的对象;
第三种:利用实例工厂创建
所谓的利用实例工厂方式,就是在类中所调用的某一个用来创建对象的那个方法不是静态的,不能够再像静态工厂那样利用类名进行调用啦,而是通过实例工厂对象来创建我们需要去管理的对象,具体实现如下:
public class UserFactory { public User createFactory02() { System.out.println("实例工厂的方式创建对象!"); return new User(); } } |
Bean中的配置如下:
关于scope属性:
scope="singleton"(默认值)单例对象,被标识为单例的对象在Spring容器中只会存在一个实例;一般情况下都是使用单例对象,但是在于Struct2整合的时候,ActionBean必须配置为多例的,即为prototype值
scope="prototype"多例原型,被标识为多例对象,每次再获得才会创建,每次创建都是新的对象。
初始化以及销毁方法:
init-method="init" :初始化方法,Spring会在对象创建之后调用它
public void init() { System.out.println("我是初始化方法!"); } |
destroy-method="destory":销毁方法,Spring容器在关闭并且销毁所有容器中的对象之前调用它。
public void destory() { System.out.println("我是销毁方法!"); } |
关于模块化配置:
关于属性注入:
值类型注入:值类型注入就是单纯的为某一个属性进行值的设置,如:
引用类型注入:利用引用的方式注入
总结:值类型注入使用value属性,引用类型注入使用ref属性,传入的是一个对象;
关于构造函数注入:
Name、value以及ref属性和之前学些的一样,就是多了index以及type属性;对于index属性可以对于public User(String name,Car car)和public User(Car car,String name)构造方法,由于参数位置不同,我们可以通过index来决定哪一个在前,哪一个在后面;对于type属性,是关于public User(String name,Car car)以及public User(Integer name,Car car)类型不同所引发的问题;这几个属性的使用,可以精确地定位到某一个构造函数,可以实现更好的注入;
P空间注入:实质上还是利用了set注入;
后面的bean标签中依赖注入可以写为:
SPEL注入:Spring 表达式语言
注意在对象注入的过程中是不能够利用Spring表达式语言进行书写的;
关于复杂类型注入:
package com.bean; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; public class CollectionBean { private Object[] arr;//数组类型注入 private Map map;//map类型注入 private List list;//list类型注入 private Properties prop; public Object[] getArr() { return arr; } public void setArr(Object[] arr) { this.arr = arr; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Properties getProp() { return prop; } public void setProp(Properties prop) { this.prop = prop; } @Override public String toString() { return "CollectionBean [arr=" + Arrays.toString(arr) + ", map=" + map + ", list=" + list + ", prop=" + prop + "]"; } } |