Spring3之 bean命名

本文介绍了Spring框架中Bean的定义方法,包括命名规范、别名设置及其在XML配置文件中的应用实例。通过具体代码展示了如何使用Bean的id和name属性,并通过<alias/>元素为已定义的Bean创建别名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、bean的命名采用标准Java命名约定小写字母开头,首字母大写间隔的命名方式。如accountManageraccountService etc...;

二、每个bean都有一个或多个id(或称之为标识符或名称,在术语 上可以理解成一回事)。这些id在当前IoC容器中必须唯一。如果 一个bean有多个id,那么其他的id在本质上将被认为是别名;

三、在对bean进行定义时,除了使用id属性来指定名称 之外,为了提供多个名称,需要通过name属性来加以指定 。而所有的这些名称都指向同一个bean;

四、在定义bean时就指定所有的别名并不是总是恰当的。有时我们期望 能在当前位置为那些在别处定义的bean引入别名。在XML配置文件中,可用 <alias/> 元素来完成bean别名的定义。

src下二个配置文件:bean.xml,beanAlias.xml

com.spring305.test.annotationBean包下TestBean.java,com.spring305.test.annotationBean.po包下:BeanA.java,InnerClassA.java,BeanAAnnotaion.java

代码及详细注释如下:

BeanA.java

public class BeanA {

	private static String name = "BeanA中的static变量";
	
	public  void initM(){//static
		System.out.println(BeanA.class+" in initM() method");
	}
	
	
	public static void testStatic(){//static
		System.out.println(BeanA.class+" in testStatic method");
	}
	
	public  void destoryM(){
		System.out.println(BeanA.class+" in destoryM() method");
	}
	
	//static类型内部类
	static class InnerClassAImpl implements InnerClassA{
		
		@Override
		public void testInnerClass(){
			//内部类中可以调用外部类中的变量,方法...etc
			System.out.println(InnerClassA.class+"内部类调用 "+name);
			testStatic();
		}
	}
}

 InnerClassA.java

 

public interface InnerClassA {
	void testInnerClass();	
}

 

TestBean.java

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring305.test.annotationBean.po.BeanA;
import com.spring305.test.annotationBean.po.BeanAAnnotaion;
import com.spring305.test.annotationBean.po.InnerClassA;


public class TestBean {
	
	//@Test//xml
	public void TestBeanXML(){
		ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"bean.xml","beanAlias.xml"});
		//通过ID,测试环境,ID
		//BeanA a = ctx.getBean("beanA",BeanA.class);
		//通过别名,测试别名
		//BeanA a = ctx.getBean("beanAName",BeanA.class);//bean使用name 定义
		//BeanA a = ctx.getBean("beanAName2",BeanA.class);//bean使用name定义多个时
		//BeanA a = ctx.getBean("toName",BeanA.class);//alias定义别名
		BeanA a = ctx.getBean("toName2",BeanA.class);//alias定义别名
		a.destoryM();

		//测试内部类的bean
		InnerClassA ica = (InnerClassA)ctx.getBean("innerClass");
		ica.testInnerClass();
		
	}

	@Test//annotation
	public void TestApplicationContextEnv(){
		ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanAAnnotaion.class);
		
		BeanAAnnotaion aBeanA = (BeanAAnnotaion)ctx.getBean("beanAAnnotaion");
		System.out.println(aBeanA.test());;
		
		String msg = ctx.getBean("test2",String.class);
		System.out.println("msg "+msg);

		
	}

}

 BeanAAnnotaion.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanAAnnotaion {

	@Bean(name = { "test1", "test2", "test3" })	
	public  String test(){
		return BeanAAnnotaion.class+" in test() method";
	}
}

 

bean.xml

 <!-- 在本文件中也可以定义别名,貌似放在前面与放在后面都不影响初始化 -->
     <alias alias="toName2" name="beanAName2"/>
     
     <!-- 当同时存在id与name时,则只会生成以id为名的bean
     <bean  id="beanA" name="beanAName" class="com.spring305.test.annotationBean.po.BeanA"></bean>
      -->
      <!-- 定义别名,中间可以用, ; 或者空格作间隔(separated by a comma (,), semicolon (;), or white space.) -->
     <bean  name="beanAName beanAName2 beanAName3" class="com.spring305.test.annotationBean.po.BeanA"></bean>
     <!-- 下面是BeanA的一个内部类的加载及写法 -->
     <bean  name="innerClass" class="com.spring305.test.annotationBean.po.BeanA$InnerClassAImpl"></bean>
     <bean id="beanB" class="com.spring305.test.annotationBean.po.BeanB"></bean>

 

beanAlias.xml

 

 

 <!-- 这个可以在另外一个文件中为其中的一个XML中定义的名为beanAName2的bean来命名别名toName -->
	<alias alias="toName" name="beanAName2"/>
      

 

 

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值