Spring框架的学习

第一次学习,跟着视频,辅助以CSDN和javaweb这本书来完成,尽量不要空过太多的东西,学习时间安排为4天。

1.什么是Spring框架

Spring是分层的JavaSE/EE应用一站式的轻量级开源框架,以Ioc(Inverse of control)控制反转和Aop(Aspect Oriented Programming)面向切面编程为核心。

Spring同时也是一个“一站式”框架,即Spring在JavaEE的三层架构[表现层(Web层)、业务逻辑层(Service层)、数据访问层(DAO层)]中,每一层均提供了不同的解决技术。如下:

  • 表现层(Web层):Spring MVC,提供和其他web框架整合方案
  • 业务逻辑层(Service层):Spring的IoC,Aop?
  • 数据访问层(DAO层):Spring的jdbcTemplate

重点是:IOC,spring要管理各各层的bean。

1.1什么是Ioc?

问题提出:

不使用ioc,代码中创建一个对象直接操作接口实现类,并没有面向接口开发。

面向接口开发:调用接口的方法,只面向接口而不面向接口实现类,因为一个接口可能有多个实现类。

没有面向接口开发的问题:调用接口的类和接口实现类之间存在直接耦合。

解决:

将调用接口的类和接口实现类要解耦合。

可以通过将创建接口实现类对象的工作交给工厂来作。

 

 对象只与工厂耦合,对象之间没有耦合。

总结为:

IoC (Inverse of Control)即控制反转。是指将原来程序中自己创建实现类对象的控制权反转到IOC容器中。只需要通过IOC获了对象的实例,将IOC当成一个黑盒子、工厂。

1.2开发环境的搭建

1.2.1导入Spring的jar包

      导入Spring框架中的相关jar包,这里只导入Spring的Core模块(Core模块是框架的核心类库)下的jar包(使用IoC的基本操作,并不需要导入Spring的所有jar包,只导入spring-beansspring-corespring-contextspring-expression这4个jar包),以及 支持日志输出的 commons-logging 和 log4j 的jar包(spring使用JCL日志体系(commons-logging-1.2.jar)

commons-logging:相当 于原来的slf4j,只有日志接口,还需要加入日志实现:log4j)

1.2.2创建Spring的配置文件,进行bean的配置

建议将该核心配置文件放在src目录下,且命名为 applicationContext.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <bean id="标识bean的名称" class="指定接口类的全限定名"></bean>
</beans>

     编写好接口及接口的实现类

   在该配置文件中配置spring要管理的bean

1.2.3通过配置文件,创建类对象,获取bean实例

public class Test1 {
    @Test
    public void runUser() {
        // 1. 加载Spring配置文件,创建Spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 2. 通过容器获取bean实例
        User user = (User) context.getBean("user");
        System.out.println(user);
    }
}

1.3 Spring的bean管理

1.3.1 bean实例化的方式 

<!-- 测试springbean的实例化方法 -->

<!-- 默认通过无参构造器 -->

<bean id="customer1" class="cn.itcast.crm.domain.CstCustomer"></bean>

<!-- 通过有参构造器构造器:public CstCustomer(Long custId,String custName)-->

<bean id="customer2" class="cn.itcast.crm.domain.CstCustomer">

<!-- index:参数位置,第一个参数位置为0

value:参数值

type:参数类型

 -->

<constructor-arg index="0" value="101" type="java.lang.Long"/>

<constructor-arg index="1" value="牛牛" type="java.lang.String"/>

</bean>

1.3.2 多文件的加载方式

加载多个配置文件

ApplicationContext applicationContext= new ClassPathXmlApplicationContext(new String[]{"bean1.xml","bean2.xml"});

//通过统配符号加载

//ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:bean*.xml");

ApplicationContext applicationContext new ClassPathXmlApplicationContext(new String[]{"bean1.xml","classpath:bean*.xml"});

1.4  DI的概念

控制反转,哪些对象被反转,获得依赖对象的过程被反转了。

 action:调用service,action依赖service,在action中所依赖的service创建被反转到spring容器。

service:调用dao,service依赖的dao创建被反转到spring容器

依赖注入(Dependency Injection)”。所谓依赖注入,就是由IOC容器在运行期间,动态地将对象的依赖关系注入到对象的属性中。

service:依赖dao,如何实现依赖注入?

1、spring要管理service(前提)

2、spring要管理dao(前提)

总结前提:依赖方(service)、被依赖方(dao)都需要被spring管理

3、根据依赖关系,service依赖dao,将dao实例注入至service的属性中。

底层原理:spring根据配置文件中配置依赖关系,首先获取被依赖的对象dao实例,调用service对象中set方法将dao实例设置(注入)到service属性。

目标:让Spring将service依赖的dao注入

步骤:1.在Spring的容器中配置dao和service

      2.配置依赖关系

1.5  IOC和DI的区别

ioc:控制反转,将对象的创建权反转到ioc容器。

DI:依赖注入,将对象所依赖的对象注入到对象的属性中。

就是IOC的具体 实现方法。

1、IOC就是一个容器

2、IOC容器中包括spring管理的所有bean。

3、IOC容器负责对bean进行实例化

4、IOC容器对bean进行实例化时候,检查有哪些依赖的属性,将依赖的属性注入到实例化的bean的属性中。

 要实现依赖注入,需要spring管理依赖方和被依赖方(spring要对依赖方和被依赖方实例化)。

1.6 set方法注入

??

2  Spring管理Struts2的action

在action中,从Spring容器中获取bean实例

由于action由Struts2框架实现实例化,所以无法实现依赖注入(无法实现将service注入到action的属性中)。

解决:让Spring对action进行实例化,完成action的依赖注入。

注意:Spring对bean进行实例化是前提,才可以对bean进行依赖注入。

2.1 springweb系统整合

applicationContext是spring的容器实例对象,对它的管理采取单例

Spring提供方案对applicationContext容器实例对象进行单例管理

将applicationContext和servletContext(单例)绑定

采用方法:在web.xml中添加监听器,当系统启动时候加载spring容器,创建spring容器的实例applicationContext,将applicationContext和servletContext(单例)绑定。

需要加入spring对web层的整合包spring-web-4.2.4.RELEASE.jar

<!-- 监听器,加载spring的配置文件,创建spring容器实例,和servletContext进行绑定 -->

<!-- 加载spring容器,与servletContext绑定 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 如果不指定contextConfigLocation,默认加载/WEB-INF/applicationContext.xml -->

<context-param>

<param-name>contextConfigLocation</param-name>

<!-- spring配置文件 可以采用加载多个文件,中间以半角逗号分隔,也可以使用通配符号 -->

<param-value>classpath:spring/applicationContext.xml</param-value>

</context-param>

2.2  spring和Struts2整合

目标:struts2的action由spring创建

单个struts2运行,action实例由struts2框架来创建,如果和spring整合,action由spring创建,需要加入struts2和spring整合的jar:struts2-spring-plugin-2.3.24.jar

上边的jar中包括对象工厂:org.apache.struts2.spring.StrutsSpringObjectFactory

创建action的实例改为StrutsSpringObjectFactory工厂,创建逻辑为:

struts2框架将beanname先从spring容器中找有没有这个bean,如果有从容器中取,如果没有再自己创建。

重要的配置:<constant name="struts.objectFactory" value="spring" />

 

 actionspring容器配置

 struts.xml配置beannameid


3   Spring的bean管理(注解)








猜你喜欢

转载自blog.csdn.net/mr_mari/article/details/80723001