Spring IOC 相关配置-总结
Posted jinwenzishang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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属性 允许注入集合 <map><list><array> 构造器注入: <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 ch2Config{
@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接口
以上是关于Spring IOC 相关配置-总结的主要内容,如果未能解决你的问题,请参考以下文章