zoukankan      html  css  js  c++  java
  • spring-002-Ioc bean配置

    一、bean命名

    1、直接命名

    1.1、直接使用spring默认命名方式,不指定id;
    1.2、只配置必须的全限定类名,由IoC容器为其生成一个标识;
    1.3、客户端必须通过接口“T getBean(Class<T> requiredType)”获取Bean
     
    <bean class="wang.conge.HelloImpl"/>
    
    HelloImpl hello = application.getBean(HelloImpl.class);

    2、id命名

    每个Bean可以有一个或多个id(或称之为标识符或名字),在这里我们把第一个id称为“标识符”,其余id叫做“别名”;这些id在IoC容器中必须唯一。

    <bean id="testBeanId" class="wang.conge.HelloImpl"/>
    
    HelloImpl hello = application.getBean("testBeanId");

    3、name命名

    指定name,这样name就是“标识符”,必须在Ioc容器中唯一

    <bean name="testBeanName" class="wang.conge.HelloImpl"/>
    
    HelloImpl hello = application.getBean("testBeanName");

    4、id&name 混用

    指定id和name,id就是标识符,而name就是别名,必须在Ioc容器中唯一

    <bean id="testBeanId" name="testBeanName" class="wang.conge.HelloImpl"/>
    
    HelloImpl hello = application.getBean("testBeanId");

    总结:Bean的命名遵循XML命名规范,但最好符合Java命名规范,由“字母、数字、下划线组成“,而且应该养成一个良好的命名习惯, 

    比如采用“驼峰式”,即第一个单词首字母开始,从第二个单词开始首字母大写开始,这样可以增加可读性。推荐采用驼峰式

     二、实例化bean

     1、构造器

    1.1、使用空构造器
    1.2、使用带有参数的构造器
    <bean id="testBeanId1" class="wang.conge.HelloImpl"/>
    <bean id="testBeanId2" class="wang.conge.HelloImpl">
           <constructor-arg index="0" value="Hello conge!"/>  //如果有多个参数,可以传多个参数进行构造
    </bean>
    
    HelloImpl hello = application.getBean("testBeanId1");
    
    HelloImpl hello = application.getBean("testBeanId2");

     2、静态工厂

    2.1、使用这种方式除了指定必须的factory class属性,还要指定factory-method属性来指定实例化Bean的方法
    2.2、使用静态工厂方法也允许指定方法参数,spring IoC容器将调用此属性指定的方法来获取Bean
    public class HelloImplFactory {
        public static HelloImpl newInstance(String message) {
            return new HelloImp(message);
        }
    }
    
    <bean id="testBean" class="wang.conge.HelloImplFactory" factory-method="newInstance">  
         <constructor-arg index="0" value="Hello conge!"/>
    </bean>
    
    HelloImpl hello = application.getBean("testBean");

     3、动态工厂

    3.1、先实例化动态工厂类,使用Spring Ioc容器管理
    3.2、使用factory-bean属性来指定配置的动态工厂bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样
    public class HelloImplFactory {
        public HelloImpl newInstance(String message) {
            return new HelloImp(message);
        }
    }
    
    <bean id="beanFactory"  class="wang.conge.HelloImplFactory"/>
    <bean id="testBean"  factory-bean="beanFactory"  factory-method="newInstance">
        <constructor-arg index="0" value="Hello conge!"/>
    </bean>
    
    HelloImpl hello = application.getBean("testBean");
     
      三依赖注入bean
    spring 推荐类之间采用组合的方式,由spring负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,
    并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。
    1、构造器
    使用构造器注入通过配置构造器参数实现,构造器参数就是依赖。除了构造器方式,还有静态工厂、实例工厂方法可以进行构造器注入
     
    2、setter注入
    2.1、setter注入,是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖
     
    2.2、JavaBean:是本质就是一个POJO类,但具有一下限制:

             2.2.1、该类必须要有公共的无参构造器

             2.2.2、属性为private访问级别,不建议public,如private String message;

             2.2.3、属性必要时通过一组setter(修改器)和getter(访问器)方法来访问;

             2.2.4、setter方法,以“set” 开头,后跟首字母大写的属性名,如“setMesssage”,简单属性一般只有一个方法参数,方法返回值通常为“void”;

             2.2.5、getter方法,一般属性以“get”开头,对于boolean类型一般以“is”开头,后跟首字母大写的属性名,如“getMesssage”,“isOk”;

             2.2.6、还有一些其他特殊情况,比如属性有连续两个大写字母开头,如“URL”,则setter/getter方法为:“setURL”和“getURL”,其他一些特殊情况请参看“Java Bean”命名规范。

    public class HelloImpl{
        private String message;
    
        private void setMessage(String message){
            this.message = message;
        }
    
        public String hello() {
            return "hello:" + message;
        }
    }
    
    
    <bean id="testBean"  class="wang.conge.HelloImpl">
        <property name="message" value="Hello conge!"/> 
    </bean>

    3、引用注入

    依赖了其他bean,依赖注入的名称要相同
     
    public class MessageImpl{
        private String message = "tom";
    
        private String getMessage(){
            return this.message;
        }
    }
    
    public class HelloImpl{
        private MessageImpl messageImpl;
    
        private void setMessageImpl(MessageImpl messageImpl){
            this.messageImpl = messageImpl;
        }
    
        public String hello() {
            return "hello:" + messageImpl.getMessage();
        }
    }
    
    
    
    <bean id="messageImpl"  class="wang.conge.MessageImpl" />
    
    
    <bean id="testBean"  class="wang.conge.HelloImpl">
        <property name="messageImpl" ref="messageImpl"/> 
    </bean>

     4、集合注入

    map,set,list,collection

    四、延迟初始化bean

    延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。

    配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。

     
    五、使用depends-on
    depends-on是指定Bean初始化及销毁时的顺序。
    使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,
    由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。
     
    六、bean的作用域
    1、singleton:指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。
    2、prototype:即原型,指每次向Spring容器请求获取Bean都返回一个全新的Bean,相对于“singleton”来说就是不缓存Bean,每次都是一个根据Bean定义创建的全新Bean。

    在Web应用中,我们可能需要将数据存储到request、session、global session。因此Spring提供了三种Web作用域:request、session、globalSession。 

    3、request作用域:表示每个请求需要容器创建一个全新Bean。比如提交表单的数据必须是对每次请求新建一个Bean来保持这些表单数据,请求结束释放这些数据。

    4、session作用域:表示每个会话需要容器创建一个全新Bean。比如对于每个用户一般会有一个会话,该用户的用户信息需要存储到会话中,此时可以将该Bean配置为web作用域。 

    5、globalSession:类似于session作用域,只是其用于portlet环境的web应用。如果在非portlet环境将视为session作用域。

  • 相关阅读:
    ES6新特性
    浏览器兼容问题
    跨域
    箭头函数与普通函数的区别
    单页面应用
    vue试题
    Git 常用命令
    【分享代码】一个笨办法获取容器的剩余内存
    【笔记】thanos receiver的router模式
    【分享】让prometheus支持PUSH模式,可以使用remote write协议推送数据
  • 原文地址:https://www.cnblogs.com/conge/p/5382917.html
Copyright © 2011-2022 走看看