zoukankan      html  css  js  c++  java
  • 第2章 装配bean

    Spring 容器负责创建应用程序中的 bean 并通过 DI 来协调这些对象之间的关系。但是,作为开发人员,你需要告诉 Spring 要创建哪些 bean 并且如何将其装配在一起。当描述 bean 如何进行装配时, Spring 具有非常大的灵活性,它提供了三种主要的装配机制:

    • 在 XML 中进行显式配置。

    • 在 Java 中进行显式配置。

    • 隐式的 bean 发现机制和自动装配。

    2.1 自动化装配bean

    Spring 从两个角度来实现自动化装配:

    • 组件扫描( component scanning ): Spring 会自动发现应用上下文中所创建的 bean 。

    • 自动装配( autowiring ): Spring 自动满足 bean 之间的依赖。

    给相应的类加上@Component注解

    在实现类上加入@Component注解,这个注解相当于一个标记,告诉spring需要创建这个类的实例并管理起来。

    @Component
    public class UserImpl implements User{
       
    }

    在spring配置类中启用自动扫描@ComponentScan

    @Configuration
    @ComponentScan
    public class Config{
        
    }

    ::: tip 注意

    如果没有其他配置的话, @ComponentScan 默认会扫描与配置类相同的包。Spring也会扫描这个包以及这个包下的所有子包,查找带有 @Component 注解的类。如果你更倾向于使用 XML 来启用组件扫描的话,那么可以使用 Spring context 命名空间的 <context:component-scan> 元素。

    :::

    我们可以手动的设置要扫描的包@ComponentScan(basePackages="包名"),如果我们要扫描多个包@ComponentScan(basePackages={"包名",...,"包名"})。当让以上方式是通过字符串形式,还有一种方式采用basePackageClasses进行配置,例如@ComponentScan(basePackageClasses=User.class)@ComponentScan(basePackageClasses={User.class}),我个人比较喜欢第二种方式。

    使用spring管理的bean,使用@Autowired注解

    使用Autowired注解,spring会把前面管理生成的实例,自动赋值到你声明的属性上。

    @Service
    public class UserServiceImpl implements UserService{
        @Autowired
        private User user;
    }

    ::: tip 注意

    @Autowired 注解不仅能够用在构造器上,还能用在属性的 Setter 方法上。实际上, Setter 方法并没有什么特殊之处。 @Autowired 注解可以用在类的任何方法上。

    :::

    2.2 通过java代码装配bean

    创建配置类

    创建 JavaConfig 类的关键在于为其添加 @Configuration 注解, @Configuration 注解表明这个类是一个配置类,该类应该包含在 Spring 应用上下文中如何创建 bean 的细节。

    @Configuration
    public class SpringConfig{
        
    }

    ::: tip 注意

    我们可以同时使用组件扫描和显式配置

    :::

    声明简单的Bean

    @Bean注解会告诉 Spring 这个方法将会返回一个对象,该对象要注册为 Spring 应用上下文中的 bean 。

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    ::: tip 注意

    默认情况下, bean 的 ID 与带有 @Bean 注解的方法名是一样的。在本例中, bean 的名字将会是 sgtPeppers 。如果你想为其设置成一个不同的名字的话,那么可以重命名该方法,也可以通过 name 属性指定一个不同的名字:@Bean(name="sgtPeppers")。如果一个接口有一个实例,则bean的id可能作用不是太明显,不重复即可,但是如果有多个实例,就需要手动指定注入的bean是哪个了。

    :::

    借助JavaConfig实现注入

    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppers());
    }

    ::: tip 注意

    看起来, CompactDisc 是通过调用 sgtPeppers() 得到的,但情况并非完全如此。因为 sgtPeppers() 方法上添加了 @Bean 注解, Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的 bean ,而不是每次都对其进行实际的调用。

    :::

    2.3 通过XML装配bean

    这里介绍xml就采用相对简单的思路介绍了,建议xml如果要手动编辑的话,就直接上spring文章中复制吧,或者借助于sts之类的工具,这样确保不会出错是不。

    声明bean

    <bean class="soundsystem.SgtPeppers"/>

    本来想写的,想了想还是看文档吧,这里就不整理了,只是稍微提一下思路。

    2.4 导入和混合配置

    在JavaConfig中引用XML配置

    JavaConfig引用其它JavaConfig

    @Configuration
    @Import(CDConfig.class)
    public class Config{}

    JavaConfig引用xml配置文件

    @Configuration
    @ImportResource("classpath:cd-config.xml")
    public class Config{}

    在XML配置中引用JavaConfig

    在XML中引用JavaConfig

    <bean class="config.CDConfig"/>

    在XML中引用XML

    <import resource="cdplayer-config.xml"/>
  • 相关阅读:
    单元测试练习
    对软件的看法
    个人最终总结
    论文笔记--Fast RCNN
    个人最终总结2
    结对编程--基于android平台的黄金点游戏(2.0版本)
    结对编程--基于android平台的黄金点游戏
    团队作业(一)
    [java]wordcount程序
    第三周作业(二)
  • 原文地址:https://www.cnblogs.com/xuzhen97/p/9287248.html
Copyright © 2011-2022 走看看