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
 
如有错误,欢迎指正。
posted @ 2018-03-26 21:37  CoderLynn  阅读(212)  评论(0编辑  收藏  举报