zoukankan      html  css  js  c++  java
  • Spring入门

    Spring 第一天

    学习Spring的容器功能,就是创建管理对象的能力

    使用Spring

    1. 添加依赖——使用IDEA开发工具建立maven项目

      1 <dependency>
      2   <groupId>org.springframework</groupId>
      3   <artifactId>spring-context</artifactId>
      4   <version>5.0.2.RELEASE</version>
      5 </dependency>
    2. 创建XML文件:使用XML文件配置Bean

        使用XML文件配置元数据,让Spring能够管理Bean的实例和依赖关系。

        要通过XML在Spring IOC容器里声明Bean,首先需要创建XML Bean配置文件,我们在项目的源代码src目录想创建一个名叫beans.xml的配置文件,然后写出一个基于XML配置的基本结构。

    1. 1 <?xml version="1.0" encoding="UTF-8"?>
      2 <beans xmlns="http://www.springframework.org/schema/beans"
      3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      5    <!--配置Bean-->
      6 </beans>

        在使用基于XML的方式配置元数据的时候,XML有一个根元素就是beans,我们需要在<beans>元素中添加一个或者多个<bean>元素,<bean>元素的配置根据需要和应用程序中实际使用的对象一一对应。

    1. 配置bean

       1 <!--方法一:值接class配置,实例化的是class代表的对象-->
       2   <!--别名使用空格,分号,逗号均可以,还可以混合使用-->
       3   <bean id="stu" name="ss student,stus" class="com.Student"/>
       4  5 <!--方法二:工厂方法-->
       6   <!--静态-->
       7   <bean id="stuFactory" class="com.StudentFactory" factory-method="getStudent"/>
       8   <!--非静态-->
       9   <bean id="tea" class="com.StudentFactory"/>
      10   <bean id="teaFactory" class="com.StudentFactory" factory-bean="tea" factory-method="getTeacher"/>
      11 12 <!--方法三:FactoryBean-->
      13   <bean id="factoryBean" class="com.StudentFactoryBean"/>

       事实上,关于bean配置还有很多其他的属性,如下图,<bean>常见的属性。

    属性名 可能值 默认值 作用
    id     Bean的唯一标识名。它必须是合法的XML ID,在整个XML文档中唯一
    name    

    用来为id创建一个或者多个别名,它可以是任意的字母符号,可以指定多个别名,多个别名之间用逗号或者空格分开

    class     用来定义类的权限定名
    parent    

    Bean可以定义它所引用它的父类Bean的配置,指定了parent后Bean会继承parent都所有配置,

    子类Bean也可以覆盖父类Bean的配置,采用这种方式可以达到配置重用的目的

    abstract

    true

    false

    false 用来Bean是否为抽象Bean。它表示这个Bean将不会被实例化,一般用于父类Bena,因为父类Bean主要是供子类Bean继承使用
    singleton

    true

    false

    true

     定义Bean是否是singleton(单例配置模式),如果设为“true”,则在BeanFactory 作用范围内,只维护此Bean 的一个实例。

    如果设为“flase”,Bean 将是Prototype (原型) 状态,BeanFactory 将为每次Bean 请求创建一个新的Bean 实例。

    lazy-init

    true

    false

    default

    default

     用来定义这个Bean 是否实现懒初始化。如果为“true”,它将在BeanFactory 启动时初始化所有的Singleton Bean.反之,

    如果为“false”,它只在Bean 请求时才开始创建Singleton Bean。

    autowire

    no

    byName

    byType

    constructor

    autodetect

    no

     no: 不使用自动装配功能。

    byName:通过Bean 的属性名实现自动装配。

    byType:通过Bean 的类型实现自动装配。

    const ructor: 类似于byType,但它是用于构造函数的参数的自动组装。

    autodetect" :通过Bean 类的反省机制(introspection)决定是使用“constructor”还是使用“byType”

    depends-on      这个Bean 在初始化时依赖的对象,这个对象会在这个Beam初始化之前创建
    init-method      用来定义Bean的初始化方法,它会在Bean 组装之后调用。它必须是一个无参数的方法
    destroy-on      用来定义Bean的销毁方法,它在BeanFactory 关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singleton Bean
    factroy-method      定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效
    factory-bean      定义创建该Bean 对象的工厂类。如果使用了“factory-bean”则“class”属性失效
    scope

    singleton

    prototype

    request

    session

    globalsession

       设置bean 的作用域request,session,global session仅用于Web 应用中
    1. 实例化上下文类

      1 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("appSpring.xml");
    2. getBean得到对象

      1 Student student = (Student) applicationContext.getBean("stu"); 2 student.test();

    name

    分隔符是什么? 分隔符可以混用吗? 多个bean的name配置可以有相同的吗?

    1 <!--别名使用空格,分号,逗号均可以,还可以混合使用,多个bean的name配置相同会报错-->
    2   <bean id="stu" name="ss student,stus" class="com.Student"/>

    配置的3种方式

    • 直接class配置,实例化的是class代表的对象

    • 工厂方法

      • factory-method

      • factory-bean factory-method ,factory-bean可以指向自己吗?

    • FactoryBean

    作用域

    singleton

    Singleton :由容器管理对象的生命周期,也就是说容器存在,对象就创建出来(设定的init方法会执行,容器销毁,管理的对象也会销毁

    当一个bean的 作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把 一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都 将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中 只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时 候,spring的IOC容器中只会存在一个该bean。

    
    
    1 <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
    2 或者
    3 <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

    Prototype

    Prototype:getBean的临时产生一个,产生之后的对象,spring容器就不管理,由程序自己去管理它的销毁

    prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。 清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)

    1 <bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
    2 或者
    3 <bean id="role" class="spring.chapter2.maryGame.Role" singleton="false"/>

    全局的配置:

    <beans default-init-method="开始方法名" default-destroy-method="销毁方法名"></beans>

    调用销毁方法

    ((ConfigurableApplicationContext)applicationContext).close();

    多配置文件

    import

     1 <!--appSpring.xml配置-->
     2 <import resource="appSpring2.xml"></import>
     3 
     4 <!--appSpring2.xml配置-->
     5 <?xml version="1.0" encoding="UTF-8"?>
     6 <beans xmlns="http://www.springframework.org/schema/beans"
     7        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     8        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     9 10     <bean id="stu" class="com.Student"/>
    11 </beans>

    new xxx("","")

     1 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("appSpring.xml","appSpring2.xml"); 

    验证:每个文件里面配置一个beangetBean的时候都能得到

    Spring核心组件

    1. 容器类,比如ApplicationContext,BeanFactory,WebApplicationContext

    2. 自己的POJO,比如service类,dao类,entity类

    3. 配置的元数据

      1. xml

      2. 注解

      

      你自己的POJO类

     1 public class UserDao{
     2   public void insert(){----}
     3 }
     4 
     5 public class UserService{
     6   private UserDao dao;
     7   
     8   //getter,setter
     9   
    10   public void insert(){
    11     dao.insert();
    12   }
    13 }

      元数据

    1 <bean id="dao" class="UserDao"/>
    2 <bean id="service" class="UserService">
    3     <property name="dao" ref="dao    "></property>
    4 </bean>

      容器类

    1 ApplicationContext app = new ClassPath***ApplicationContext
    2 app.getBean("service")
    1 UserService service = new UserService();
    2 service.insert();

    Spring管理的pojo

      entity类型不需要管理?

      HttpServletRequest,不能被spring容器管理,因为它是由Tomcat容器实例化

    ​  自己写的Servlet能被spring管理吗? 也不能被Spring管理,也就是说不是pojo

    能被Spring管理的

    • Service类型
    • dao类型
    • 控制器类型(比如Struts2里面的Action)
  • 相关阅读:
    浅谈图标布局
    和浏览器异步请求取消相关的那些事
    chrome浏览器的跨域设置——包括版本49前后两种设置
    cordova加载层、进度条、文件选择插件
    js构建ui的统一异常处理方案(四)
    js构建ui的统一异常处理方案(三)
    通过 IntelliJ IDEA 来 Debug Jar包
    JPA使用Specification like查询时特殊字符%和_处理问题 Escape示例
    java8新特性:利用Lambda处理List集合
    让开发部署提速的 IDEA 插件神器攻略(转)
  • 原文地址:https://www.cnblogs.com/sunduge/p/8289850.html
Copyright © 2011-2022 走看看