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 相关配置-总结的主要内容,如果未能解决你的问题,请参考以下文章

Spring5框架 笔记总结

Spring IOC的初始化过程——基于XML配置

Spring Ioc和依赖注入

spring学习配置bean的一些相关知识

Spring万字详解DI相关内容,一文掌握DI配置与使用

关于Spring——IoC