其他分享
首页 > 其他分享> > 【博学谷学习记录】超强总结,用心分享。 Spring核心容器

【博学谷学习记录】超强总结,用心分享。 Spring核心容器

作者:互联网

Spring Framework 系统架构

    一.核心容器

      1.概念:

        代码书写现状:耦合度偏高

        解决方法:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象

      IoC控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转

      Spring提供了容器,称为Ioc容器,用来充当IoC思想中的“外部”,就是控制反转中new的对象放置的外部,IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中称为Bean

      在业务层service中的对象依赖dao对象运行,而在Ioc容器中也有dao,则service会和dao建立依赖,也就是在容器中建立bean和bean之间的依赖关系的整个过程,称为依赖注入DI

      2.充分解耦的方法

        1)使用IoC容器管理bean(Ioc)

        2) 在IoC容器内将有依赖关系的bean进行关系绑定(DI)

      3.IoC入门案例

        1).管理Service和Dao

        2).使用配置将被管理的对象告知IoC容器

        3).被管理的对象交给IoC容器,可以通过接口获取到IoC容器

        4).IoC容器得到后,通过接口方法从容器中获取bean

        5).Spring从pom.xml导入目标

      4.步骤

        1)导入Spring坐标

        2)编写xml文件

        

<!--    1.导入spring的左边-->
<!--        2.配置bean-->
<!--        bean标签配置bean-->
<!--        id属性标示bean起名字-->
<!--        class属性标示给bean定义类型-->
    <bean id="bookDao11" class="com.study.dao.impl.BookDaoImpl"/>
    <bean id="bookService11" class="com.study.service.impl.BookServiceImpl"/>

        3)获取IoC容器

        4)获取bean

        

//        3.获取IoC容器
 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//        获取bean
        BookDao bookDao1 = (BookDao) context.getBean("bookDao11");
        bookDao1.save();

  

      5.DI入门案例

        1)基于IoC管理bean

        2)Service中使用new形式创建Dao对象不保留

        3)Service中需要的Dao对象通过提供方法进入到Service中

        4)Service与Dao间的关系通过配置

      6.步骤

        1)删除使用new的形式创建对象的代码

        2)创建setter方法

        3)在xml文件中对service和dao进行绑定

        

 //5.删除业务层中使用new的方式创建的dao对象
    private BookDaoImpl bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    //6.提供对应的set方法

    public void setBookDao(BookDaoImpl bookDao) {
        this.bookDao = bookDao;
    }
}

        

 <bean id="bookDao" class="com.study.dao.impl.BookDaoImpl"/>​    <bean id="bookService" class="com.study.service.impl.BookServiceImpl">      
 <property name="bookDao" ref="bookDao"/>    
 </bean>      

  

        7.Bean的作用范围

          名称scope

          类型:属性

          所属:bean标签

          功能:定义bean的作用范围:singleton:单例(默认)同样地址   prototype:非单例 不一样地址

          范例: <bean id="bookDao" class="com.study.dao.impl.BookDaoImpl" scope="prototype"/>

          问题:为什么bean默认为单例?

          因为spring帮我们管理的对象都是可以复用的对象,这样才能提高效率

        8.实例化bean的三种方式-----构造方法(常用)

package com.study.dao.impl;

import com.study.dao.BookDao;
import com.study.service.BookService;

public class BookDaoImpl implements BookService {
    public BookDaoImpl() {
        System.out.println("我是无参构造方法");
    }

    public void save() {
        System.out.println("book dao save ...");
    }
}

        注意:无参构造方法如果不存在,将会抛出异常BeanCreationException

       9.实例化bean的三种方式-----静态工厂

<bean id="OderDao" class="com.study.Factory.AppOrder" factory-method="getOderDao"/>

    

public class AppOrder {
    public static OrderDaoImpl getOderDao(){
        System.out.println("实例化工厂对象");
        return new OrderDaoImpl();
    }
}

      10.实例化bean的三种方式-----实例工厂

 
  <bean id="userDaoFactory" class="com.study.Factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userDaoFactory"/>
public class UserDaoFactory {
    public UserDao getUserDao(){
        System.out.println("userdao");
        return new UserDaoImpl();
    }
}

      11.使用FactoryBean实例工厂(重要)、

  

package com.study.Factory;

import com.study.dao.UserDao;
import com.study.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }

    @Override
    public boolean isSingleton() {
//        //不是单例
//        return  false;
        //是单例
        return true;
    }
}

  

    <bean id="UserDao" class="com.study.Factory.UserDaoFactoryBean"/>

        12.Bean的生命周期

          初始化容器

          1)创建对象(内存分配)

          2)执行构造方法

          3)执行属性注入(set操作)

          4)执行bean初始化方法

          使用bean

           1)执行业务操作

          关闭/销毁容器

            1)执行bean销毁方法

            2)关闭容器方式

              手工关闭容器

              ConfigurableApplication接口的close操作

              注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机

              registerShutdownHook()操作

        13.依赖注入

          构造器注入--引用类型

 

 

 

 

          注意:简单类型配置和引用类型配置相似,先定义,然后使用setter方法,之后在配置中使用property标签value属性注入简单类型数据

     14.setter注入---简单类型

      

 

         注意:简单类型配置和引用类型配置相似,先定义,然后使用setter方法,之后在配置中使用property标签value属性注入简单类型数据

     15.依赖注入方式选择

        1).强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现

        2)可选依赖使用setter注入进行,灵活性强

        3)Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨

        4)如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入

        5)实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入

        6)自己开发的模块推荐使用setter注入

        总结:能用setter注入就用setter注入,没有办法才用构造器注入

    16.依赖自动装配

       IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

       特征

        自动装配用于引用类型依赖注入,不能对简单类型进行操作

        使用按类型装配必须保障容器中相同类型的bean唯一,推荐使用

        使用按名称装配时,必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用

        自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

    17.集合注入的五种类型 

<?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="bookDao" class="com.study.dao.impl.BookDaoImpl">
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="1" value="2"></entry>
                <entry key="2" value="5"></entry>
                <entry key="3" value="3"></entry>
            </map>
        </property>
        <property name="set">
            <set>
                <value>ww</value>
                <value>wwqw</value>
                <value>wwee</value>
            </set>
        </property>
        <property name="properties">
            <props>
                <prop key="sd"></prop>
                <prop key="sdd"></prop>
                <prop key="sds"></prop>
            </props>
        </property>
    </bean>
</beans>

  

     18.Spring管理第三方资源
<?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   class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_db"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxPoolSize" value="1000"/>
    </bean>
</beans>

  

      19.加载properties文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context
                             http://www.springframework.org/schema/context/spring-context.xsd">
  
    
    <!--       1.开启context命名空间-->
<!--    2.使用context命名空间,加载指定properties文件-->
    <context:property-placeholder location="jdbc.properties"/>
<!--    3.使用${}读取加载的属性值-->
    <property name="username" value="${jdbc.username}"/> 
</beans>

  一些关于Spring的容器的内容,有很多不足,后续会继续补充

 

        

 

 

    

        

标签:容器,Spring,博学,bean,超强,setter,IoC,public,注入
来源: https://www.cnblogs.com/linwenguan/p/16609925.html