ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

ag旗舰厅

当前位置:ag旗舰厅官网 > ag旗舰厅 > Spring中Bean的命名方式代码详解,IOC的配置使用

Spring中Bean的命名方式代码详解,IOC的配置使用

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-10-07 12:06

Spring中Bean的命超格局代码详解,springbean

本文首要汇报的是关于spring中bean的命名情势,通过简单实例向大家介绍了两种艺术,具体如下。

日常意况下,在配置三个Bean时索要为其钦点贰个id属性作为bean的称谓。id在IoC容器中必须是不二法门的,别的id的命名需求满意xml对id的命名典型。

在其真实情情形中,id命名约束并不会给我们带来影响。不过借使客户真正希望用到有的特殊字符来对bean进行命名,那么能够选拔bean的name属性来打开命名,name属性未有字符上的界定,大约能够行使另外字符。

每种Bean能够有一个或多个id,大家把第三个id称为“标记符”,别的id叫做“别名”,那几个id在IoC容器中必需独一。

先是来介绍一下Beanid的命名准则:

1.遵守XML命名标准
2.由字母,数字,下划线组成
3.驼峰式,首个单词字母小写,从第三个单词初阶首字母大写。

接下去我们运用具体的例证来介绍Bean的例外命超级模特式

1.配置全限定类名,独一

在示范中第平昔大家输出问候音讯,大家必要七个HelloWorld接口以及贰个称谓为HelloWorldImpl的达成类。接下来我们成立二个陈设文件和二个前后相继的入口类。

率先在项目中开创包definition,接下去在包中开创HelloWorld接口:

public interface HelloWorld { 
  public void sayHello(); 
} 

接下去大家创设HelloWorldImpl完毕类:

public class HelloWorldImpl implements HelloWorld{ 
  public void sayHello() { 
    System.out.println("Hello World"); 
  } 
} 

接下去大家在配备文件中为HelloWorldImpl实行Bean的命名:

<bean class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 

咱俩在前后相继入口Mian.java来加载配置文件以及运维示例。

public static void sayHelloWorldByClass(){ 
  //使用FileSystemXmlApplicationContext加载配置文件信息 
  BeanFactory beanFactory= 
     new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  //获取bean实例 
  HelloWorld helloWorld=beanFactory.getBean(HelloWorldImpl.class); 
  helloWorld.sayHello(); 
} 

在Main.java文件在那之中大家须要:

 1.产生布局文件的加载以及SpringIoC容器的运维
 2.从容器中收获HelloWorldImpl达成类的实例
 3.输出问候消息

2.指定id,唯一

在安顿文件中对bean进行布局

<bean id="HelloWorldById" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 

修改Main程序入口,新建艺术来调用bean

public static void sayHelloWorldById(){ 
  BeanFactory factory= 
      new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  HelloWorld helloWorld=factory.getBean("HelloWorldById",HelloWorldImpl.class); 
  helloWorld.sayHello(); 
} 

3. 点名name,name为标志符,独一

在配备文件中对bean进行安插

<bean name="HelloWorldByName" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 

修改Main程序入口,新建艺术来调用bean

public static void sayHelloWorldByName(){ 
  BeanFactory factory= 
      new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  HelloWorld helloWorld=factory.getBean("HelloWorldByName",HelloWorldImpl.class); 
  helloWorld.sayHello(); 
} 

4.点名id和name,个中id为标识符,name为小名,独一

在布局文件中对bean进行安排

<bean id="HelloWorldById01" name="HelloWorldByName01" 
   class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 

修改Main程序入口,新建艺术来调用bean

public static void sayHelloWorldByNameAndId(){ 
  BeanFactory factory= 
      new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  HelloWorld helloWorld01=factory.getBean("HelloWorldById01",HelloWorldImpl.class); 
  HelloWorld helloWorld02=factory.getBean("HelloWorldByName01",HelloWorldImpl.class); 
  helloWorld01.sayHello(); 
  helloWorld02.sayHello(); 
} 

5. 点名三个name,当中多少个name供给用分号来张开剪切,第一个name为标记符,别的的为别称,唯一

在计划文件中对bean实行布局

<bean name="bean1;alias01;alias02;alias03" 
   class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 
<bean id="bean2" name="alias11;alias12;alias13" 
   class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 

修改Main程序入口,新建艺术来调用bean

public static void sayHelloWorldByMutilName(){ 
  BeanFactory factory= 
      new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  HelloWorld helloWorld1=factory.getBean("bean1",HelloWorldImpl.class); 
  HelloWorld helloWorld01=factory.getBean("alias01",HelloWorldImpl.class); 
  HelloWorld helloWorld02=factory.getBean("alias02",HelloWorldImpl.class); 
  HelloWorld helloWorld03=factory.getBean("alias03",HelloWorldImpl.class); 
  helloWorld1.sayHello(); 
  helloWorld01.sayHello(); 
  helloWorld02.sayHello(); 
  helloWorld03.sayHello(); 

  HelloWorld helloWorld2=factory.getBean("bean2",HelloWorldImpl.class); 
  HelloWorld helloWorld11=factory.getBean("alias11",HelloWorldImpl.class); 
  HelloWorld helloWorld12=factory.getBean("alias12",HelloWorldImpl.class); 
  HelloWorld helloWorld13=factory.getBean("alias13",HelloWorldImpl.class); 
  helloWorld2.sayHello(); 
  helloWorld11.sayHello(); 
  helloWorld12.sayHello(); 
  helloWorld13.sayHello(); 
} 

6. 点名外号,使用alias标签来张开点名,独一

在配置文件中对bean实行配备

<bean name="bean3" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/> 
<alias name="bean3" alias="alias21"/> 
<alias name="bean3" alias="alias22"/> 

修改Main程序入口,新建艺术来调用bean

public static void sayHelloWorldByAlias(){ 
  BeanFactory factory= 
      new FileSystemXmlApplicationContext("src/conf/conf-definition.xml"); 
  HelloWorld helloWorld01=factory.getBean("bean3",HelloWorldImpl.class); 
  HelloWorld helloWorld02=factory.getBean("alias21",HelloWorldImpl.class); 
  HelloWorld helloWorld03=factory.getBean("alias22",HelloWorldImpl.class); 
  helloWorld01.sayHello(); 
  helloWorld02.sayHello(); 
  helloWorld03.sayHello(); 

} 

行使小名命名时得先有一个独一的称呼(id和name都得以)

总结

如上正是本文关于Spring中Bean的命名方式代码详解的全部内容,希望对我们持有利于。感兴趣的情侣能够承袭参照本站:

《浅谈Spring中Bean的效率域、生命周期》

《Spring实例化bean的点子代码详解》

《Spring工厂方法创立(实例化)bean实例代码》

如有不足之处,招待留言提议。多谢朋友们对本站的帮忙!

本文首要描述的是有关spring中bean的命名格局,通过轻松实例向我们介绍了种种办法,具体如下。...

1.1.1 XML计划的结构
平时配备文件结构如下:

<beans>
    <import resource=”resource1.xml” />
    <bean id=”bean1” class=””></bean>
    <bean name=”bean2” class=””></bean>
    <alias alias="bean3" name="bean2" />
    <import resource=”resource2.xml” />
</beans>

1、<bean>标签首要用以实行Bean定义;
2、alias用于定义Bean外号的;
3、import用于导入其他陈设文件的Bean定义,这是为着加载八个布局文件,当然也得以把这几个配置文件构造为三个数组(new String[] {“config1.xml”, config2.xml})传给ApplicationContext达成进行加载多个布局文件,那一个更适合由客户决定;那三种办法都以经过调用Bean Definition Reader 读取Bean定义,内部贯彻未有另外不同。<import>标签能够献身<beans>下的别的地点,未有各种关系。

1.1.2 Bean的配置
Spring IoC容器指标便是处理Bean,那么些Bean将依据安插文件中的Bean定义举办创办,而Bean定义在容器内部由BeanDefinition对象表示,该定义首要富含以下新闻:
●全限定类名(FQN):用于定义Bean的兑现类;
●Bean行为定义:这一个概念了Bean在容器中的行为;包涵功效域(单例、原型创设)、是还是不是惰性开始化及生命周期等;
●Bean创造方式定义:表明是经过构造器照旧工厂方法创建Bean;
●Bean之间关系定义:即对其他bean的引用,也正是依靠关系定义,那些引用bean也得以叫做同事bean或信任bean,也正是正视注入。

Bean定义独有“全限定类名”在当使用构造器或静态工厂方法进行实例化bean时是必须的,别的都以可选的概念。难道Spring只能经过配备情势来创造Bean吗?回答当然不是,某个SingletonBeanRegistry接口完毕类完成也同意将这几个非BeanFactory创立的、已某些客户对象注册到容器中,那几个指标必得是共享的,举个例子利用DefaultListableBeanFactory 的registerSingleton() 方法。可是建议选拔元数据定义。

1.1.3 Bean的命名
各样Bean能够有叁个或多少个id(或称为标记符或名字),在此地大家把第多个id称为“标志符”,其余id叫做“外号”;那么些id在IoC容器中必得独一。怎么着为Bean钦点id呢,有以下二种艺术:
一、不点名id,只安排必得的全限定类名,由IoC容器为其生成贰个标志,客商端必得通过接口“T getBean(Class<T> requiredType)”获取Bean;比如:

<bean class=”com.ljq.test.HelloWorldImpl”/>

测量试验代码片段如下:

@Test
public void sayHello() {
    BeanFactory beanFactory =
              new ClassPathXmlApplicationContext("helloworld.xml");
    //根据类型获取bean
    HelloService helloService = beanFactory.getBean(HelloService.class);
    helloService.sayHello();
}

 

二、钦命id,必需在Ioc容器中独一;譬喻:

<bean id="helloWorld" class=”com.ljq.test.HelloWorldImpl”/> 

测量检验代码片段如下:

@Test
public void sayHello() {
    BeanFactory beanFactory =
              new ClassPathXmlApplicationContext("helloworld.xml");
    //根据id获取bean 
    HelloService helloService = beanFactory.getBean("helloWorld", HelloService.class);
    helloService.sayHello();
}

三、钦点name,这样name正是“标记符”,必需在Ioc容器中唯一;比方:

<bean name="helloWorld" class=”com.ljq.test.HelloWorldImpl”/> 

测验代码片段如下:

@Test
public void sayHello() {
    BeanFactory beanFactory =
              new ClassPathXmlApplicationContext("helloworld.xml");
    //根据name获取bean  
    HelloService helloService = beanFactory.getBean("helloWorld", HelloService.class);
    helloService.sayHello();
}

四、钦点id和name,id正是标志符,而name正是别称,必得在Ioc容器中当世无双;举例:

<bean id=”bean1” name=”alias1” class=”com.ljq.test.HelloWorldImpl”/> 
<!-- 如果id和name一样,IoC容器能检测到,并消除冲突 -->
<bean id="bean3" name="bean3" class=”com.ljq.test.HelloWorldImpl”/>

测验代码片段如下:

@Test
public void sayHello() {
    BeanFactory beanFactory =
              new ClassPathXmlApplicationContext("helloworld.xml");
    //根据id获取bean 
    HelloService bean1 = beanFactory.getBean("bean1", HelloService.class);  
    bean1.sayHello();  
    //根据别名获取bean  
    HelloService bean2 = beanFactory.getBean("alias1", HelloService.class);  
    bean2.sayHello();  
    //根据id获取bean  
    HelloService bean3 = beanFactory.getBean("bean3", HelloService.class);  
    bean3.sayHello();  
    String[] bean3Alias = beanFactory.getAliases("bean3");  
    //因此别名不能和id一样,如果一样则由IoC容器负责消除冲突  
    Assert.assertEquals(0, bean3Alias.length);  
}

五、钦点八个name,八个name用“,”、“;”、“ ”分割,第多少个被用作标记符,别的的(alias1、alias2、alias3)是外号,全体标志符也必需在Ioc容器中独一;

<bean name=”bean1;alias11,alias12;alias13 alias14”
      class=”com.ljq.test.HelloWorldImpl”/>   
<!-- 当指定id时,name指定的标识符全部为别名 -->
<bean id="bean2" name="alias21;alias22"
      class=”com.ljq.test.HelloWorldImpl”/>   

测试代码片段如下:

@Test
public void sayHello() {
    BeanFactory beanFactory =
              new ClassPathXmlApplicationContext("helloworld.xml");
    //1根据id获取bean
    HelloService bean1 = beanFactory.getBean("bean1", HelloService.class);
    bean1.sayHello();
    //2根据别名获取bean
    HelloService alias11 = beanFactory.getBean("alias11", HelloService.class);
    alias11.sayHello();
    //3验证确实是四个别名       
    String[] bean1Alias = beanFactory.getAliases("bean1");
    System.out.println("=======namingbean5.xml bean1 别名========");
    for(String alias : bean1Alias) {
        System.out.println(alias);
    }
    Assert.assertEquals(4, bean1Alias.length);
    //根据id获取bean
    HelloService bean2 = beanFactory.getBean("bean2", HelloService.class);
    bean2.sayHello();
    //2根据别名获取bean
    HelloService alias21 = beanFactory.getBean("alias21", HelloService.class);
    alias21.sayHello();
    //验证确实是两个别名
    String[] bean2Alias = beanFactory.getAliases("bean2");
    System.out.println("=======namingbean5.xml bean2 别名========");
    for(String alias : bean2Alias) {
        System.out.println(alias);
    }   
    Assert.assertEquals(2, bean2Alias.length);   
}

六、使用<alias>标签钦定外号,别称也必得在IoC容器中独占鳌头

<bean name="bean" class=”com.ljq.test.HelloWorldImpl”/> 
<alias alias="alias1" name="bean"/> 
<alias alias="alias2" name="bean"/> 

测验代码片段如下:

@Test
public void test6() {
    BeanFactory beanFactory =
         new ClassPathXmlApplicationContext("chapter2/namingbean6.xml");
    //根据id获取bean
    HelloService bean = beanFactory.getBean("bean", HelloService.class);
    bean.sayHello();
    //根据别名获取bean
    HelloService alias1 = beanFactory.getBean("alias1", HelloService.class);
    alias1.sayHello();
    HelloService alias2 = beanFactory.getBean("alias2", HelloService.class);
    alias2.sayHello();
    String[] beanAlias = beanFactory.getAliases("bean");
    System.out.println("=======namingbean6.xml bean 别名========");
    for(String alias : beanAlias) {
        System.out.println(alias);
   }
   System.out.println("=======namingbean6.xml bean 别名========");
   Assert.assertEquals(2, beanAlias.length);
}

从概念来看,name或id借使钦命它们中的四个时都作为“标志符”,那干什么还要有id和name同一时候设有吗?那是因为当使用基于XML的安插元数据时,在XML中id是多个真的的XML id属性,因而当其余的定义来援用那么些id时就反映出id的益处了,能够动用XML分析器来验证引用的那么些id是或不是留存,从而更早的觉察是还是不是引用了一个空头支票的bean,而利用name,则恐怕要在真的使用bean时手艺觉察援用二个不设有的bean。

●Bean命名约定:Bean的命名服从XML命名标准,但最佳契合Java命名标准,由“字母、数字、下划线组成“,并且应该养成贰个独具特殊的优越条件的命名习于旧贯, 比如采用“驼峰式”,即首先个单词首字母开头,从第贰个单词最早首字母大写起来,那样能够扩张可读性。

1.1.4 实例化Bean
Spring IOC容器怎么样实例化Bean呢?古板应用程序能够经过new和反光情势张开实例化Bean。而Spring IOC容器则必要依照Bean定义里的配置元数据应用反射机制来创建Bean。在Spring IOC容器中遵照Bean定义创制Bean主要有以下三种办法:
一、使用结构器实例化Bean:那是最轻易易行的艺术,Spring IOC容器即能选拔暗许空构造器也能使用有参数构造器二种方法创立Bean,如以下办法钦命要创立的Bean类型:

行使空构造器进行定义,使用此种方式,class属性钦命的类必需有空构造器

<bean id="helloServiceNoWithArgs" class="com.ljq.test.HelloServiceImpl2" />

利用有参数构造器实行定义,使用此种情势,能够接纳<constructor-arg>标签钦点构造器参数值,在那之中index表示位置,value代表常量值,也得以钦命援用,钦命引用使用ref来援用另叁个Bean定义,前面会详细介绍:

<bean id="helloServiceWithArgs" class="com.ljq.test.HelloServiceImpl2">
    <!-- 指定构造器参数 -->  
    <constructor-arg index="0" value="Hello Spring!"/>  
</bean>

接头什么样陈设了,让我们做个例证来施行一下:
a、妄想Bean class(HelloWorldImpl2.java),该类有三个空构造器和一个有参构造器:

package com.ljq.test;

public class HelloServiceImpl2 implements HelloService {
    private String message;

    /**
     * 空构造器
     */
    public HelloServiceImpl2() {
        this.message = "Hello World!";
    }

    /**
     * 带参构造器
     * 
     * @param message
     */
    public HelloServiceImpl2(String message) {
        this.message = message;
    }

    public void sayHello() {
        System.out.println(message);
    }
}

b、在配备文件helloworld.xml配置Bean定义,如下所示:

    <!--使用默认构造参数--> 
    <bean id="helloServiceNoWithArgs" class="com.ljq.test.HelloServiceImpl2" />

    <!--使用有参数构造参数-->  
    <bean id="helloServiceWithArgs" class="com.ljq.test.HelloServiceImpl2">
        <!-- 指定构造器参数 -->  
        <constructor-arg index="0" value="Hello Spring!"/>  
    </bean>

c、配置完了,写段测量试验代码看是或不是工作:

    /**
     * 使用默认构造参数
     */
    @Test
    public void testHelloWorld2() {
        // 1、读取配置文件实例化一个IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
        HelloService helloService = context.getBean("helloServiceNoWithArgs", HelloService.class);
        // 3、执行业务逻辑
        helloService.sayHello();
    }

    /**
     * 使用有参数构造参数
     */
    @Test
    public void testHelloWorld3() {
        // 1、读取配置文件实例化一个IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
        HelloService helloService = context.getBean("helloServiceWithArgs", HelloService.class);
        // 3、执行业务逻辑
        helloService.sayHello();
    }

二、使用静态工厂形式实例化Bean,使用这种措施除了钦命必需的class属性,还要钦定factory-method属性来钦定实例化Bean的点子,並且动用静态工厂方法也同意钦命方法参数,spring IOC容器将调用此属性钦命的法门来博取Bean,配置如下所示:
a、先来拜望静态工厂类代码HelloApiStaticFactory:

package com.ljq.test;

/**
 * 静态工厂类
 * 
 * @author 林计钦
 * @version 1.0 2013-11-5 下午10:03:49
 */
public class HelloWorldStaticFactory {
    /**
     * 工厂方法 
     * 
     * @param message
     * @return
     */
    public static HelloService newInstance(String message) {
        // 返回需要的Bean实例
        return new HelloServiceImpl2(message);
    }

}

b、在配备文件helloworld.xml配置Bean定义,如下所示:

    <!--使用有参数构造参数-->  
    <bean id="helloServiceStaticFactory" class="com.ljq.test.HelloWorldStaticFactory" factory-method="newInstance">
        <!-- 指定构造器参数 -->  
        <constructor-arg index="0" value="Hello Static Factory"/>  
    </bean>

c、配置完了,写段测量试验代码看是否职业:

/**
     * 使用有参数构造参数
     */
    @Test
    public void helloServiceStaticFactory() {
        // 1、读取配置文件实例化一个IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
        HelloService helloService = context.getBean("helloServiceStaticFactory", HelloService.class);
        // 3、执行业务逻辑
        helloService.sayHello();
    }

三、使用实例工厂方法实例化Bean,使用这种办法不能够内定class属性,此时必需采用factory-bean属性来钦点工厂Bean,factory-method属性内定实例化Bean的方法,何况使用实例工厂方法允许钦赐方法参数,格局和利用构造器格局同样,配置如下:
a、打算Bean class(HelloWorldImpl2.java),该类有三个空构造器和二个有参构造器:

package com.ljq.test;

/**
 * 静态工厂类
 * 
 * @author 林计钦
 * @version 1.0 2013-11-5 下午10:03:49
 */
public class HelloWorldStaticFactory {

    /**
     * 工厂方法 
     * 
     * @param message
     * @return
     */
    public HelloService newInstance2(String message) {
        // 返回需要的Bean实例
        return new HelloServiceImpl2(message);
    }
}

b、在布置文件helloworld.xml配置Bean定义,如下所示:

    <!-- 1、定义实例工厂Bean -->
    <bean id="beanInstanceFactory" class="com.ljq.test.HelloWorldStaticFactory" />
    <!-- 2、使用实例工厂Bean创建Bean -->
    <bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance2">
         <constructor-arg index="0" value="Hello Spring!"></constructor-arg>
    </bean>

c、配置完了,写段测验代码看是或不是工作:

    @Test
    public void helloServiceStaticFactory2() {
        // 1、读取配置文件实例化一个IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
        HelloService helloService = context.getBean("bean4", HelloService.class);
        // 3、执行业务逻辑
        helloService.sayHello();
    }

透过上述例子我们早已基本驾驭了什么样实例化Bean了,大家是否注意到?这两种办法只是布局不平等,从获得方式看完全平等,未有其余例外。那也是Spring IOC的魅力,Spring IOC帮你创设Bean,大家只管使用就足以了,是或不是很轻松。

1.1.5 小结
到此我们曾经说罢了Spring IOC基础部分,包括IOC容器概念,怎么着实例化容器,Bean配置、命名及实例化,Bean获取等等。不知大家是否注意到到最近停止,大家不得不通过简单的实例化Bean,没有提到Bean之间涉及。接下来一章让大家进来配置Bean之间关系章节,也便是依附注入。


Blog:
Hadoop交流群(250363249)、Java+Oracle交流群(158560018)

题外话:
自家来自铁观世音的发源地——利兹安溪,有须求正宗安溪铁观世音菩萨的友友招待Q笔者:416501600。

本文由ag旗舰厅官网发布于ag旗舰厅,转载请注明出处:Spring中Bean的命名方式代码详解,IOC的配置使用

关键词:

上一篇:没有了

下一篇:没有了