Spring的概念详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的概念详解相关的知识,希望对你有一定的参考价值。

一、Spring 概述
1.Spring 是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用与企业应用
2.Spring 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
-从大小与开销两反面而言两反面Spring都是轻量的
-通过控制反转的技术达到解耦的目的
-提供了面向切面变成的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发
-包含并管理应用对象的配置和声明周期,这个意义上是一种容器
-将简单的组件配置、组合成为复杂的应用,这个意义上是框架
3.Spring 开发应用 简单、方面、快捷 Spring
3.1框架的特点
-半成品
-封装了特定的处理流程和逻辑控制
-成熟的、不断改进的软件
框架与类库的区别
-框架一般是封装了逻辑、高内聚的、类库则是松散的工具组合
-框架专注于某一领域,类库则是更通用的
3.2为什么使用框架
-软件系统日趋复杂
-重用度高,开发效率和质量提高
-软件设计人员要专注于对领域的了解,使需求分析更充分
-易于上手,快速解决问题

二、Spring IOC
专题一 IOC
-接口及面向接口变成
-什么事IOC
-Spring的Bean配置
-Bean的初始化
两个包 1.org.springframework.beans org.springframework.context
BeanFactory 提供配置结构和基本功能,加载并初始化Bean
ApplicationContext 保存了Bean对象并在Spring中被广泛使用

           ApplicationContext 
           -本地文件 FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/worksapace/application.xml");
           -Classpath ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("calsspath:spring-context.xml");
           -Web应用中依赖servlet或Listener
              spring 容器 加载 ioc
              <listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
              </listener>
              <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
              </context-param>

              spring MVC 加载 ioc  可以不使用spring 容器  
              <servlet>
                    <servlet-name>seckill-dispatcher</servlet-name>
                    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                    <init-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>classpath:spring/spring-*.xml</param-value>
                    </init-param>
                </servlet>
                <servlet-mapping>
                    <servlet-name>seckill-dispatcher</servlet-name>
                    <url-pattern>/</url-pattern>
                </servlet-mapping>

-Spring的常用注入方式

1.IOC控制反转:控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器(Spring Container或者 Spring MVC 子容器)
负责创建和维护
-到底哪些方面的控制被反转了呢:获得依赖对象的过程被反转了 控制被反转之后,获得依赖对象的过程由自身管理变为由IOC容器主动注入
依赖注入:就是IOC容器在运行期间,动态的将某种依赖关系注入到对象之中
2.DI依赖注入 是一种实现方式
目的:创建对象并且组装对象之间的关系
特点:不关心对象的创建 只去使用
3.Spring 注入
-spring 注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
-常用的两种注入方式
1、设值注入 就是set 通过xml配置文件进行设置
<bean id="injesctionService" class="org.seckill.dao.injection.service.InjectionServiceImpl">
<property name="injectionDao" ref="injectionDao"/>
</bean>
<bean id="injectionDao" class="org.seckill.dao.injection.dao.InjectionDaoImpl"/>
2、构造注入
<bean id="injesctionService" class="org.seckill.dao.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDao" ref="injectionDao"/>
</bean>
<bean id="injectionDao" class="org.seckill.dao.injection.dao.InjectionDaoImpl"/>

三、Spring Bean
-Bean 配置项
id:在整个ioc容器中这个bean的唯一标识
class:具体要实例化的哪个类
scope:范围
-singleon:单例,只一个Bean容器照片那个只存在一份
-protoptype:每次请求(每次使用)创建新的实例,destroy方式不生效
-request:每次http请求创建一个实例且尽在当前request内有效
-session:每次http请求创建一个实例且尽在当前session内有效
-global session:基于portlet的web中有效(portlet定义了 global session) 如果在web中,同session
constructor arguments:
Properties: 属性
Autowiring mode:自动装配模式
lazy-initialization mode:懒加载模式
Initialization/destruction method 初始化 和销毁的方法
-Bean 作用域
-singleon:单例,只一个Bean容器照片那个只存在一份
-protoptype:每次请求(每次使用)创建新的实例,destroy方式不生效
-request:每次http请求创建一个实例且尽在当前request内有效
-session:每次http请求创建一个实例且尽在当前session内有效
-global session:基于portlet的web中有效(portlet定义了 global session) 如果在web中,同session
-Bean 生命周期
1-定义

    2-初始化
        -实现org.springframework.beans.factory.InitalizingBean接口,覆盖afterPropertiesSet方法
            Public class RedisDao implements InitalizingBean{
                @Override
                public void afterPropertiesSet() throws Exception{

                }
            }
        -配置 init-method
            <bean id="redisDao" class = "org.seckill.dao.RedisDao" init-method="init"/> 该类里面有个init()方法 会自动执行在创建该类时候
    3-使用

    4-销毁
        -实现org.springframework.beans.factory.DisposableBean接口,覆盖destroy方法
            Public class RedisDao implements InitalizingBean{
                @Override
                public void destroy() throws Exception{

                }
            }
        -配置 init-method
            <bean id="redisDao" class = "org.seckill.dao.RedisDao" destroy-method="destroy"/> 该类里面有个destroy()方法 会自动执行在创建该类时候

    总结
        1,默认全局的初始化和销毁方法;
        2,实现接口的初始化和销毁方法;
        3,配置文件中配置初始化和销毁方法;
        这三个方法同时使用时,1默认的则不执行,而23两种都会执行,并且是2实现接口的方式先于配置中3的执行。
        1默认的全局初始化和销毁方法可以有可以没有,有没有对配置都没有太大影响,当然如果一个bean没有采取23初始化销毁方法,
        而有1默认的方法的话,这两个方法还是会执行的。即使没有,系统也不会报错。

-Bean 自动装配(Autowiring)
-No:不做任何操作
-byname:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并肩器与属性自动装配
<bean id="dao" class="com.etoak.dao.DaoImpl"></bean>
//此类中有 封装的属性值 和其set方法
//或者可以通过 表头的命名空间进行配置 default-autowrie="byBane" 其他都不默认配置了
<bean id="action" class="com.etoak.action.LoginAction" init-method="init">
<property name="di" ref="dao"></property>
</bean>
-byType:如果容器中存在一个与指定属性类型相同的bean,那么将于该属性自动装配;如果存在多个该类型bean,那么抛出异常
并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则是么事都不发生
-Constructor:与byType方式类似,不同之处在于他应用于构造器参数如果容器中没有找到与构造器参数类型一直的bean,抛出异常

-Resources&ResourceLoader
Resources 支队于资源文件的统一接口
-UrlResource:URL对应的资源,根据一个URL地址即可构建
-ClassPathResource:获得类路径下的资源文件(也即是classpath下的)
-FileSystemResource:获取文件系统里面的资源
-ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源(web相关的)
-InputStreamResource:针对输入流封装的资源
-ByteArrayResource:针对于地接数组封装的资源
ResourceLoader 加载资源的 所有的applicationContext都实现了该接口 都可以获取Resource实例
public interface ResourceLoader{
Resource getResource(String location);
}

技术分享图片
技术分享图片
开始图
技术分享图片
1.bean 类 实现ApplicationContextAware 所有的applicationContext都实现了该接口 都可以获取Resource实例
技术分享图片
applicationConext.getResource();有4中
技术分享图片
测试类技术分享图片

-Aware 这个暂时忽略 没用到过(上面再实现Resource时候就是用Aware)
-Spring 中提供了一些以Aware结尾的接口,实现了Aware接口的bean在初始化之后,可以获取相应的资源
-通过Aware接口,可以对Spring想用资源进行操作(一定要慎重)
-为对Spring进行简单的扩展提供了方面的入口
-ApplicationContextAware 实现了此接口的类会提供 spring contxt 上下文的信息 实现类必须配置到spring的配置文件中去(bean容器加载)
-BeanNameAware 同上

以上是关于Spring的概念详解的主要内容,如果未能解决你的问题,请参考以下文章

Spring的概念详解

Spring AOP详解

Spring-AOP基础概念和操作详解

Spring事务详解

JAVAEE——spring01:介绍搭建概念配置详解属性注入和应用到项目

spring aop详解