zoukankan      html  css  js  c++  java
  • spring学习一:spring入门及相关概念介绍

      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>
          View Code
      • 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方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
          View Code
        • @Qualifier:一般用@Autowired和@Resource配合,按名字装配注入:
          @Autowried
          @Qualifier("user")
          private User u;
          View Code
      • 其他注解:
        • @ContextConfiguration(Locations="../applicationContext.xml")单个配置文件;
        • 
           @ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" }) 多个配置文件
                    

    3:对Ioc的一点理解  

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

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

        spring容器的高层视图

                    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命名空间、注解等多种注入方式。

      

      

      

  • 相关阅读:
    我的那些年(11)~去一家创业公司做架构师
    springboot~hazelcast缓存中间件
    我的那些年(10)~来到更大的团队,做了架构师
    springboot~maven制作底层公用库
    Vesions ignore & ld: library not found for -l...
    iOS利用单例实现不同界面间的数据传输
    UVA 10006
    VS2010打开就自动关闭问题解决
    模板方法模式(Template Method)
    HDU 4279
  • 原文地址:https://www.cnblogs.com/whtblog/p/9045036.html
Copyright © 2011-2022 走看看