Spring框架:Spring容器详解

Spring容器

Spring容器可以帮助你管理所有的Bean对象,专业术语称之为IoC控制反转。在传统的程序中,对象的生成都是由开发者完成的。而在控制反转中,对象的生成全部都交给框架完成。这样的好处就是减少了程序的依赖性。

Bean在Spring中的生命周期如下:

  • 实例化。Spring通过new关键字将一个Bean进行实例化,JavaBean都有默认的构造函数,因此不需要提供构造参数。
  • 填入属性。Spring根据xml文件中的配置通过调用Bean中的setXXX方法填入对应的属性。
  • 事件通知。Spring依次检查Bean是否实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的话,依次调用这些接口。
  • 使用。应用程序可以正常使用这个Bean了。
  • 销毁。如果Bean实现了DisposableBean接口,就调用其destroy方法。

定义一个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>

Session

Spring中的Session一般不需要直接操作,而是将数据保存到Bean容器中的scope=session中。

时间: 2024-12-21 07:45:16

Spring框架:Spring容器详解的相关文章

spring框架 AOP核心详解

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around

Spring框架:SpringMVC详解

SpringMVC的工作流程.最先接触到请求的是DispatcherServlet,它会将请求根据配置文件转发到控制器,控制器返回视图名称和一个Model表示处理结果.DispatcherServlet再将处理结果发送给视图模板引擎,由它进行页面的渲染.下图是整个过程. 基本配置 声明servlet.首先要在web.xml中声明Spring的Servlet,代码如下: <servlet> <servlet-name>spring</servlet-name> <s

Spring框架:AOP详解

AOP的中文名称叫做面向切面编程.这个名字非常形象,因为你真的可以把一个系统像面包一样切开,并直接在面包上增加修饰.切面可大可小,大到整个系统,小到某一个方法. AOP有什么用呢?举个例子,每个组件中都可能含有安全.事务.数据库等方面的逻辑,AOP就是把每个组件中的安全作为一个方面进行集中处理,事务作为一个方面,数据库作为一个方面等等.这样才能做到高内聚.低耦合.AOP中有三个重要的术语:通知.切点.连接点.他们之间的关系如下图. AOP实现的原理是修改目标类中的代码.至于怎么修改,有多种方式:

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

Spring MVC 框架搭建及详解

一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.commons-logging.jar.cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar.hibernate-jpa-2.0-api-1.0.1.Final.jar.antlr-2.7.6.jar.commons-collections-3

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

跟着刚哥学习Spring框架--Spring容器(二)

Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是Spring管理的基本单位,任何的Java对象和组件都被当成Bean处理,容器还负责管理Bean与Bean之间的依赖关系.  两种类型的启动实现   1.BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring本身: -- Spring容器最基本的接口就是BeanF

Spring中AOP实例详解

Spring中AOP实例详解 需要增强的服务 假如有以下service,他的功能很简单,打印输入的参数并返回参数. @Service public class SimpleService { public String getName(String name) { System.out.println(get name is: + name); return name; } } 定义切面和切点 @Component @Aspect public class L ogAspect { // 定义切

elasticSearch+spring 整合 maven依赖详解

摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Maven依赖   <!-- elasticsearch package -->        <dependency>             <groupId>fr.pilato.spring</groupId>             <artifact