ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-21 14:32:54  阅读:156  来源: 互联网

标签:容器 Spring 博学 bean 超强 setter IoC public 注入


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有