Spring是什么?

Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:
反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring
MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多
著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架

一.Bean容器的概念

Bean:在计算机英语中,有可重用组件的含义。
JavaBean:用java语言编写的可重用组件。
javabean > 实体类
它就是创建我们的service和dao对象的。
* 第一个:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识=全限定名(key=value)
* 第二个:通过读取配置文件中配置的内容,反射创建对象

二.基于XML的IOC环境搭建

IOC是什么?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

1.Spring中的IOC环境(控制反转)

(1).获取Spring中的核心容器Bean
获取spring的Ioc核心容器,并根据id获取对象
* Applicationcontext的三个常用实现类:
   ClassPathXmLApplicationcontext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。(更常用)
   FileSystemXmLApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)
   AnnotationconfigAppLicationcontext:它是用于读取注解创建容器的

   核心容器的两个接口引发出的问题:
       ApplicationContext: 单例对象适用  实际开发中(多采用此接口)
            它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。
            也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。
       BeanFactory:       多例对象适用
            它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。
            也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象
            
//代码演示

//1.获取核心容器对象
//        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取bean对象
        AccountService service = (AccountService) ac.getBean("accountService");
        service.saveAccount();

* 2.spring对bean的管理细节(spring对bean容器的管理)

把对象的创建交给spring来管理
1.创建bean的三种方式
2.bean对象的作用范围
3.bean对象的生命周期

(1).创建bean的三种方式
第一种方式:使用默认构造函数创建
        在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时
        采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
<bean id="accountService" class="com.hugong.service.impl.AccountServiceImpl"></bean>

第二种方式:使用普通工厂中的方法创建对象(使某个类中的方法创建对象,并存入spring容器)
<bean id="instanceFactory" class="com.hugong.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
<bean id="accountService" class="com.hugong.factory.StaticFactory"  factory-method="getAccountService"></bean>
(2).bean对象的作用范围
bean的作用范围调整
    bean标签的scope属性:
        作用:用于指定bean的作用范围
        取值:常用的就是单例的和多例的
            singleton:  单例的(默认值)
            prototype:  多例的
            request:    作用于web应用的请求范围
            session:    作用web应该的会话范围
            global-session: 作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session

<bean id="accountService" class="com.hugong.service.impl.AccountServiceImpl" scope="singleton"></bean>
(3).bean对象的生命周期
bean对象的生命周期
        单例对象:
            出生:当容器创建时对象出生
            活着:容器销毁,对象消亡
            死亡:容器单例对象的生命周期和容器相同
        多例对象:
            出生:当我们使用对象时spring框架为我们创建
            或者:对象只要是在使用过程中就一直或者
            死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收

3.Spring的依赖注入(DI)

(1).构造函数注入
<!--  构造函数注入:
      使用的标签:constructor-arg
      标签出现的位置:bean标签的内部
      标签中的属性
            type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
            index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
            name:用于指定给构造函数中指定名称的参数赋值
            =============以上三个用于指定给构造函数中那个参数赋值
            value:用于提供基本类型和String类型的数据
            ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
      优势:
            在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
      弊端:
            改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
-->
<bean id="accountService" class="com.hugong.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value="刘亦菲"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>

<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>
(2).Set方法注入
<!-- set方法注入    (更常用的方式)
        涉及的标签:property
        出现的位置:bean标签的内部
        标签的属性
            name:用于指定注入时所调用的set方法名称
            value:用于提供基本类型和String类型的数据
            ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
        优势:
            创建对象时没有明确的限制,可以直接使用默认构造函数
        弊端:
            如果有某个成员必须有值,则获取对象是有可能set方法没有执行
-->
<bean id="accountService2" class="com.hugong.service.impl.AccountServiceImpl2">
    <property name="name" value="张三"></property>
    <property name="age" value="19"></property>
    <property name="birthday" ref="now"></property>
</bean>
(3).注入集合数据
<!--  复杂类型的注入/集合类型的注入
    用于给List结构集合注入的标签:
        list array set
    用于个Map结构集合注入的标签:
        map  props
 -->
<bean id="accountService3" class="com.hugong.service.impl.AccountServiceImpl3">
    <property name="myStrs">
        <array>
            <value>AAA</value>
            <value>BBB</value>
            <value>ccc</value>
        </array>
    </property>
    <property name="myList">
        <list>
            <value>GGG</value>
            <value>HHH</value>
            <value>III</value>
        </list>
        <!-- 其实在List集合中用array,list,set 三种方式都可以进行存储数据
             互相之间可以进行相互交换   -->
        <!--<set>-->
            <!--<value>GGG</value>-->
            <!--<value>HHH</value>-->
            <!--<value>III</value>-->
        <!--</set>-->
    </property>
    <property name="mySet">
        <list>
            <value>DDD</value>
            <value>eee</value>
            <value>fff</value>
        </list>
    </property>
    <property name="myMap">
        <map>
            <entry key="张三" value="南京"></entry>
            <entry key="李四">
                <value>上海</value>
            </entry>
        </map>
    </property>
    <property name="myProps">
        <props>
            <prop key="田五">湘潭</prop>
            <prop key="赵六">changsan</prop>
        </props>
    </property>
</bean>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐