一、什么是spring
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE
Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
EE开发分成三层结构:
* WEB层:Spring MVC.
*业务层:Bean管理:(IOC)
*持久层:Spring的JDBC模板.ORM模板用于整合其他的持久层框架.
Expert One-to-One J2EE Design andDevelopment:J2EE的设计和开发:(2002.EJB)
Expert One-to-One J2EE Development withoutEJB:J2EE不使用EJB的开发.
2.学习Spring的优势
方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控的功能
声明式事物的支持
只需要通过配置就可以完成对事物的管理,而无需手动编程。
方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀的框架
Spring不排斥各种优秀的开源框架,其内部提供了各种优秀框架(struts2、Hibernate)的直接支持
降低JavaEE API的使用难度
Spring对javaee开发中非常难用的一些API,都提供可封装。是用难度降低。
IOC:Inversion of
Control控制反转.指的是对象的创建权反转(交给)给Spring.
作用是实现了程序的解耦合.
3.使用Spring
3.1下载Spring开发包
http://spring.io/
3.2创建WEB项目,导包
lQ�
1.1.1.1步骤三:引入相关配置文件:
log4j.properties
applicationContext.xml
引入约束:
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
1.1.1.2步骤四:编写相关的类:
publicinterfaceUserDao {
publicvoidsayHello();
}
publicclassUserDaoImplimplementsUserDao {
@Override
publicvoidsayHello() {
System.out.println("Hello
Spring...");
}
}
1.1.1.3步骤五:完成配置:
"userDao"class="cn.itcast.spring.demo1.UserDaoImpl">
1.1.1.4步骤六:编写测试程序:
@Test
// Spring的方式:
publicvoiddemo2(){
//创建Spring的工厂类:
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂解析XML获取Bean的实例.
UserDaouserDao= (UserDao)applicationContext.getBean("userDao");
userDao.sayHello();
}
1.1.1.5IOC和DI:
IOC:控制反转,将对象的创建权交给了Spring.
DI:DependencyInjection依赖注入.需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去.
1.1.2Spring中的工厂:
1.1.2.1ApplicationContext:
ApplicatioContext接口有两个实现类:
ClassPathXmlApplicationContext:加载类路径下Spring的配置文件.
FileSystemXmlApplicationContext:加载本地磁盘下Spring的配置文件.
1.1.2.2BeanFactory:
1.1.2.3BeanFactory和ApplicationContext的区别:
BeanFactory:是在getBean的时候才会生成类的实例.
ApplicationContext:在加载applicationContext.xml时候就会创建.
1.1.3配置STS的XML的提示:
1.1.3.1Spring配置文件中提示的配置
复制路径:
*http://www.springframework.org/schema/beans/spring-beans.xsd
查找XML Catalog:
点击Add..
1.1.4Spring的相关配置:
1.1.4.1id属性和name属性标签的配置
id:Bean起个名字.在约束中采用ID的约束:唯一.必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号id:不能出现特殊字符.
name:Bean起个名字.没有采用ID的约束.name:出现特殊字符.如果没有id的话, name可以当做id使用.
*整合struts1的时候:
1.1.4.2scope属性:Bean的作用范围.
* singleton:默认值,单例的.
* prototype:多例的.
* request:WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
* session:WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
* globalSession:WEB项目中,应用在Porlet环境.如果没有Porlet环境那么globalSession相当于session.
1.1.4.3Bean的生命周期的配置:
通过配置标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean才会被销毁.
1.1.5Spring的Bean的管理XML的方式:
1.1.5.1Spring的Bean的属性注入:
【构造方法的方式注入属性】
"car"class="cn.itcast.spring.demo4.Car">
undefined"name"value="保时捷"/>undefined
undefined"price"value="1000000"/>undefined
【set方法的方式注入属性】
"car2"class="cn.itcast.spring.demo4.Car2">
"name"value="奇瑞QQ"/>
"price"value="40000"/>
1.1.5.2Spring的属性注入:对象类型的注入:
"person"class="cn.itcast.spring.demo4.Person">
"name"value="会希"/>
"car2"ref="car2"/>
1.1.5.3名称空间p的属性注入的方式:Spring2.x版本后提供的方式.
第一步:引入p名称空间
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
第二步:使用p名称空间.
*普通属性:p:属性名称=””
*对象类型属性:p:属性名称-ref=””
p:price="1200000"/>
1.1.5.4SpEL的方式的属性注入:Spring3.x版本后提供的方式.
SpEL:Spring Expression Language.
语法:#{ SpEL }
"car2"class="cn.itcast.spring.demo4.Car2">
"name"value="#{'奔驰'}"/>
"price"value="#{800000}"/>
引用了另一个类的属性
1.1.5.5注入复杂类型:
"collectionBean"class="cn.itcast.spring.demo5.CollectionBean">
"arrs">
会希
冠希
天一
"list">
芙蓉
如花
凤姐
"map">
"aaa"value="111"/>
"bbb"value="222"/>
"ccc"value="333"/>
"properties">
"username">root
"password">123
1.1.5.6Spring的分配置文件的开发
一种:创建工厂的时候加载多个配置文件:
ApplicationContext applicationContext = newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二种:在一个配置文件中包含另一个配置文件:
1.2案例代码
1.2.1搭建环境:
1.2.1.1创建web项目,引入jar包.
WEB层使用Struts2:
* Struts2开发的基本的包
Spring进行Bean管理:
*Spring开发的基本的包
1.2.1.2引入配置文件:
Struts2:
*web.xml
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
*struts.xml
Spring:
*applicationContext.xml
*log4j.properties
1.2.1.3引入页面:
1.2.1.4创建包结构和类:
1.2.1.5在添加页面提交内容到Action:
1.2.1.6改写Action类并配置Action:
"crm"extends="struts-default"namespace="/">
"customer_*"class="cn.itcast.crm.web.action.CustomerAction"method="{1}">
1.2.1.7在Action调用业务层:
将业务层类配置到Spring中:
在Action中获取业务层类:
publicString save(){
System.out.println("Action中的save方法执行了...");
System.out.println(customer);
//传统方式:
/*CustomerService customerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式进行操作:
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");
CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");
customerService.save(customer);
returnNONE;
}
****每次请求都会创建一个工厂类,服务器端的资源就浪费了,一般情况下一个工程只有一个Spring的工厂类就OK了.
*将工厂在服务器启动的时候创建好,将这个工厂放入到ServletContext域中.每次获取工厂从ServletContext域中进行获取.
*ServletContextLinstener:监听ServletContext对象的创建和销毁.
1.2.2Spring整合WEB项目
1.2.2.1引入spring-web.jar包:
配置监听器:
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
1.2.2.2改写Action:
/**
*保存客户的执行的方法:save
*/
publicString save(){
//传统方式:
/*CustomerService
customerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式进行操作:
/*ApplicationContext
applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService)
applicationContext.getBean("customerService");*/
WebApplicationContextapplicationContext=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerServicecustomerService= (CustomerService)applicationContext.getBean("customerService");
System.out.println("Action中的save方法执行了...");
System.out.println(customer);
customerService.save(customer);
returnNONE;
}
1.2.2.3编写Dao并配置:
1.2.2.4业务层调用DAO:
publicclassCustomerServiceImplimplementsCustomerService {
privateCustomerDaocustomerDao;
publicvoidsetCustomerDao(CustomerDaocustomerDao) {
this.customerDao=customerDao;
}
…
}
��