Spring

1、Spring是什么?为什么要用Spring?

spring 是一个开源的轻量级 JavaBean 容器框架。

  • 轻量:非入侵性的、所依赖的东西少、资源占用少、部署简单,不同功能选择不同的 jar 组合
  • 容器:工厂模式实现对 JavaBean 进行管理,通过控制反转(IOC)将应用程序的配置和依赖性与应用代码分开
  • 松耦合:通过 xml 配置或注解即可完成 bean 的依赖注入
  • AOP:通过 xml 配置 或注解即可加入面向切面编程的能力,完成切面功能,如:日志,事务...的统一处理
  • 方便集成:通过配置和简单的对象注入即可集成其他框架,如 Mybatis、Hibernate、Shiro...
  • 丰富的功能:JDBC 层抽象、事务管理、MVC、Java Mail、任务调度、JMX、JMS、JNDI、EJB、动态语言、远程访问、Web Service...

 2、Spring的核心是什么?

Spring的两大核心IOC(控制反转)和AOP(面向切面编程),IOC又称DI(依赖注入)。

IOC:IOC不是开发技术,也不是具体功能,它是面向对象编程的一种设计理念。

依赖注入:

依赖关系注入 (DI) 是一个过程,其中对象仅通过构造函数参数、工厂方法的参数或在对象实例构造或从工厂方法返回后在对象实例上设置的属性来定义其依赖关系(即,它们与之一起工作的其他对象)。然后,容器在创建 Bean 时注入这些依赖项。这个过程基本上是Bean本身的反比(因此得名Inversion of Control),通过使用类或服务定位器模式的直接构造来控制其依赖项的实例化或位置。 

DI有两种主要变体(也就是依赖注入的两种方式):基于构造函数的依赖关系注入基于 Setter 的依赖关系注入

AOP:AOP可以认为是对OOP(面向对象编程)的一种补充,这种横向式的编程方式更容易处理不同对象,不同模块之间的共同业务。

AOP的基本概念:

  • Aspect(切面):一个模块化的横切逻辑(或称横切关注点),可能会横切多个对象。
  • Advice(增强处理):切面在某个特定连接点上执行的代码逻辑。
  • Join Point(连接点):程序执行中的某个具体的执行点。
  • Pointcut(切入点):对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。
  • Target Object(目标对象):被一个或多个切面增强的对象
  • AOP proxy(AOP代理):由AOP框架所创建的对象,实现执行增强处理方法等功能。
  • Weaving(织入):将增强处理连接到应用程序中的类型或对象上的过程。
  • 增强处理类型:
    • 前置增强 org.springframework.aop.MethodBeforeAdvice:是在目标方法执行前实施的增强,可应用于权限管理功能
    • 后置返回增强 org.springframework.aop.AfterReturningAdvice:是在目标方法执行成功后实施增强,可应用于关闭流、删除临时文件的功能
    • 环绕增强 org.aopalliance.intercept.MethodInterceptor:是在目标方法执行前和执行后实施增强,可应用于日志记录、事务管理等功能
    • 异常增强 org.springframework.aop.ThrowsAdvice:是在方法抛出异常后实施增强,可应用于处理异常、记录日志等功能
    • 引入增强 org.springframework.aop.IntroductionInterceptor:是在目标类中添加一些新的方法和属性,可应用于修改目标类(增强类)

依赖注入方式扩展:

构造注入

        构造注入是指Spring框架通过构造方法为属性赋值的一种注入方式。构造方式可以在对象初始化时为属性赋值,具有良好的时效性。使用构造注入,需要在配置文件中使用<constructor-arg>标签进行配置。

//语法
<bean id = "唯一标识" class = "类的全路径">
    <constructor-arg name ="参数名称" ref = "依赖对象"/>
</bean>

        上述语法中,<constructor-arg>标签表示使用构造器注入的方式当前Bean注入依赖,其内部的ref标签用来配置被注入的Bean名称。

知识扩展:

  • 如果有多个参数,可以在当前bean标签下配置多个<constructor-arg>标签。
  • 除使用name属性区别多个参数外,还可以使用<constructor-arg>标签中的index属性指定参数的位置索引,位置从开始。
  • <constructor-arg>标签提供了type属性,用以标识参数的类型。

 p命名空间注入

        p命名空间的特点是使用属性而不是子元素的形式配置Bean的属性,从而简化了Bean的配置。

//语法

<bean id = "唯一标识" class = "类的全路径"
    p: "属性1" = "注入的值" p: "属性2" = "注入的值"/>

<bean id = "唯一标识" class = "类的全路径"
    p:dao-ref = "注入的Bean"/>

注意:配置文件中使用p命名空间时,需要先添加p命名空间的声明

xmlns:p="http://www.springframework.org/schema/p"

不同数据类型的注入 

1、空字符串和null

当参数时空字符串或null时,可以使用<value></value>注入空字符串值,使用<null/>注入null值,

//示例

<bean id = "entity" class = "entity.TestEntity">
<! -- 注入空字符串值 -->
    <property name = "emptyValue">
        <value></value>
    </property>
    <! -- 注入null值 -- >
    <property name = "nullValue">
        <null/>
    </property>
</bean>

2、基本数据类型、字符串

        当参数时基本数据类型或其包装类型和字符串时,可以使用value标签进行注入,当属性值中包含&、<、>、‘、“等XML中的特殊字符时,需要对配置文件做相应的处理。 

//示例

<bean id = "entity" class = "entity.TestEntity">
    <!-- 使用<![CDATA[]]>标记处理XML特殊字符 -->
    <property name = "specialCharacter1">
        <value><![CDATA[诸葛亮&路飞]]></value>
    </property>
    <!-- 使用实体引用方式处理XML特殊符号 -->
    <property name = "specialCharacter2">
        <value>诸葛亮amp;路飞</value>
    </property>
</bean>

 

XML文件中特殊符号与实体引用的对应关系
符号实体引用
&&amp;
<

&lt;

>&gt;
&apos;
&quot;

        其中,符号 "&" 和 "<" 在XML文件中时非法的,剩余三个符号是合法的。在XML文件中也可以不对其进行特殊处理。

3、集合和数组

1)List集合或数组

        当参数是List集合或数组类型时,可以使用list标签进行注入

//示例

<bean id = "entity" class = "entity.TestEntity">
    <property name = "list">
        <list>
            <!-- 定义List或数组中的元素 -->
            <value>青龙偃月刀</value>
            <value>丈八点钢矛</value>
        </list>
    </property>
</bean>

        注:list标签中除可以使用value注入基本数据类型外,还可以使用ref等标签注入JavaBean元素,甚至另一个list标签。

2)Set集合

        当参数是Set类型,可以使用set标签注入。

//示例

<bean id = "entity" class = "entity.TestEntity">
    <property name = "set">
        <set>
            <!-- 定义Set集合的元素 -->
            <value>青龙偃月刀</value>
            <value>丈八点钢矛</value>
        </set>
    </property>
</bean>

 3)Map集合

         当参数是Map类型,还需要配置键值对。

//示例

<bean id = "entity" calss = "entity.TestEntity">
    <property name = "map">
        <map>
            <!-- 定义Map中的键值对 -->
            <entry>
                <key><value>knife</value></key>
                <value>青龙偃月刀</value>
            </entry>
            <entry>
                <key><value>spear</value></key>
                <value>丈八点钢矛</value>
            </entry>
        </map>
    </property>
</bean>

4、Bean

除基本数据类型外,常见的还有JavaBean类型。在Spring中定义Bean的引用时,除使用ref属性外,还可以通过ref标签实现。

//示例

<bean id = "user" class = "entity.User"/>
<bean id = "entity" class = "entity.TestEntity">
    <!-- 定义Bean引用 -->
    <property name = "outUser">
        <ref bean = " user"></ref>
    </property>
</bean>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值