Spring容器可以帮助你管理所有的Bean对象,专业术语称之为IoC控制反转。在传统的程序中,对象的生成都是由开发者完成的。而在控制反转中,对象的生成全部都交给框架完成。这样的好处就是减少了程序的依赖性。
Bean在Spring中的生命周期如下:
定义一个Bean的语法如下。
<beans xmlns="..."> <bean id="apple" class="com.whitejava.Apple"/> </beans>
使用这个Bean时只要通过applicationContext.getBean("apple")即可获取。
作用域。在Spring中还可以指定Bean的作用域,也就是Bean的寿命,只要设置bean标签的scope属性即可。Spring提供的生命周期有:singleton整个应用只有一个、prototype每次调用都产生一个新的、request每个HTTP请求对应一个bean、session每个HTTP会话对应一个bean、global-session每个portlet上下文session对应一个bean。默认生命周期是singleton。
初始化和销毁。第一种方法,在xml中的bean标签增加init-method和destroy-method属性来指定初始化和销毁方法。第二种方法,在bean的java类中implements InitializingBean或者DisposableBean接口实现初始化和销毁。第三种方法,在xml中的beans标签中增加default-init-method和default-destroy-method属性。
另外,可以通过RPC或者JMS配置远程Bean。后面的章节有介绍。
有时候有些关键的属性,比如数据库密码,需要放在xml文件之外,便于后续修改。Spring解决这个问题的方法有两种,一种是属性占位符,一种是属性重写。另外阿里提供的AutoConfig有更好的配置管理机制,将在后面详细介绍。
关于占位符,首先载入属性文件:
<context:property-placeholder location="classpath:/db.properties"/> 或者 <context:property-placeholder location="file:///etc/db.properties"/>
引用属性中的变量:
<bean id="dataSource" class="org.springframework.jdbc.datbase.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}/> </bean>
覆盖properties文件中的变量:
<util:properties id="defConf> <prop key="jdbc.url">jdbc:mysql://localhost/test</prop> <prop key="jdbc.driverClassName">com.mysql.jdbc.Driver</prop> </util:properties> <context:property-placeholder location="classpath:/db.properties" properties-ref="defConf" system-properties-mode="OVERRIDE"/> 除了OVERRIDE还有FALLBACK、NEVER。
覆盖xml配置。载入properties文件并覆盖现有的xml配置。请看下面的例子:
<bean id="dataSource" class="xxx"> <property name="url">jdbc:oracle://xxx</property> <property name="username">xxx</property> </bean> <context:property-overrider location="classpath:/db.properties"/>
db.properties文件的内容:
dataSource.url=jdbc:mysql://xxx dataSource.username=yyy
加密配置值。载入经过加密的properties文件:
<bean id="environmentConfig" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES"/> <property name="passwordEnvName" value="DB_ENCRYPTION_PWD"/> </bean> <bean id="stringEncrypter" class="org.jasypt.encryption.pbe.Environment"> <property name="config-ref" ref="environmentConfig"/> </bean> <bean id="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="stringEncrypter"/> </bean>
Spring中的Session一般不需要直接操作,而是将数据保存到Bean容器中的scope=session中。
原文地址:http://blog.csdn.net/caipeichao2/article/details/39378821