spring配置的可选方案
xml
javaConfig
自动扫描和自动装配
配置风格可以互相搭配,混合使用.
尽可能的使用自动配置机制.如果必须要显式配置(比如有些源代码不是由你来维护)推荐使用类型安全的javaConfig,只有需要xml命名空间并且javaConfig没有同样实现时使用xml
自动化装配
因为自动化装配最为强大和方便,所以首先介绍自动化装配
组件扫描:自动发现应用上下文创建的bean
自动装配:自动满足依赖
创建可发现的bean
@Component:表明被标注的类为组件类,告知spring创建bean
@ComponentScan:开启组件扫描
xml配置
<context:component-scan base-package="your package"/>
为组件扫描的bean命名
@Conponent(“name”)
@Named(“name”)
设置扫描基础包
使用@Configuration定义配置类
@ComponentScan(“package”)
@ComponentScan(basePackages={“1”,“2”})
@ComponentScan(basePackageClasses={1.class,2.class})
推荐使用basePackageClasses,因为类型安全.可以在包中创建用于扫描的空标记接口,避免引用实际的应用程序代码,保持对重构友好
自动装配
@AutoWired 可以使用在构造器,setter方法等,spring会尝试满足参数声明的依赖.
如果没有合适的bean将会抛出异常,可以将@AutoWired的required属性设置为false
也可以使用@Inject
通过java代码适配bean
比如要将第三方库中的组件装配到你的应用使用不了自动化装配,所以还是要显式配置
javaConfig是比xml更好的方案,因为强大,类型安全,对重构友好
创建配置类
@configuration:表明配置类
声明简单的bean
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean注解告诉spring该方法会返回一个对象,并且该对象需要注册为bean.
bean的name默认为方法名,可以通过重命名方法和对@Bean注解name属性赋值更改
@Bean(name="name")
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
使用javaConfig实现注入
1 .装配bean的最简单方式是引用创建bean的方法
@Bean
public CDplayer cdPlayer(){
return new CDPlayer(sgtPepper());
}
看起来CompactDisc是通过调用sgtPeppers()得到,但是实际上因为sgtPeppers方法有@Bean注解,spring会拦截调用并确保直接返回该方法创建的bean
方法请求一个CompactDisc作为参数
@Bean
public CDPlayer cdPlayer(COmpactDisc compactDisc){
return new CDPlayer(compactDisc);
}
spring调用cdPlayer方法时会自动装配CompactDisc到配置方法中
这通常是最佳的方式,因为不需要COmpactDisc声明在同一个配置类或是需要在javaConfig中声明,也可以是组件扫描发现的组件类.
通过xml装配
创建xml配置规范
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
</beans>
声明bean
<bean class="package.yourClass"/>
因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名并以#0作为后缀(0是编号区分多个同类bean)。为了便于记忆,用户往往需要自己设定bean的id,这可以通过id属性来指定,如下:
<bean id="person" class="package.yourClass">
构造器注入初始化bean
spring3引入的c-命名空间
<bean id="…" class="…">
<constructor-arg ref="beanID"/>
</bean>
<bean id="…" class="…"
c:cd-ref="beanID"/>
<-- cd为构造器参数名 -->
<-- 构造器参数还可以换成参数位置
如 c:_0-ref 下划线是因为xml不允许使
用数字作为第一个字符.如果只有一个参数可
以省略位置信息如c:_-ref -->
注入字面量到构造器
c命名空间 同上但是去掉-ref后缀
如:
装配集合
注入null可以使用
注入列表
<constructor-arg>
<-- 可以使用list set等元素 -->
<list>
<-- 字面值注入使用value -->
<value>your value</value>
<-- bean装配使用ref -->
<ref bean="beanID"/>
</list>
</constructor-arg>
c命名空间无法装配列表,但是与其使用xml装配不如使用java配置.
设置属性
<property name="" value=""(设置字面量使用value 装配bean需要使用ref)/>
<bean id="" class="" p:propertyrname(-ref)=""/>
p命名空间也无法装配列表,但是可以使用util命名空间简化bean配置
使用util命名空间可以单独对集合创建bean
<util:list id="">
<value>…</value>
<ref>…</ref>
</util:list
现在就可以将list使用p命名空间注入了
<bean id="" class=""
p:..-ref="listID"/>
导入和和混合配置
javaConfig中引入xml配置
如果配置类中bean太多希望拆开而又存在依赖怎么办?
可以把bean放在不同的配置类中,然后创建一个更高级的配置类,在类中使用@Import将多个配置类组合
@configuration
@imporg({1.class,2.class})
public class config(){
}
而如果有bean在xml中配置了可以使用@ImportResource注解
@ImportResource(“classPath:config.xml”)
xml中引入java配置
元素
<import resoune="config.xml"/>
mport只能导入xml配置
导入java配置可以使用bean`
<wiz_tmp_tag id=“wiz-table-range-border” contenteditable=“false” style=“display: none;”>
了解springcloud架构可以加求求:三五三六二四七二五九