Spring IOC 相关配置

 

 

基于XML配置

基于注解配置

基于java类配置

基于Groovy DSL

使用场景

Bean来自第三方,如DataSource、JdbcTemplate等,因为无法在类中标注注解,所以通过xml方式配置比较好。

使用其他命名空间,如aop,context等,只能采用基于xml的配置

Bean的实现类用户开发

实例化bena的逻辑比较复杂

可以通过代码方式控制bean初始化的整体逻辑,如果初始化逻辑比较复杂,则比较适合java类配置的方式

优势在于可以通过Groovy脚本灵活控制Bean初始化的过程。如果初始化bean的逻辑比较复杂,则比较适合基于Groovy DSL配置的方式

Bean定义

Xml文件中通过bean元素定义Bean

bean id=.. class=…/

类中添加注解

@Component

@Repository

@Service

@Controller

配置文件扫描包

context:component-scan base-package=/

注解扫描包:

@ComponentScan在类级别使用

@Configuration

标注类

@Bean标准提供Bean,方法必须提供bean的实例化逻辑

 

在Groovy文件中通过DSL定义Bean。

userDao(UserDao)

Bean名称

通过id或name指定

bean id=userDao class=

com.jinwen.UserDao/

默认名称

Com.jinwen.UserDao#0

@Component(person)

默认是类首字母小写(不包括包名)

其他类同

@Bean(person)

name属性。

默认名称为方法名

通过Groovy的DSL定义Bean的名称(Bean的类型,Bean构建函数参数)

logonService

(LogonService,

userDao)

Bean注入

(Sett

er注入,构造器注入)

属性注入:

property或通过p命名空间

P:userDao-rf=userDao

Ref属性

允许注入集合

maplistarray

构造器注入:

constructor-arg ref=/

bean id= class= autowire=byName/

@Autowired按类型注入

@Autowired配置使用@Qualifier按名称注入

@。。。

 

@Bean(autowire = Autowire.BY_TYPE)

Public AccountService accountService(){

}

 

@Qualifier接受一个string值,通过该值可以更改默认的限定值(默认bean名)

比较灵活。

方法处使用@Autowired使方法入参绑定bean,然后在方法中通过代码进入注入。

还可通过调用配置类的@Bean方法进行注入

比较灵活,可以在方法处通过ref()方法进行注入,如ref(logDao)

生命过程

Init-method和destroy-method属性

最多只能指定一个初始方法和一个销毁方法

@PostConstruct初始化

@PreDestroy销毁

可以定义多个

 

context:annotation-config/激活注解

@Bean的initMethod或destoryMethod指定一个初始化或销毁方法。

对于初始化方法来说,可以直接在方法内部通过代码的方式灵活定义初始化逻辑

通过bean-

bean.initMethod或destoryMethod指定一个初始化或销毁方法

Bean作用范围

Scope属性

bean class=.. scope=prototype/

@Scope设置作用范围

@Scope(prototype)

Bean方法定义处标注@Scope指定范围

通过bean-bean.scope

=prototype指定

Bean延迟初始化

通过bean的lazy-init属性指定,默认为default。

继承自beans的default-lazy-init设置,默认为false

通过类定义出添加@Lazy指定

如@Lazy(true)

通过Bean方法定义处标注@Lazy注解

通过bean-

bean.lazyInit=true指定

Bean依赖关系

使用depends-on属性,多个用逗号隔开

使用@DependsOn注解

只有在@DependsOn注解内指定的bean被创建之后才会创建本类,否则不会创建本类。

在方法级别使用时,只对基于java的配置产生影响

使用@DependsOn注解

 

一般采用xml配置DataSource,SessionFactory等资源Bean,在XML中利用aop,context命名空间进行相关主题的配置。

其他所有项目中开发的bean都通过基于注解配置的方式进行配置。

 

Spring容器默认禁用注解装配。最简单的开启方式context:annotation-config/。

 

Spring容器的启动大致分为两个主要阶段

1,容器处理配置元数据并建立元数据中存在的bean定义,期间存在对这些bean定义进行验证,如property和constructor-arg元素提供正确bean引用等

2,完成对bean的创建,然后完成依赖注入。实际上,并不是所有的bena都被创建;在容器启动期间,仅仅创建了无状态作用域的bean。Bean创建会触发其他依赖bean创建

 

自动装配有三种方式:byType、byName、constructor

 

@Value注解

SpEL表达式:

@Value(#{ jdbc.url}) Private String url;

占位符方式

@Value(${ url })Private String url;

${url} 是一个占位符变量,由一个特殊的Spring基础bean进行解析,该bean通过context:property-placeholder/进行配置

context:property-placeholder location=classpath:application.properties/

 

@PropertySource与@PropertySources:

可以从某些地方加载*.properties。

@Configutation

@PropertySource(classpath:1.properties)

@PropertySource(classpath:2.properties)

Public class xConfiguration(){

…….

}

@PropertySources{

@PropertySource(classpath:1.properties)

@PropertySource(classpath:2.properties)

}

Public class xConfiguration(){

…….

}

 

@Import与@ImportResource

Xml配置:通过importresource=XXX.xml/将多个分开的容器配置到一个配置中

@Configuration

@Import(MockConfiguration.class)

Public class xConfiguration{

 。。。。

}

 

对于web应用,spring提供了WebapplicationContextUtils工具类,可以返回web的ApplicationContext实例

Spring提供了ApplicationContextAware接口,实现这个接口的bean类,在创建期间spring容器会将自身注入到bean实例,这个bean就可以访问自己的容器。

 

为bean取别名

alias name = alias=/

 

创建bean的三种方式:

1.    构造方法

2.    静态或实例工厂方法

3.    使用spring的FactoryBean接口,实现这个接口,spring将发现这个bean类

 

Bean的作用域以及其定义,作用[适用@Scope或Scope接口]

Singleton、prototype、Request(仅适用于WebApplicationContext)、session。。

延迟lazy创建bean的优点是:加快了容器启动时间,并且占用较少的内存量。

 

Bean的生命周期

生命回调的三种方式,init-method和。。属性、@PostConstruct注解、InitializingBean和DisposableBean接口,分别声明了afterPropertiesSet方法和destroy方法。如果一个bean实现initializingBean接口spring容器将在属性注入完毕后调用afterPropertiesSet方法。如果实现了DisposableBean接口,bean销毁之前调用destroy方法

 

 

不同环境配置文件

import resource=classpath:/dataSource-${targerPlatform}.xml/

这个占位符即可以从操作系统环境的环境变量中解析,也可以从JVM系统属性(如设置jvm餐位为DatagetPlatform=dev)中解析。

 

配置文件属性

Spring.profiles.active=

Spring.profiles.default=

以上用于在运行时指定活动和默认配置文件值

 

Beans中Profile属性,不同环境下,不同配置

beans profile=dev,test

  bean ………/

/beans

beans profile=prod

  bean ………/

/beans

也可以使用@Profile来指定只有在指定配置文件是活动配置文件是才会创建相关的bean

@Configuration

Public class ch5Config{

 @Bean

  @Profile("dev)

Public Foo devFoo(@Value(${name}) String name){  }

 @Bean

  @Profile("prod)

Public Foo devFoo(@Value(${name}) String name){  }

}

 

// 静态bean工程,将启动属性占位符解析机制(基于xml的方式context:property-placeholder/)

@Bean

Public static PropertySourcesPlaceholderConfigurerpropertySourcesPlaceholderConfigurer(){

  Return PropertySourcesPlaceholderConfigurer();

}

环境:spring3.1引入Environment代表应用程序所在运行环境。通过这个接口,可以管理应用程序所使用的配置文件和属性信息。

ConfigurableEnvironment environment = application,getEnvironment();

environment.setActiveProfiles(dev)

向MutablePropertySources添加新的作为名称占位符MapPropwetySource。

MutablePropertySources propertySources =environment.getPropertySources();

propertySources.addLast( newMapPropwetySource(mapSource ) , Collections.singletonMap(name,my foo));

 

application.refresh();

 

 

BeanFactory、ClasspathXmlApplicationContext、AnnotationConfigApplicationContext

factory-bean、factory-method:用来使用静态和实例工厂方法创建bean的xml特性

init-method和destroy-method特性:指定bean定义中声明周期方法的xml特性

Envitonment、ConfigurationEnvitonment:用来对应用程序工作环境进行抽象的spring接口

最新回复(0)
/jishu8xbp8Ddqk767nY7CQvNw5xs_2FeR_2FyCcg6_2BNLkiEg2OaM_3D4858600
8 简首页