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

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

时间:2022-08-21 14:11:27浏览次数:63  
标签:容器 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,注入
From: https://www.cnblogs.com/linwenguan/p/16609925.html

相关文章

  • Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构
    背景用注解改造前面Spring博客集里(指Spring02)Spring接管下的三层项目架构对前面Spring博客集里(指Spring04)@Controller+@Service+@Repository3个注解的用法......
  • spring5 事务
    1.事务介绍1.1事务添加到javaEE的service1.2声明式事务和编程试1.3声明式xml事务开发注解方式1.4在Spring中进行事务开发底层用的aop原理1.5Spring事......
  • SpringBoot的基本概念(1)
     1.为什么使用springboot springboot容易上手,做了jar包的版本控制,不用考虑maven依赖,方便敏捷开发,内置tomcat减少开发配置,由于SPI提供对外的starter扩展。 2.spr......
  • Spring源码学习笔记4——BeanFactoryPostProcessor执行
    一丶BeanFactoryPostProcessor是什么Spring留给我们的一个扩展接口,在BeanDefinition加载注册完之后,并执行一些前置操作(笔记3)之后会反射生产所有的BeanFactoryPostProcesso......
  • 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api
    参考CSDN博客链接:https://blog.csdn.net/weixin_39764056/article/details/104402593本人使用IDEA新建了一个Springboot项目,然后导入了spring-boot-start-test依赖,该项目......
  • Spring源码学习笔记6——Spring bean的实例化
    一丶前言前面我们了解到读取xmlor根据扫描路径生成BeanDefinition并注册到BeanFactory,相当于我们具备了生火做饭的原材料:BeanDefinition,接下来就是Spring最为核心的,根据......
  • SpringBoot框架:配置项目在访问后台端口时默认跳转的接口或页面
    一、配置一般需要这种配置的都是前后端一体的项目,在通过后台端口访问时需要默认跳转到某个指定的接口,或者跳转到某个执行的接口。实现WebMvcConfigurer接口,重写a......
  • 第一个Spring Boot项目
    上一节学习了通过Spring官网创建SpringBoot项目,导入了一个demo项目,但是没有写代码运行,这一节就来学习一下怎么运行。1、首先在demo文件夹下创建一个controller包,再创建一......
  • SpringBoot--嵌入式Servlet容器
    一、嵌入式Servlet容器在传统的Web开发中,需要将项目打成war包,在外部配置部署好Tomcat服务器,而这个Tomcat就是Servlet容器,在使用SpringBoot开发时,我们无需再外部......
  • Spring 04: IOC控制反转 + DI依赖注入
    Spring中的IOC一种思想,两种实现方式IOC(InversionofControl):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入核心业务:(a)对象的创建(b)依赖的......