Spring速查手册——Bean装配

Spring提供三种Bean的装配方式,分别是: 1. 自动装配Bean 2. 在Java中装配Bean 3. 在XML中装配Bean

1. 自动装配Bean(注解)

Spring从两个角度完成Bean的自动化装配: - 组件扫描:扫描上下文中所有的Bean(由@Component、@Named注解完成) - 自动装配:将指定的Bean注入到指定的Bean中(由@Autowired、@Injected注解完成)

1.1. 开启组件扫描

  1. Java的配置方式 @Configuration // 把当前类作为配置类 @ComponentScan // 开启组件扫描 public class XXXConfig(){}
    • 默认情况下扫描与当前配置类共同包下的组件;
    • 指定扫描的基础包:
      1. @ComponentScan(“com.njupt.xxx”)
      2. @ComponentScan(basePackages=”com.njupt.xxx”)
      3. @ComponentScan(basePackages={“com.njupt.xxx”,”com.nju.xxx”})
      4. @ComponentScan(basePackageClasses={“XXXService.class”,”YYYService.class”})
  2. XML的配置方式
<context:component-scan base-package="xxx.xxx.xxx">

1.2. 标识组件

@Component
class xxx{}
  • 默认的Bean ID为第一个字母小写的类名。
  • 指定Bean ID:@Component(“xxx”)
  • 第二种标识方式:@Named,和@Component用法一样,只不过它是Java Dependency Injection规范中提供的。

1.3. 自动装配

  1. 自动注入构造器参数 @Autowired public XXX( Y y ){ this.y = y; }
  2. 自动注入setter方法参数 @Autowired public void setXXX( X x ){ this.x = x; }

PS:也可使用@Inject注解,和@Named一样,都是Java依赖注入规范的注解,Spring实现了这些注解。

2. 在Java中装配Bean

2.1. 声明Bean

@Configuration
class XXXConfig{
    // 创建一个Bean
    @Bean
    public A setA(){
        return new A();
    }
}
  • 方法名:bean的名字 也可以通过@Bean(name=”xxx”)指定bean的名字。
  • 函数体:通过new创建对象
  • 返回值:为该创建的bean对象

2.2. 注入

@Configuration
class XXXConfig{
    @Bean
    public A setA(){
        return new A();
    }

    // 注入方式一:执行setA函数(low比)
    @Bean
    public B setB(){
        return new B( setA() );
    }

    // 注入方式二:Spring自动注入(优雅)
    @Bean
    public B setB( A a ){
        return new B( a );
    }
}

3. 在XML中装配Bean

3.1. 声明一个bean

<bean id="xxx" class="com.xxx.xxx" />

3.2. 构造器注入

  1. 使用constructor-arg
<!-- 注入引用 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg ref="yyy" />
</bean>
<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg value="我是字面值" />
</bean>
<!-- 注入集合 -->
<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg>
        <list>
            <value>啦啦啦1</value>
            <value>啦啦啦2</value>
            <value>啦啦啦3</value>
        </list>
    </constructor-arg>
</bean>

<bean id="xxx" class="com.xxx.xxx">
    <constructor-arg>
        <list>
            <ref bean="xxx1" />
            <ref bean="xxx2" />
            <ref bean="xxx3" />
        </list>
    </constructor-arg>
</bean>
  • list标签、set标签都只是constructor-arg标签的子标签,不能单独存在,若要把list、set单独声明成一个bean,则需使用util命名空间下的util:list、util:set标签。这样list、set、map可以单独存在,并在constructor-arg标签中直接引用。
  1. 使用c-命名空间 首先需要在beans标签中加入xmlns:c命名空间。
<!-- 注入引用(若构造函数有多个参数) -->
<bean id="xxx" class="com.xxx.xxx" c:参数名-ref="yyy"/>

<!-- 注入引用(指定注入到第几个参数中) -->
<bean id="xxx" class="com.xxx.xxx" c:0-ref="yyy"/>

<!-- 注入引用(若构造函数只有一个参数) -->
<bean id="xxx" class="com.xxx.xxx" c:_-ref="yyy"/>

<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx" c:_参数名="啦啦啦"/>
<bean id="xxx" class="com.xxx.xxx" c:_0="啦啦啦"/>

<!-- 注入字面值(若构造函数只有一个参数) -->
<bean id="xxx" class="com.xxx.xxx" c:_="啦啦啦"/>

PS:c命名空间不支持集合装配!

3.3. 属性注入

  1. 使用property属性
<bean id="xxx" class="com.xxx.xxx">
    <property name="属性名" ref="yyy" />
</bean>
  1. 使用P命名空间 首先需要在beans标签中引入p命名空间。
<bean id="xxx" class="com.xxx.xxx" p:属性名-ref="yyy" />

4. 混合使用JavaConfig中的bean和XML中的bean

4.1. 在JavaConfig中引用另一个javaConfig中的bean

@Configuration
@Import({XXXConfig.class,YYYConfig.class})
class XXXConfig{
    @Bean
    public A setA(){
        return new A();
    }
}

4.2. 在JavaConfig中引用XML中的bean

@Configuration
@ImportResource("classpath:xxx.xml")
class XXXConfig{
    @Bean
    public A setA(){
        return new A();
    }
}

4.3. 在XML中引入另一个XML

<beans>
    <import resource="xxx.xml" />
    <bean />
</beans>

4.4. 在XML中引入JavaConfig

直接声明一个bean即可:

<bean class="com.xxx.XXXConfig" />

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Spring-IOC(2)

scope <!--Spring使用scope标签来制定bean的作用域(默认为Singleton)--> <bean id="singletonBean" c...

32810
来自专栏大闲人柴毛毛

深入剖析Spring(三)——Bean的生命周期

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制...

3524
来自专栏柠檬先生

SpringMVC——笔记

使用 @RequestMapping 映射请求 Spring MVC 使用@RequestMapping 注解为控制器指定可以处理那些URL请求。   在控制器...

2035
来自专栏JavaQ

深入理解Spring系列之十二:@Transactional是如何工作的

结合Spring框架,在进行数据库操作的时候,经常使用@Transactional注解,工作经历中看到很多人使用方式都是错误的,没有深入理解过其原理,这是很危险...

3007
来自专栏爱撒谎的男孩

Springmvc之接受请求参数

3246
来自专栏后台及大数据开发

springBoot系列教程06:参数验证及验证信息国际化

在springboot应用中要验证参数是否正确很简单,web应用已经包含了validation的

1012
来自专栏大内老A

难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?

开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)...

1687
来自专栏Java编程技术

Springboot之spring-boot模块

spring-boot模块提供了一些特性用来支持springboot中其他模块,这些特性包含如下:

432
来自专栏java 成神之路

JVM 类加载机制深入浅出

24611
来自专栏Java 技术分享

两篇 Spring 总结(一)

933

扫描关注云+社区