spring入门篇
一、Spring的概述
1.1、什么是spring
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
- 目的:解决企业应用开发的复杂性
- 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
- 范围:任何Java应用
它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2、spring的优点
1.3、spring提供一站式框架
- Spring:SE/EE开发的一站式框架
- 一站式框架:有EE开发的每一层解决方案。
- WEB层 :SpringMVC
- Service层 :Spring的Bean管理,Spring声明式事务
- DAO层 :Spring的Jdbc模板,Spring的ORM模块
1.4、spring包下载
- docs :Spring的开发规范和API
- libs :Spring的开发的jar和源码
- schema :Spring的配置文件的约束
二、spring-Ioc
2.1、什么是spring的控制反转
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
- IOC:控制反转,将对象的创建权反转给了Spring。
- DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
2.2、创建一个简单的Demo
2.2.1、引入所需jar包
2.2.2、创建接口和类
/**
* 用户管理DAO层接口
*
*/
public interface UserDAO {
public void save();
}
/**
* 用户管理DAO层实现类
*
*/
public class UserDAOImpl implements UserDAO {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("UserDAOImpl执行了..."+name);
}
}
2.2.3、将实现类交给Spring管理
<!-- Spring的入门的配置==================== -->
<bean name="userDAO" class="spring.demo1.UserDAOImpl" >
<property name="name" value="李东"/>
</bean>
2.2.4、编写测试类
@Test
/**
* Spring的方式的调用
*/
public void demo2(){
// 创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAO userDAO = (UserDAOImpl) applicationContext.getBean("userDAO");
userDAO.save();
}
三、Spring的工厂类
3.1、Spring工厂类的结构图
- BeanFactory:调用getBean的时候,才会生成类的实例(老版本)
- ApplicationContext :加载配置文件的时候,就会将Spring管理的类都实例化,它又2个实现类
- ClassPathXmlApplicationContext :加载类路径下的配置文件
- FileSystemXmlApplicationContext :加载文件系统下的配置文件
四、Spring的bean管理
4.1、bean标签的基本配置
- id :在容器中查找Bean(对象)的id(唯一、且不能以/开头)
- class :bean(对象)的完整类名
- name :在容器中查找Bean(对象)的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)
4.2、bean标签的生命周期
- init-method :Bean被初始化的时候执行的方法
- destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
4.3、Bean的作用范围的配置(重点)
- scope:Bean的作用范围
- singleton :默认的,Spring会采用单例模式创建这个对象。
- prototype :多例模式。(Struts2和Spring整合一定会用到)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
4.4、Spring的Bean的实例化方式(XML方式)
4.4.1、无参构造方法的方式(默认)
- 配置文件
<!-- 无参数构造方法 -->
<bean id="bean1" class="spring.demo3.Bean1"></bean>
- 编写类
/**
* 无参数构造方法方式
*
*/
public class Bean1 {
public Bean1() {
System.out.println("Bean1的无参数的构造方法执行了...");
}
}
4.4.2、静态工厂实例化的方式
- 配置文件
<!-- 静态工厂实例化 -->
<bean id="bean2" class="spring.demo3.Bean2Factory" factory-method="createBean2"/>
- 编写类
</**
* Bean2的静态工厂
*
*/
public class Bean2Factory {
public static Bean2 createBean2(){
System.out.println("Bean2Factory中方法执行了...");
return new Bean2();
}
}`
4.4.3、静态工厂实例化的方式
- 配置文件
<!-- 实例工厂实例化 -->
<bean id="bean3Factory" class="spring.demo3.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"></bean>
- 编写类
/**
* Bean3的实例工厂
*
*/
public class Bean3Factory {
public Bean3 createBean3(){
System.out.println("Bean3的实例工厂执行了...");
return new Bean3();
}
}
/**
* 实例工厂实例化的方式
*
*/
public class Bean3 {
}
4.5、Spring的属性注入
4.5.1、构造方法的方式的属性注入
- 配置文件
<!-- 构造方法的方式 -->
<bean id="car" class="spring.demo4.Car">
<constructor-arg name="name" value="宝马"/>
<constructor-arg name="price" value="800000"/>
</bean>
- 编写类
public class Car {
private String name;
private Double price;
public Car(String name, Double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
4.5.2、Set方法的方式的属性注入
4.5.2.1、Set方法的属性注入
- 配置文件
<!-- set方法的方式 -->
<bean id="car2" class="spring.demo4.Car2">
<property name="name" value="奔驰"/>
<property name="price" value="1000000"/>
</bean>
- 编写类
/**
* set方法的属性注入
*
*/
public class Car2 {
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
}
}
4.5.2.2、Set方法设置对象类型的属性
- 配置文件
<!-- set方法注入对象类型的属性 -->
<bean id="employee" class="spring.demo4.Employee">
<!--value:设置普通类型的值,ref:设置其他的类的id或name-->
<property name="name" value="王五"/>
<property name="car2" ref="car2"/>
</bean>
- 编写类
/**
* set方法的属性注入
*/
public class Employee {
private String name;
private Car2 car2;
public void setName(String name) {
this.name = name;
}
public void setCar2(Car2 car2) {
this.car2 = car2;
}
@Override
public String toString() {
return "Employee [name=" + name + ", car2=" + car2 + "]";
}
}
4.5.3、P名称空间的属性注入(Spring2.5以后)
<!-- 改为p名称空间的方式 -->
<bean id="car2" class="spring.demo4.Car2" p:name="奇瑞QQ" p:price="30000"></bean>
<bean id="employee" class="spring.demo4.Employee" p:name="王东" p:car2-ref="car2"></bean>
4.5.4、SpEL的属性注入(Spring3.0以后)
<!-- SpEL的属性注入 -->
<bean id="carInfo" class="spring.demo4.CarInfo">
</bean>
<bean id="car2" class="spring.demo4.Car2">
<property name="name" value="#{carInfo.name}"></property>
<property name="price" value="#{carInfo.calculatorPrice()}"></property>
</bean>
<bean id="employee" class="spring.demo4.Employee">
<property name="name" value="#{'赵洪'}"></property>
<property name="car2" value="#{car2}"></property>
</bean>
4.5.5、集合类型属性注入(了解)
- 配置文件
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
- 编写类
/**
* 集合属性的注入:
*
*/
public class CollectionBean {
private String[] arrs;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
+ "]";
}
}
项目链接: spring入门篇.