关于spring中bean配置的几件小事

2019-05-30  本文已影响0人  一条路上的咸鱼

一.IOC和DI

1.IOC(Inversion of Control)

其思想是反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源;而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接收资源。这种行为也被成为查找的被动形式。

2.DI(Dependency Injection)

IOC的另一种表达方式:即组件的一些预先定义好的方式(例如:setter方法)接受来自如容器的资源注入。相对于IOC而言,这种表述更直接。

image.png

3.IOC的前世今生

使用这样一个需求,生成HTML或者PDF格式的不同类型的报表为例,说明IOC的演变。
①分离接口设计

image.png

②采用工厂模式

image.png

③采用反转控制

image.png

二.spring配置bean

1.在spring的IOC容器里面配置Bean。

在xml文件中通过bean节点来配置bean

<bean id="helloWorld" 
         class="com.desperado.helloworld.HelloWorld >
</bean>

id:Bean的名称。

2.Spring容器

3.ApplicationContext

image.png

4.依赖注入的三种方式

<bean id="helloWorld"   class="com.desperado.helloworld.HelloWorld">
      <property name="userName" value="desperado"></property>
</bean>
<bean id="car" class ="com.desperado.helloworld.Car">
      <constructor-arg value="奥迪" index="0"></constructor-arg>  
      <constructor-arg value="奔驰" index="1"></constructor-arg>  
      <constructor-arg value="5000" index="2"></constructor-arg>  
</bean>
<bean id="car" class ="com.desperado.helloworld.Car">
      <constructor-arg value="奥迪" type="java.lang.String"></constructor-arg>  
      <constructor-arg value="奔驰" type="java.lang.String"></constructor-arg>  
      <constructor-arg value="5000" type="java.lang.double"></constructor-arg>  
</bean>

5. 引用其他Bean

<bean id="service" class="com.desperado.helloworld.Service"></bean> 

<bean id="action" class="com.desperado.helloworld.Action">
      <property name="service" ref="service"></property>
</bean>

6.内部bean

7.null值和级联属性

8.集合属性

9.使用utility scheme定义集合

10.使用P命名空间

三.XML配置里的Bean自动装配

缺点

四.Bean之间的关系:继承和依赖

1.继承Bean配置

2.依赖Bean配置

五.bean的作用域

类别 说明
singleton 在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在
prototype 每次调用getBean()时都会返回一个新的实例
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境。
globalSession 一般用于protlet应用环境,该作用域仅适用于WebApplicationContext环境。

六.使用外部属性文件

1.在配置文件里配置Bean时,有时需要在Bean的配置里混入系统部署的细节信息(例如:文件路径,数据源配置信息等)。而这些部署细节实际上需要和Bean配置相分离。

2.Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean配置的部分内容外移到属性文件中。可以在Bean配置文件里使用形式为 ${var} 的变量,PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性来替换变量。

3.Spring还允许在属性文件中使用${propName},以实现属性直接的相互作用。

4.注册PropertyPlaceholderConfigurer
Spring2.0的配置方式:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="classpath:jdbc.properties"></property>
</bean>

Spring2.5之后:可通过<context:property-placeholder>元素简化:

<context:property-placeholder location="classpath:db.properties" />

七.SpEL

1.Spring表达式语言(简称SpELl):是一个支持运行时查询和操作对象图的强大的表达式语言。

2.SpEL的字面量

3.引用Bean、属性和方法

<property name="prefix" value="#{prefixGenerator}"/>       
<property name="suffix" value="#{sequenceGenerator2.suffix}"/>       
<property name="suffix" value="#{sequenceGenerator2.toString()}"/>       

方法的链式操作

<property name="count" value="#{sequenceGenerator2.toString().toUpperCase()}"/>       

-调用静态方法或静态属性:通过T()调用一个类的静态方法,它将返回一个Class Object,然后再调用相应的方法或属性。

<property name="initValue" value="#{T(java.lang.Math).PI}"></property>

4. SpEL支持的运算符号

八.Bean的生命周期

1.IOC容器中Bean的生命周期方法

2.创建Bean后置处理器

3.添加后置处理器后Bean的生命周期

SpringIOC容器对Bean的生命周期进行管理的过程:

  1. 通过构造器或工厂方法创建Bean实例。
  2. 为Bean的属性设置值和对其他Bean的引用。
  3. 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization()方法。
  4. 调用Bean的初始化方法。
  5. 将Bean的实例传递给Bean的后置处理器的postProcessAfterInitialization()方法。
  6. Bean可以正常使用了。
  7. 当容器关闭时,调用Bean的销毁方法。

4.通过调用静态工厂方法创建Bean

5.通过调用实例工厂方法创建Bean

6.实现FactoryBean接口在SpringIOC容器中配置Bean

九.组件装配

1.在classpath中扫描组件

<context:component-scan base-package="com.desperado.helloworld" resource-pattern="autowire/*.class />
类别 示例 说明
annotation com.desperado.XxxAnnotation 所有标注了XXXAnnotation的类。该类型采用目标;类是否标注了某个注解进行过滤。
assinable com.desperado.XxxService s所有继承或扩展XXXService的类。该类型采用目标类是否继承或扩展某个特定类进行过滤。
aspectj com.desperado..*Service+ 所有类名以Service结尾的类以及继承或扩展它们的类。该类型采用AspectJ表达式进行过滤
regex com.desperado.anno..* 所有com.desperado.anno包下面的类。该类型采用正则表达式根据类的类名进行过滤。
custom com.desperado.XxxTypeFilter 采用XXXTypeFilter通过代码的方式定义过滤规则。该类必须实现org.springframework.core.type.TypeFilter接口

2.使用@Autowired自动装配Bean

@Autowired注解自动装配具有兼容类型单个Bean属性。

3.使用@Resource或@Inject自动装配Bean

十.泛型依赖注入

Spring4.x中可以为子类注入子类对应的泛型类型的常用变量的引用。

image.png

十一.整个多个配置文件

Spring允许通过<import>将多个配置文件引入到一个文件中,进行配置文件的集成。这样在启动Spring容器时,仅需要指定这个合并好的配置文件就可以。
import元素的resource属性支持Spring的标准的路径资源

地址前缀 示例 对应资源类型
classpath: classpath:spring-mvc.xml 从类路径下加载资源,classpath:和classpath:/是等价的
file: file:/conf/security/spirng-shiro.xml 从文件系统目录中装载资源,可采用绝对或相对路径
http:// http:///www.desperado.com/resource/beans.xml 从web服务器中加载资源
ftp:// ftp://www.desperado.com/resource/beans.xml 从FTP服务器中加载资源。
上一篇 下一篇

猜你喜欢

热点阅读