1:Spring的概念:(03年兴起)

  (1)   开源的轻量级的框架(无需复杂的环境,不依赖其他)

  (2)   一站式框架(Spring在javaee的三层结构中,对每一层都提供不同的解决技术:

    • Web层:SpringMVC;
    • service层:Spring的ioc;
    • dao层:Spring的jdbcTemplate;

  Spring核心特征:

    • AOP:面向切面编程,对业务的重复逻辑进行抽取,提高开发效率(如日志和权限的控制);
    • IOC:控制反转,将类的管理交给spring的配置文件,通过DI(依赖注入)注入对象属性。  

2:ioc的两种方式:

  2.1:xml配置文件进行bean的管理;实现方式:xml->dom4j解析->工厂模式->反射技术;

     ApplicationContext ctx=new ClassPathXmlApplicationContext("***.xml"); 

     User user=(User)ctx.getBean("xml中User类的id名称"); 

    2.1.1:xml管理bean的方式:

    • bean中有构造器        

      • 无参构造方法(重,最常用):User类中无其他构造器,xml中: <bean id="user" class="com.wht.User"></bean> ,配合使用注解或set等注入属性;
      • 有参构造方法:User类有有参构造器;在xml的bean中需要用:  <constructor-arg name="name" value="王小五"></constructor-arg> 指定构造参数。
    • 属性注入常用方式:
      • setter方式注入: <property>和<constructor-arg> 

        <bean name="course" class="com.spring.bean.Course">
        <!--set方式注入属性-->
        <property name="name" value="韩梅梅"></property>
        <property name="page" value="136"></property>
        </bean>
        <!--通过有参数构造函数注入:注意Student中的构造函数,stu1的构造注入中调用了course的set注入,type="java.lang.String"-->
        <bean name="stu1" class="com.spring.bean.Student">
        <!--Student中含有Course对象属性-->
        <!--Student中带有有参数构造器-->
        <constructor-arg index="0" value="王大拿"></constructor-arg>
        <constructor-arg index="1" ref="course"></constructor-arg>
        </bean>
      • 有参构造器注入:同上;
      • 接口方式:基本不用(spring不支持)
      • p命名空间注入:引入p命名空间, p:pname="王小五"
      • 复杂数据的注入:注入数组: 
        //注入数组:
        <property name="list">
        <list>
        <value>1</value>
        <value>2</value>
        </list>
        </property> //注入map
        <property name="map">
        <map>
        <entry key="1" value="tom">
        <entry key="2" value="cindy">
        </map>
        </property> //注入配置
        <property name="pro[erties">
        <props>
        <prop key="driverClass">com.mysql.jdbc.Driver</prop>
        <prop key="username" >root</prop>
        </props>
        </property>
    • scop指定作用域:

      <bean id="rose" class="com.spring.User" scope="prototype">或者singleton(单例);request;session;globle;application;等

  2.2:spring注解管理bean:注解略微增加了耦合性,尽量与xml方式配合使用;

    2.2.1:开启注解扫描:

      • 最常用:扫描bean包所有类中的注解: <context:component-scan base-package="com.spring.bean"></context:component-scan> 
      • 可以通过属性设置,精确扫描范围: resource-pattern;include-filter;exclude-filter等 

    2.2.2:常用注解:

    • 类级别注解:@Component、@Repository、@Controller、@Service,一般用第一个。 @Component(“user”):当前bean在ApplicationContext中名字为user;若没有提供,默认简单类名且首字母小写。
    • @scope指定范围: @Scope("prototype")
    • 类内自动装配注解: @Autowired、@Qualifier、@Resource
      • @Autowired:按类型(byType)装配注入:

        如:@Autowired
        private User u;
        1:spring现在容器中找类型为User的bean,没有报BeanCreationException 异常;
        2:若找到且只有一个,注入。
        3:若找到且不止一个,找名字为user的bean。

        注入步骤

      • @Resource:按名称(byName)装配注入,其次按类型注入;
        @Resource(name=“user”)
          1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
          2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
          3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
          4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
      • @Qualifier:一般用@Autowired和@Resource配合,按名字装配注入:
        @Autowried
        @Qualifier("user")
        private User u;
    • 其他注解:

      • @ContextConfiguration(Locations="../applicationContext.xml")单个配置文件;
      • 
        

         @ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" }) 多个配置文件
                  

3:对Ioc的一点理解

主要参考了一些博客与公众号文章,说说自己的理解,难免有误!

https://mp.weixin.qq.com/s/YVdT_fUDDUh9ebB-AFRDdg

    

                spring容器的高层视图

1:Ioc容器:

对spring来说,spring通过配置文件描述了bean之间的依赖管理,spring中的Ioc容器负责具体的bean的管理。Ioc容器通过反射技术实例化这些bean,并创建这些bean之间的相互依赖关系,并提供注入实例代理,事务,实例缓存等一系列功能。

  • BeanFactory:一般称之为Ioc容器。是spring框架的基础,最核心接口,面向spring本身;

    • 最主要的方法就是BeanFactory.getBean(String)
    • XmlBeanFactory继承了BeanFactory,通过Resource装载配置文件并启动Ioc容器。继而可以通过上述方法获取bean;
    • 单实例( singleton)的 Bean,BeanFactory会缓存其实例(HashMap实现的缓存器)。
    • 通过BeanFactory启动Ioc容器时,不会初始化配置文件中的bean,初始化发生在第一个bean的调用时
  • ApplicationContext:一般称之为应用上下文,有时也称之为Ioc容器。面向开发者,继承自BeanFactory。
    • 与BeanFactory不同,ApplicationContext在初始化应用上下文时 就实例化所有的Bean。
    • [ClassPathXml/FIleSystemXml]ApplicationContext等可以从不同目录下加载配置信息。
  • WebApplicationContext:专为Web应用准备;

容器加载Bean的原理:

  step: 

  1. BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;
  2. 容器扫描BeanDefinitionRegistry中的BeanDefinition;调用InstantiationStrategy进行Bean实例化的工作;使用BeanWrapper完成Bean属性的设置工作;
  3. 单例Bean缓存池:Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以 beanName 为键保存在这个HashMap 中。

  创建Bean实例(未注入属性):通过java的反射机制,利用bean的名字,通过工厂化的方法产生bean实例(

                个人感觉这块更像是用 Class.forName("location").newInstance(); 实现)。

  设置bean属性:通过java反射机制(比如通过反射获取对应的构造器或者setter方法)。

          可以使用setter注入、构造器、p命名空间、注解等多种注入方式。

  

  

  

spring学习一:spring入门及相关概念介绍的更多相关文章

  1. Spring学习(十一)-----Spring使用@Required注解依赖检查

    Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...

  2. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

  3. spring 学习 一 spring 介绍

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  4. spring学习之spring入门

    一 spring的基础 1:什么是spring spring是由Rod Johnson组织和开发的一个分层 的Java SE/EE 一站式轻量级开源框架,它以Ioc(控制反转)和 AOP(面向切面编程 ...

  5. Spring学习【Spring概述】

    从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架. 当中採用IoC原理实现的基于Java Beans的配置管理和AOP的思想都是非常值得学习与使用的.以下 ...

  6. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...

  7. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  8. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  9. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

随机推荐

  1. python-利用xlrd模块读取excel数据,将excel数据转换成字典格式

    前言 excel测试案例数据 转换成这种格式 实现代码 import os import xlrd excel_path = '..\data\\test_case.xlsx' data_path = ...

  2. 神奇!这款 Vue 后台框架居然不用手动配置路由

    前言 做 Vue 开发脱离不了路由,尤其是中大型项目,页面多且杂,在配置路由的时候总是会变得逐渐暴躁,因为费时,并且又没有什么太多技术含量,总觉得是在浪费时间. 另外如果接手了别人的项目,当业务有变更 ...

  3. “四大高手”为你的 Vue 应用程序保驾护航

    全球都在处理数字化转型的问题,飞速发展的同时也为基础设施带来了一定的压力.同时许多黑客也在不断更新升级他们的攻击技术. 如果我们的应用程序有过多漏洞,被抓按住利用,就会变成大型芭比Q现场. 这也是为何 ...

  4. Ubuntu更新命令无法执行的,下一步该怎么办?

    对Linux的系统学习的更加深入,所以今天笔者正在Ubuntu20.04 LTS 上部署Sublime Text 的环境时 , 由于对操作的不熟悉,踩了一些坑.拿出来和大家分享. 正在我对照着官方文档 ...

  5. 【windows 操作系统】Windows系统机制之对象管理器

    转载自 Windows系统机制之对象管理器 设计的几个目的: 提供一种公共统一的机制来使用系统资源 将对象保护隔离到OS中的一个地方,从而确保统一的一致的对象访问策略 提供一种机制来管理进程对对象的使 ...

  6. linux时钟校准

    ## 查看系统时间 date ## 查看硬件时间 hwclock ## 手动设置时间 date -s "20210507 17:55:00" ## 同步硬件时间 hwclock - ...

  7. shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令

    转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单,  无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...

  8. AcWing 207. 球形空间产生器

    传送门 思路: 设球心坐标为(x1,x2,...,xn),有 ,由此我们可以列出N+1个二次方程,我们可以对前后两个方程做差,来得到N个一次方程,同时可以消掉常数C,第i个方程即 那么我们就可以直接采 ...

  9. 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法

    之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...

  10. pandas模块篇(之三)

    今日内容概要 目标:将Pandas尽量结束 如何读取外部excel文件数据到DataFrame中 针对DataFrame的常用数据操作 索引与切片 操作DataFrame的字段名称 时间对象序列操作 ...