Spring_01

Spring

一、Spring概念

百度百科 https://baike.baidu.com/item/spring%E6%A1%86%E6%9E%B6/2853288?fr=aladdin

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
Spring的初衷:
1、JAVA EE开始应该更加简单。
2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。
3、为JavaBean提供了一个更好的应用配置框架。
4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。
5、尽量减少不必要的异常捕捉。
6、使应用程序更加容易测试。
Spring的目标:
1、可以令人方便愉快的使用Spring。
2、应用程序代码并不依赖于Spring APIs。
3、Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
Spring的基本组成:
1、最完善的轻量级核心框架。
2、通用的事务管理抽象层。
3、JDBC抽象层。
4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。
5、AOP功能。
6、灵活的MVC Web应用框架。

IOC:Inverse of Control (反转控制)

反转控制就是反转了对象的创建方式 从我们自己创建反转给了程序(spring)

DI:Dependency Injection(依赖注入)

实现IOC思想需要 DI做支持。
注入方式:
        set方法注入
        构造方法注入
        字段注入
注入类型:
        值类型注入  8大基本数据类型(byte short char int float long  double  boolean)
        引用类型注入 将依赖对象注入

ApplicationContext&BeanFactory

BeanFactory接口
    spring原始接口.针对原始接口的实现类功能较为单一
    BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象
ApplicationContext
    每次容器启动时就会创建容器中配置的所有对象.并提供更多功能
    丛类路径下加载配置文件:ClassPathXmlApplicationContext
    从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext("d:/xxx/yyy/xxx")
结论:web开发中,使用applicationContext. 在资源匮乏的环境可以使用BeanFactory.

二、Spring配置

Spring创建对象的方式

        1 空参构造方式
        2 静态工厂(了解)
        3 实例工厂(了解)

Bean元素 使用该元素描述需要spring容器管理的对象

        <1> class属性:被管理对象的完整类名.
        <2> name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.  
                可以重复.可以使用特殊字符.
        <3> id属性: 与name属性一模一样. 
                名称不可重复.不能使用特殊字符.
        结论: 尽量使用name属性.

Bean元素进阶

    (1)scope元素
        <1> singleton(默认值):单例对象 被表示为单例的对象在spring容器中只会存在一个实例
        <2> prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.
        <3> request:web环境下.对象与request生命周期一致.
        <4> session:web环境下,对象与session生命周期一致.
    (2)生命周期属性:
        init-method:配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用.
        destory-method:配置一个方法作为生命周期的销毁方法.spring容器在关闭并销毁所有容器中的对象之前调用.
destory-method
init-method

spring创建对象的方式

spring的分模块配置
        <!-- 导入其他spring配置文件 -->
        <import resource="com/wst/demo/applicationContext.xml"/>

三、spring属性注入

注入方式

set方式注入

        <bean name="user" class="com.wst.bean.User">
            <!-- 为User对象中名为name的属性注入wst作为值 -->
            <property name="name" value="wst"></property>
            <property name="age" value="20"></property>
        </bean>

构造函数注入

    name:构造函数的参数名
    index 构造函数的参数索引
    type:构造函数的参数类型
            <bean name="user2" class="com.wst.bean.User">
                <constructor-arg name="name" value="tom" index="1"></constructor-arg>
                <constructor-arg name="car" ref="car" index="0"></constructor-arg>
            </bean>

p名称空间注入

1 导入p名称空间
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    ==> xmlns:p="http://www.springframework.org/schema/p" 
2 使用p属性完成注入
        |-值类型:   p:属性名="值"
        |-对象类型  p:属性名-ref="bean名称"  
    <bean name="user3" class="com.wst.bean.User" p:name="jack"  p:age="18" p:car-ref="hourse"></bean>   

spel注入

    SPEL注入:Spring Expression Language ,Spring表达式语言
    value="#{}" 
        <bean name="user4" class="com.wst.bean.User">
            <property name="name" value="#{user.name}"></property>
            <property name="age" value="#{user3.age}"></property>
            <property name="hourse" ref="hourse"></property>
         </bean>

复杂类型注入

    数组 List Map Properties
    <!-- array注入 -->
     <bean name="cb" class="com.wst.c_injection.CollectionBean">
     <!-- 如果数组 只准备一个值(对象)  直接使用value|ref即可-->
     <!-- <property name="arr" value="tom"></property> -->

     <!-- array注入 多元素注入-->
        <property name="arr">
        <array>
            <value>tom</value>
            <value>jerry1</value>
            <ref bean="user4"/>
        </array>
        </property>

         <!-- 如果数据中只准备注入一个值(对象) 直接使用value|ref即可 -->
        <property name="list">
            <list>
                <value>jack</value>
                <value>rose</value>
                <ref bean="user3"/>
            </list>
        </property>  

         <!-- map类注入 -->
         <property name="map">
            <map>
                <entry key="url" value="jdbc:mysql:///crm"></entry>
                <entry key="user4" value-ref="user4"></entry>
                <entry key-ref="user3" value-ref="user2"></entry>
            </map>
         </property>
         <!-- properties类型注入 -->
         <property name="prop">
            <props>
                <prop key="driverClass">com.jdbc.mysql.Driver</prop>
                <prop key="username">root</prop>
                <prop key="password">root</prop>
            </props>
         </property>
         </bean>    

猜你喜欢

转载自www.cnblogs.com/guanzhigu/p/10405120.html