zoukankan      html  css  js  c++  java
  • Spring4基础 学习笔记(1) Bean

    文章为博主看动力节点Spring教学视频总结的笔记,作为以后查阅使用。

    Spring主要作用为“解耦”
     
    根据功能不同可以将系统中的代码分为:
    主业务逻辑
    系统级业务逻辑:没有具体的专业业务应用场景,为主业务提供系统级服务,例如日志、安全、事务等
     
    Spring根据代码功能特点,将降低耦合度方式分为两类:
              IoC与AOP
    IoC使得主业务在相互调用过程中不用再自己维护关系,即不用再自己创建要使用的对象了。而是有Spring容器统一管理,自动“注入”。
    AOP使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务混杂到主业务逻辑中了,而是由Spring容器统一完成“织入”。
     
    Spring作为一个容器,可以管理对象的生命周期、对象和对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。
     
    IoC(Inversion of Control)
    AOP(Aspect Orient Programming)
     
    IoC:
    依赖查找:JNDI
    依赖注入
     
    配置文件:applicationContext.xml(名字随意,官方建议)
     
    applicationContext容器和BeanFactory容器区别:
    前者在初始化时创建对象,后者在使用时创建
     
    Bean的装配(创建)
    默认装配方式:getBean的时候调用无参构造器(没有会出错)
     
    动态工厂bean:
    <bean id="factory" class="Dynamic_Bean_Factory.ServiceFactory"/>
          <!-- someSerice对象是由对应工厂对应方法创建 -->
    <bean id="someService"factory-bean="factory"factory-method="getSomeSevice"/>
     
    对象由工厂创建但是代码里没有工厂,在配置文件里配置
     
    ISomeService service = (ISomeService) ac.getBean("someService");
     
    静态工厂bean:
         工厂创建bean方法为static的   
     <!-- 由class对应工厂的对应静态方法创建的对象 -->
    <bean id="someService" class="Static_Bean_Factory.ServiceFactory" factory-method="getSomeService"/>
     
    ISomeService service = (ISomeService) ac.getBean("someService");
     
     
    Bean的作用域:
    1.prototype原型模式:每次getBean都会创建新的Bean,且在使用的时候才会创建
    <bean id="someService" class="service.ISomeServiceImpl" scope="prototype"/>
     
    2.singleton单例模式:每次getBean都是同一个对象,初始化applicationContext容器时候创建(默认值)
     
    3.request:对于每次http请求都产生不同Bean
     
    4.session:对于不同的session有不同的Bean
     
    注:对于scope的值request、session、global session只有在Web应用中使用Spring时,才有效。
     
     
    Bean后处理器:是一个特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法。
    由于该Bean由其他Bean自动调用,所以该Bean没有Id。
     
    两个方法:参数1初始化的bean,参数2beanName和bean的id属性对应
     
     
    //bean初始化完成之前
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
     
    //bean初始化完成之后
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
     
     
    Bean后处理器的应用:
    1.修改after方法的返回值为bean的代理对象实现增强
     
    2.为特定的bean增强:增加Condition:判断beanName
     
    bean的初始化前和销毁前可以调用bean的方法:
    init-method="" destroy-method=""/>
     
    其中销毁方法的执行有两个要求:
    1)被销毁的对象需要是singleton
    2)容器要显式地关闭
     
    对象默认是singleton的;appplicationContext接口没有定义关闭方法,定义在实现类中,需要将applicationCnotext强转:
    ((ClassPathXmlApplicationContext)ac).close();
     
     
    Bean的生命周期(可控点):
    1.bean的无参构造器
     
    2.属性的setter
    <bean id="someService" class="lifeOfBean.ISomeServiceImpl" >
                <property name="adao" value="AAA"/>
                <property name="bdao" value="BBB"/>
    </bean>
    3.如果bean实现了beanNameAware接口:
          @Override
          public void setBeanName(String name) {
                // TODO Auto-generated method stub
                System.out.println("Step3 : beanName = " + name);
          }
     
    4.如果bean实现了BeanFactoryAware接口:
    @Override
          public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
                // TODO Auto-generated method stub
                System.out.println("Step4 : 获取到beanFactroy");
          }
    5.bean后处理器的before方法
     
    6.如果bean实现了InitializingBean接口:
          @Override
          public void afterPropertiesSet() throws Exception {
                // TODO Auto-generated method stub
                System.out.println("Step6 : InitializingBean接口的afterPropertiesSet方法");
          }
    标志着bean的初始化工作完成
     
    7.bean配置的init-method方法:
    <bean id="someService" class="lifeOfBean.ISomeServiceImpl" init-method="init_method">
     
    8.bean后处理器的after方法
     
    9.bean的主业务方法
     
    10.如果bean实现了DisposableBean接口(Disposable:一次性):
    @Override
          public void destroy() throws Exception {
                // TODO Auto-generated method stub
                System.out.println("Step10 : ");
          }
    这个方法的执行需要对象是单例的和容器手工关闭
     
     
    11.bean配置的destory-method
     
    匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id
     
    内部bean:将bean放在property内,id为property的name :
    <bean id="stu" class="di01.Student">
                <property name="">
                      <bean class=""></bean>
                </property>
          </bean>
     
    匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id
     
    内部bean:将bean放在property内,id为property的name :
    <bean id="stu" class="di01.Student">
                <property name="">
                      <bean class=""></bean>
                </property>
          </bean>
     
    同类抽象bean:
    bean可以继承另一个bean:
    <bean parent="">会继承parent的class和property
    用来被继承的bean没有意义,将abstract属性定义为true
     
     
    异类抽象bean:
              被继承的bean没有class属性,必须将abstract定义为true
     
    如有错误,欢迎指正。
  • 相关阅读:
    js变量的作用域问题
    HTML网页公用头部与尾部的一些方法
    拖动对象ondrag
    子div设置float后导致父div无法自动撑开的问题
    js像素运算问题
    js自动轮播图片的两种循环方法(原创)
    display:none显示和隐藏
    Linux shell脚本基础学习详细介绍(完整版)一
    java技术思维导图(转载)
    VIM编辑命令的技巧
  • 原文地址:https://www.cnblogs.com/coderlynn/p/8654153.html
Copyright © 2011-2022 走看看