Spring----初识spring第一弹
spring是我接触的第一个框架,看完一遍视频之后,还是有点懵懵懂懂,想写下来整理一下自己的思路。
以下正文
EE开发分成三层结构:
| WEB | Service | Dao | |
| 常用框架 | struts2+jsp | JavaBean | Hibernate |
| spring使用范围 | Spring MVC | Bean管理(IOC) | Spring的JDBC模板。ORM模板用于整合其他的持久层框架 |
一、介绍spring
spring负责管理项目中的所有对象,属于容器性质的,容器中装什么对象就有什么功能,spring不仅不排斥各种优秀的开源框架,它还提供了很多对各种优秀框架的直接支持,可以帮助其他框架管理对象。【简单的说spring是 一个分层的JavaSE/EE full-stack(一站式)轻量级(根据依赖的环境)开源框架。spring的核心是控制反转(IOC)和面向切面(AOP)。】
- AOP支持
- IOC思想
- spring jdbc
- AOP事务
- junit测试支持
二、spring的概念
思想:
- IOC:控制反转(Inverse Of Control)
反转了对象的创建方式,从我们自己创建反转成程序创建 - DI:依赖注入(Dependency Injection)
实现IOC思想需要DI做支持
注入方式:
set方法注入
构造方法注入
字段注入
注入类型:
值类型注入(8大基本数据类型)
引用类型注入(将依赖对象注入) - ApplicationContext & BeanFactory
BeanFactory接口:
是spring的原始接口,针对原始接口的实现类功能较为单一
BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象
ApplicationContext:
每次容器启动时就会创建容器中配置的所有对象,并提供更多的功能
结论:在web开发中,使用applicationContext,在资源匮乏的环境中可以使用BeanFactory。
三、搭建spring
新建一个Dynamic Web Project
- 导包
将下载的spring框架的压缩包解压,以(spring-framework-4.2.4.RELEASE)这个版本为例。打开libs目录,找到需要导入的包进行复制,粘贴在自己工程目录下的lib目录下(WebContent->WEB-INF->lib)。注:解压目录中,docs是文档,libs里是jar包,schema是约束文件。根据下图寻找需要导入的包。![]()
- 创建对象
目的:让spring装起来。
新建一个User.java文件
package bean; public class User { private String name; private Integer age; 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; } }
- 书写配置,注册对象到容器中。
1)在src目录下新建一个applicationContext.xml文件。注意:配置文件位置任意(建议放到src目录下),文件名任意(建议取名applicationContext)
2)导入约束:
Window->Preferences->XML Catalog;选择Add,点File System...选择schema目录下的beans里面的最新版的一个约束。
在Keytype中选择Schema location,在Key的位置加一个斜杠,把Location最后的文件名粘过来:http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
在配置文件的Source下写入<beans></beans>(根元素)
切换到Design视图,选择beans右键Edit Namespaces,点击ADD,先插入一个xsi文件,ok退出;选择Specify New Namespace->Browse->Select XML Catalog entry,找到自己之前导入的约束;在Namespace Name里填入不包含文件名的部分;![]()
![]()
显示以下界面就表明成功了![]()
3)将User对象交给spring容器管理
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 将User对象交给spring容器管理 -->
<!-- bean元素:使用该元素描述需要spring管理的对象 name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象
class属性:被管理对象的完整类名 --> <bean name="user" class="bean.User"></bean> </beans> - 代码测试
新建一个测试类Demo|
package test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import bean.User; public class Demo { @Test //ctrl+1 public void fun1() { //1、创建容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //2、向容器要User对象 User u = (User) ac.getBean("user"); //3、打印User对象 System.out.println(u); } }
运行如下结果表示成功!!!

四、配置
- Bean元素详解
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 将User对象交给spring容器管理 --> <!-- bean元素:使用该元素描述需要spring管理的对象 class属性:被管理对象的完整类名 name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象(名称可以重复,可以使用特殊字符,更灵活) id属性:与name属性一模一样(规范:名称不能重复,不可以使用特殊字符) 尽量使用name属性 --> <bean name="user" class="bean.User"></bean> </beans>
- spring三种对象创建方式
1)空参构造
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 方式1:空参构造 为了方便看得清,在User类里创建一个显示的空参构造; public User() { System.out.println("hi! 我是空参构造!!!"); } --> <bean name="user" class="bean.User"></bean> </beans>
![]()
2)静态工厂构造
新建一个静态的工厂类package create; import bean.User; public class User_createUser { public static User createUser(){ System.out.println("静态工厂创建User"); return new User(); } }
配置applicationContext文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 方式2:静态工厂构造 调用UserFactory的createUser方法创建名为user_create的方法放入容器 --> <bean name="user_create" class="create.User_createUser" factory-method="createUser"></bean> </beans>
Demo类
package test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import bean.User; public class Demo { @Test //ctrl+1 public void fun1() { //1、创建容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //2、向容器要User对象 User u = (User) ac.getBean("user_create"); //3、打印User对象 System.out.println(u); } }
![]()
3)实例工厂构造
修改静态工厂类(注意观察和静态工厂类有什么不同)package create; import bean.User; public class User_createUser { public User createUser(){ System.out.println("实例工厂创建User"); return new User(); } }
配置applicationContext文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 方式3:实例工厂构造 先配置一个工厂对象UserFactory 调用UserFactory对象的createUser方法创建名为user_create的对象,放入容器 --> <bean name="user_create" factory-bean="userFactory" factory-method="createUser"></bean> <bean name="userFactory" class="create.User_createUser" ></bean> </beans>
Demo文件和静态工厂类一样;结果:
![]()
- scope属性
scope属性取值有四种,
singleton(默认值):单例对象,被标识为单例的对象在spring容器中只会存在一个实例(大部分情况使用该属性);
prototype:多例原型,被标识为多例的对象,每次再获得才会创建,每次创建的都是新的对象(与struts2整合的时候,ActionBean必须配置为多例);
request:web环境下,对象与request生命周期一致;
session:web环境下,对象与session生命周期一致; - 初始化和销毁
init-method:配置一个方法作为生命周期初始化方法,spring会在对象创建之后立即调用;(演示该属性要在User.java里写两个方法,init(){} 和 destory(){})
destory-method:配置一个方法作为生命周期的销毁方法,spring容器在关闭前销毁所有容器中对象调用; - 模块化配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <bean name="user" class="create.User_createUser" ></bean> <!-- 导入其他spring文件 --> <import resource="路径" /> </beans>
- 属性注入
注入方式:
1)set方法注入(最重要!):
值注入:
为了演示在User里面创建一个toString的方法;
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- set方式注入 -->
<!--1、 值注入 --> <!-- 表明要给User对象中名为name属性注入tom值 --> <!-- 表明要给User对象中名为age属性注入值18 --> <bean name="user" class="bean.User"> <property name="name" value="lily"></property> <property name="age" value="18"></property> </bean> </beans>对象类型的注入:
新建一个Car类package inject; public class Car { private String name; private String color; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Car [name=" + name + ", color=" + color + "]"; } }
package bean;
import inject.Car;
public class User {
private String name;
private Integer age;
private Car car;
public User() {
System.out.println("hi! 我是空参构造!!!");
}
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;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
}
}<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- set方式注入 --> <!--1、 值注入 --> <!-- 表明要给User对象中名为name属性注入tom值 --> <!-- 表明要给User对象中名为age属性注入值18 --> <bean name="user" class="bean.User"> <property name="name" value="lily"></property> <property name="age" value="18"></property> <!-- 为car属性注入下方配置的car对象 --> <property name="car" ref="car"></property> </bean> <!--2、对象类型注入 --> <!-- 将Car对象配置到容器中 --> <bean name="car" class="inject.Car"> <property name="name" value="法拉利"></property> <property name="color" value="red"></property> </bean> </beans>
结果:
2)构造函数注入![]()
该类需要有有参构造,在User里创建一个有参构造;
User类
package bean; import inject.Car; public class User { private String name; private Integer age; private Car car; public User() { System.out.println("hi! 我是空参构造!!!"); } public User(String name, Car car) { System.out.println("User(String name, Car car)"); this.name = name; this.car = car; } 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; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 构造函数方式注入 --> <!-- 包含值注入和引用类型注入 --> <!-- 将Car对象配置到容器中 --> <bean name="car" class="inject.Car"> <property name="name" value="法拉利"></property> <property name="color" value="red"></property> </bean>
<!-- name属性:构造函数的参数名 -->
<!-- index属性:构造函数的参数索引 -->
<!-- type属性:构造函数的参数类型 -->
<bean name="user" class="bean.User"> <constructor-arg name="name" value="jack"></constructor-arg> <constructor-arg name="car" ref="car"></constructor-arg> </bean> </beans>结果:
![]()
注:当构造函数的参数一样,只是顺序不一样的时候,如何确定调用哪一个???用index来设置!
3)P名称空间注入
当构造函数的参数顺序一样,参数类型不同的时候 ,如何确定调用哪一个???用type来设置!,type的值是该变量的完整类名复制过来。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- P名称空间方式注入 ,走set方法 包含值注入和引用类型注入 1、导入P名称空间 xmlns:p="http://www.springframework.org/schema/p" 2、使用p:属性完成注入 值类型:p:属性名="值" 对象类型:p:属性名 -ref="bean名称" --> <!-- 将Car对象配置到容器中 --> <bean name="car" class="inject.Car"> <property name="name" value="法拉利"></property> <property name="color" value="red"></property> </bean> <bean name="user" class="bean.User" p:name="amy" p:age="22" p:car-ref="car"></bean> </beans>
4)spel注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <bean name="user1" class="bean.User"> <property name="name" value="lily"></property> <property name="age" value="18"></property> </bean> <!-- 将Car对象配置到容器中 --> <bean name="car" class="inject.Car"> <property name="name" value="法拉利"></property> <property name="color" value="red"></property> </bean> <!-- spel注入:spring Expression Language 表达式语言--> <!-- value="#{}" 括号里可以引用其他对象的值作为user对象的值,引用类型是不可以用spel表达式的 --> <bean name="user" class="bean.User" > <!-- <property name="name" value="#{}"></property> --> <property name="age" value="#{user1.age}"></property> <property name="name" value="#{user1.name}"></property> <property name="car" ref="car"></property> </bean> </beans>
- 复杂类型注入
新建一个CollectionBean类
package inject; import java.awt.List; import java.util.Arrays; import java.util.Map; import java.util.Properties; public class CollectionBean { private Object[] arr;//数组类型注入 private List list;//list类型注入 private Map map;//map类型注入 private Properties prop;//properties类型注入 @Override public String toString() { return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + "]"; } public Object[] getArr() { return arr; } public void setArr(Object[] arr) { this.arr = arr; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public Properties getProp() { return prop; } public void setProp(Properties prop) { this.prop = prop; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <bean name="user1" class="bean.User"> <property name="name" value="lily"></property> <property name="age" value="18"></property> </bean> <!-- 将Car对象配置到容器中 --> <bean name="car" class="inject.Car"> <property name="name" value="法拉利"></property> <property name="color" value="red"></property> </bean> <!-- spel注入:spring Expression Language 表达式语言 --> <!-- value="#{}" 括号里可以引用其他对象的值作为user对象的值,引用类型是不可以用spel表达式的 --> <bean name="user" class="bean.User"> <!-- <property name="name" value="#{}"></property> --> <property name="age" value="#{user1.age}"></property> <property name="name" value="#{user1.name}"></property> <property name="car" ref="car"></property> </bean> <!-- 复杂类型注入 --> <!-- array注入 --> <bean name="cb" class="inject.CollectionBean"> <!-- 数组只有一个属性的情况,直接使用value/ref <property name="arr" value="amy"></property> --> <!-- 多个元素 --> <property name="arr"> <array> <value>tom</value> <value>jack</value> <ref bean="user" /> </array> </property> <!-- List注入 --> <!-- 如果数组中只准备注入一个值(对象),直接使用value/ref即可 --> <property name="list"> <array> <value>tom</value> <value>jack</value> <ref bean="user" /> </array> </property> <!-- Map类型注入 --> <property name="map"> <map> <entry key="url" value="www"></entry> <entry key="classname" value-ref="user"></entry> <entry key-ref="user" value-ref="user"></entry> </map> </property> <!-- properties 类型注入 --> <property name="prop"> <props> <prop key="driverClass">com.jdbc.mysql.Driver</prop> <prop key="userName">admin</prop> <prop key="password">1234</prop> </props> </property> </bean> </beans>
- 在WEB环境中使用spring容器
1)导包4+2+1(spring-web)
2)在web.xml中配置listener=>ContextLoaderListener
配置参数,指定spring配置路径
3)在Action中,使用工具类获得容器。
WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)










浙公网安备 33010602011771号