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大联盟

SpringMVC笔记(9):国际化

所谓国际化就是指WEB应用在不同的浏览环境中显示不同的语言,如汉语、英语等。Spring MVC框架对国际化操作做了很好的集成,只需简单配置即可完成国际化。

511
来自专栏腾讯云Elasticsearch Service

Elasticsearch Rest Client实战

Elasticsearch官方推荐使用Java REST客户端连接集群并进行数据操作。

5224
来自专栏吴生的专栏

使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架

和传统后端页面生成技术相较, RESTful 数据服务专注与数据逻辑, 而将数据呈现完全交给前端应用. 这样做可以让后端开发更加单纯, 而且更容易测试. 本文将...

3575
来自专栏计算机编程

Jenkins mac上配置原生android

请在gradle中配置好打包的key与alias的值,否则上面的打包方式打出来的包无法安装!

1571
来自专栏玩转JavaEE

SpringMVC基础配置

按:最近公众号文章主要是整理一些老文章,主要是个人CSDN上的博客,也会穿插一些新的技术点。 ---- SpringMVC是什么,有多火,我这里就不再啰嗦了,S...

3537
来自专栏猿天地

Spring Boot系列之配置读取

子曰:温故而知新,可以为师矣。周日还在学习的就真的是爱学习的人,周日大放送,这周的精彩文章推荐阅读:

2422
来自专栏开发与安全

linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

一、posix 信号量 信号量的概念参见这里。前面也讲过system v 信号量,现在来说说posix 信号量。 system v 信号量只能用于进程间同步,...

2200
来自专栏Java进阶架构师

写出我的第一个框架:迷你版Spring MVC

原文:https://www.jianshu.com/p/f454662f497e

1793
来自专栏代码拾遗

Spring Boot 2.0 教程 - 深入SpringAplication

可以通过SpringApplication.run() 方法轻松的启动一个Spring应用,例如

1084
来自专栏码匠的流水账

使用SseEmitter不断向网页输出结果

之前写过一篇文章:springmvc不断输出文本到网页,采用的是对response不断进行write和flush实现的。在spring 4.2版本的时候提供了一...

2501

扫码关注云+社区