首页 > 编程语言 > 详细

Spring

时间:2019-04-07 13:54:22      阅读:102      评论:0      收藏:0      [点我收藏+]

什么是Spring

  Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring:SE/EE开发一站式框架.

  WEB层:SpringMVC

  Service层:Spring的Bean管理,Spring的声明式事务

  Dao层:Spring的JDBC模板,Spring的ORM模块

为什么学习Spring

 

特点

 

1.方便解耦,简化开发

  通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2.AOP编程的支持

  通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

3.声明式事务的支持

  在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

4.方便程序的测试

  可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架

  Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

6.降低Java EE API的使用难度

  Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

7.Java 源码是经典学习范例

  Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

 

 

Spring的版本

  Spring3.xSpring4.x

Spring的入门(IOC)

什么IOC

  IOC: Inversion of Control(控制反转)

  控制反转:将对象的创建权反转给(交给)Spring

下载Spring的开发包

 

  官网http://spring.io/

 

解压Spring的开发包

技术分享图片

 

 

  1. docs Spring的开发规范和API
  2. libs Spring的开发的jar和源码
  3. schema Spring的配置文件的约束 

创建web项目,引入jar

技术分享图片

技术分享图片

创建接口和类

 1 /**
 2  * 用户管理DAO层接口
 3  * @author Administrator
 4  *
 5  */
 6 
 7 public interface UserDao {
 8     
 9     public void save();
10     
11 }
 1 /**
 2  * 用户管理Dao层的实现类
 3  * @author Administrator
 4  *
 5  */
 6 
 7 public class UserDaoImpl implements UserDao {
 8 
 9     private String name;
10     
11     
12     
13     public String getName() {
14         return name;
15     }
16 
17 
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23 
24 
25     public void save() {
26         System.out.println("UserDaoImpi执行了................"+name);
27     }
28 
29     
30 
31 }

 问题:

   如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?

技术分享图片

将实现类交给Spring管理

  在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans     xmlns="http://www.springframework.org/schema/beans"
3         xmlns:p="http://www.springframework.org/schema/p"
4         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
6      
7     <!-- Spring的入门配置 -->
8         <bean id="UserDao" class="com.zmy.spring.demo1.UserDaoImpl"> </bean>

编写测试类

 1 import org.junit.Test;
 2 import org.springframework.context.ApplicationContext;
 3 import org.springframework.context.support.ClassPathXmlApplicationContext;
 4 
 5 /**
 6  * Spring的入门
 7  * @author Administrator
 8  *
 9  */
10 
11 public class SpringDemo01 {
12 
13     @Test
14     //Spring的方式的调用
15     public void demo01() {
16         //创建spring工厂
17         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
18         UserDao userDao = (UserDao) applicationContext.getBean("UserDao");
19         userDao.save();
20         
21     }
22     
23 }

IOCDI*****

  IOC:控制反转,将对象的创建权反转给了Spring

  DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。

  面向对象的时候

 1   依赖
 2 
 3 Class A{
 4 
 5  
 6 
 7 }
 8 
 9  
10 
11 Class B{
12 
13   public void xxx(A a){
14 
15  
16 
17   }
18 
19 }
20 
21   继承:is a
22 
23 Class A{
24 
25  
26 
27 }
28 
29 Class B extends A{
30 
31  
32 
33 }
34 
35   聚合:has a

Spring的工厂类

Spring工厂类的结构图

技术分享图片

  ApplicationContext继承BeanFactory

BeanFactory:老版本的工厂类

  BeanFactory:调用getBean的时候,才会生成类的实例。

ApplicationContext:新版本的工厂类

  ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。

  ApplicationContext有两个实现类

ClassPathXmlApplicationContext:加载类路径下的配置文件

  FileSystemXmlApplicationContext :加载文件系统下的配置文件

 

Spring的配置

 XML的提示配置

  Schema的配置

 技术分享图片

Bean的相关的配置

  <bean>标签的idname的配置

     id :使用了约束中的唯一约束。里面不能出现特殊字符的。

     name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。

    SpringStruts1框架整合的时候

    <bean name=”/user” class=””/>

   Bean的生命周期的配置(了解)

    init-method :Bean被初始化的时候执行的方法

    destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)

  Bean的作用范围的配置(重点)

    scope Bean的作用范围

    singleton:默认的,Spring会采用单例模式创建这个对象。

    prototype:多例模式。(Struts2Spring整合一定会用到)

    request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。

    session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。

     globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session

 

SpringBean管理(XML方式)

  SpringBean的实例化方式(了解)

Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:

  无参构造方法的方式(默认)

 技术分享图片

  编写配置

 技术分享图片

实例工厂实例化的方式

  Bean3的实例工厂

 技术分享图片

  配置

 技术分享图片

  

Spring的属性注入

构造方法的方式的属性注入

  构造方法的属性注入

1 <!-- 构造方法的方式 -->
2      <bean id="Car2" class="com.zmy.spring.demo1.Car2">
3          <constructor-arg name="name" value="奔驰" />
4          <constructor-arg name="price" value="80000"/>
5      </bean>

Set方法的方式的属性注入

  Set方法的属性注入

<!-- set方法的方式 -->
    <bean id="Car" class="com.zmy.spring.demo1.Car">
        <property name="name" value="宝马"/>
        <property name="price" value="10000"/>
    </bean>

P名称空间的属性注入(Spring2.5以后)

  通过引入p名称空间完成属性的注入:

  写法:

    普通属性 p:属性名=

    对象属性 p:属性名-ref=

  P名称空间的引入

 

<?xml version="1.0" encoding="UTF-8"?>
<beans     xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        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">

  使用p名称空间

 

1 <bean id="Car" class="com.zmy.spring.demo1.Car" p:name="杨戬"  p:price="18888"></bean>    
2     <bean id="Car3" class="com.zmy.spring.demo1.Car3"  p:name="花木兰" p:Car-ref="Car"></bean>

SpEL的属性注入(Spring3.0以后)

  SpELSpring Expression LanguageSpring的表达式语言。

    语法:

       #{SpEL}

 

 1 <!-- Spel的属性注入 -->
 2     <bean id="User" class="com.zmy.spring.demo1.User"></bean>
 3     <bean id="Car" class="com.zmy.spring.demo1.Car"  >
 4         <property name="name"  value="#{User.name}"></property>
 5         <property name="price"  value="#{User.calculatorPrice()}"></property>
 6     </bean>
 7     <bean id="Car3" class="com.zmy.spring.demo1.Car3" >
 8         <property name="name"  value="#{‘花木兰‘}"></property>
 9         <property name="Car"  value="#{Car}"></property>
10     </bean> 

集合类型属性注入(了解)

  配置

 

 1 <!-- spring 的集合注入================== -->
 2         <!-- 注入数组类型 -->
 3     <bean id="collectionBean" class="com.zmy.spring.demo2.CollectionBean">
 4          <!-- 数组类型 -->
 5         <property name="arrs">
 6             <list>
 7                 <value>诸葛亮</value>
 8                 <value>貂蝉</value>
 9                 <value>小乔</value>
10             </list>
11         </property>
12        <!-- 注入list集合 -->
13         <property name="list">
14             <list>
15                 <value>诸葛亮</value>
16                 <value>貂蝉</value>
17                 <value>小乔</value>
18             </list>
19         </property>
20         <!-- 注入set集合 -->
21         <property name="set">
22             <set>
23                 <value>诸葛亮</value>
24                 <value>貂蝉</value>
25                 <value>小乔</value>
26             </set>
27         </property>
28           <!-- 注入Map集合 -->
29         <property name="map">
30             <map>
31                 <entry key="aaa" value="111"/>
32                 <entry key="bbb" value="222"/>
33                 <entry key="ccc" value="333"/>
34             </map>
35         </property>
36     </bean>                        

Spring的分模块开发的配置

  分模块配置

   在加载配置文件的时候,加载多个

 技术分享图片

 

  在一个配置文件中引入多个配置文件

 技术分享图片

 代码实现

  1.创建数据库和表

  2.创建web项目,引入jar

    引入struts2的开发的jar

    引入struts2的配置文件

   web.xml

 技术分享图片

  struts.xml

 

引入页面

  编写Action

 技术分享图片

  配置Action

 技术分享图片

  修改页面提交到Action

 技术分享图片

   编写Actionsave方法

    不在Action中直接创建Service,将Service交给Spring管理。

    创建Service接口和实现类

 技术分享图片

技术分享图片

 

  引入Spring的环境

    1.引入jar

    2.引入配置文件

  将Service交给Spring

 技术分享图片

Action中调用Service

 技术分享图片

编写DAO并且完成配置

  编写DAO的接口和实现类

 技术分享图片

 

 技术分享图片

  将DAO交给Spring管理

 技术分享图片

Service中使用DAO

 技术分享图片

技术分享图片

问题描述

  程序问题

    每次请求都会创建一个Spring的工厂,这样浪费服务器资源,应该一个项目只有一个Spring的工厂。

    在服务器启动的时候,创建一个Spring的工厂。

    创建完工厂,将这个工厂类保存到ServletContext中。

    每次使用的时候都从ServletContext中获取。

  *****使用ServletContextListener

  监听ServletContext对象的创建和销毁。

  解决方案:使用Spring核心监听器ContextLoaderListener(整合web项目)

    引入jar

    spring-web.jar

 

    配置监听器

 技术分享图片

    在Action中获取工厂

 技术分享图片

Spring

原文:https://www.cnblogs.com/zmy-520131499/p/10664959.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!