一、bean命名
1、直接命名
<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、构造器
<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、静态工厂
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、动态工厂
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");
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、引用注入
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。
在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作用域。