微服务分布式云架构-spring装配bean

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架构可以加求求:三五三六二四七二五九

发布了87 篇原创文章 · 获赞 78 · 访问量 4031

猜你喜欢

转载自blog.csdn.net/weixin_45821812/article/details/104393120