美文网首页
Spring 混合配置

Spring 混合配置

作者: jiangmo | 来源:发表于2018-10-23 09:34 被阅读30次

@Configuration 的@Import

@Configuration
public class CDConfig {
  @Bean
  public CompactDisc compactDisc() {
    return new SgtPeppers();
  }
}

@Configuration
public class CDPlayerConfig {
  @Bean
  public CDPlayer cdPlayer(CompactDisc compactDisc) {
    return new CDPlayer(compactDisc);
  }
}

现在有了这两个配置类,也集齐了两个bean,那么该如何把他们整合到一起呢,建立起它们的联系。这时候我们新建一个连接类SoundSystemConfig,引入另外的配置文件 用@Import

@Configuration
@Import(CDPlayerConfig.class, CDConfig.class)
public class SoundSystemConfig {

}

@Configuration 的@ImportResource

如果这时候CompactDisc接口的实现类BlankDisc是声明在XML中,这两种显示声明又会如何结合呢

public class BlankDisc implements CompactDisc {
  private String title;
  public BlankDisc(String title) {
    this.title = title;
  }

  public void play() {
    System.out.println("Playing " + title);
  }
}

// 配置的XML A1
<bean id="compactDisc"
        class="soundsystem.BlankDisc"
        c:_0="Sgt. Pepper's Lonely Hearts Club Band"/>

现在BlankDisc已经配置在XML中,那么Spring如何去加载这个XML配置文件读取到这个配置信息并加载呢。这里我们可以通过一个注解@ImportResource来完成这个操作。假设上面关于BlankDisc类的配置信息存放在cd-config.xml文件中,该文件在项目的根路径下。通过修改SoundSystemConfig即可完成加载bean。

@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {

}

XML 引入其他形式(javaconfiguration/xml)配置

// 上面的配置文件A1
<import resource="cd-config.xml">
// 引入配置类
<bean class="soundsystem.CDConfig" />

Spring Bean主要有三种不同方式:

基于XML的配置方式
基于注解的配置方式
基于Java类的配置方式

基于XML的配置方式

大家都知道

基于注解的配置方式

  • Spring2.0开始引入基于注解的配置方式,即Bean的定义信息可以通过在Bean的实现类上标注注解实现。
  • Spring在2.5后提供了一个context的命名空间,它提供了通过扫描类包来加载利用注解定义的Bean的方式。
<context:component-scan base-package="cn.lovepi.spring">
   <context:include-filter type="regex" expression="cn.lovepi.spring.*"/>
   <context:exclude-filter type="aspectj" expression="cn.lovepi..*Controller+"/>
</context:component-scan>
Bean的定义注解
  • Spring2.5在@Repository的基础上增加了功能类似的额外三个注解,总共有如下四种注解:

    • @Component:一个泛化的概念,表示一个组件(Bean),可作用在任何层次
    • @Controller:用于对Controller实现类进行标注,目前该功能与Component相同
    • @Repository:用于对DAO实现类进行标注
    • @Service:用于对Service实现类进行标注,目前该功能与Component相同
  • Spring3.0提供了一系列的针对依赖注入的注解,这使得Spring IoC在XML文件之外多了一种可行的选择,主要包含如下注解类型:

    • Bean的定义注解
    • Bean的生命周期注解
    • Bean的依赖检查注解
    • Bean的自动装配注解

激活注解<context:annotation-config/>

Bean的生命周期注解

Spring1.x为此提供了两种方式供用户指定执行生命周期回调的方法:

  • 实现Spring提供的两个接口:initializingBean 和 DisposableBean,这种方法是要求bean类实现Spring的接口,但增加了bean和Spring容器的耦合度,因此不推荐使用。
  • 在XML文件中使用<bean>的init-method 和 destory-method 属性,指定初始化之后和回调之前的回调方法。这两个属性的取值是bean中相应的初始化和销毁方法的名称。方法名称任意,但是方法不能有参数。

Spring2.5在保留以上两种方式的基础上,提供了对JSR-250的支持。
JSR-250规范定义了两个用于指定声明周期方法的注解:

  • @PostConstruct:初始化之后的执行的回调方法
  • @PreDestroy:销毁之前的回调方法
Bean的依赖检查注解 Required

使用Spring2.0提供的@Required注解,提供了更细粒度的控制,@Required注解只能标注在Setter方法之上,(标注在其他方法之上会被忽略 )用于检查其是否被调用,当Setter方法未被调用的话会抛出异常。
由于使用了注解,所以得激活Bean的后处理器,所以得在XML配置文件当中增加

Bean的自动装配注解

@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,他根据类型进行自动装配,如果需要按名称进行装配,则需要配合@Qualifier使用。
当标注了@Autowired的方法所需的类型在Spring容器中不存在的话会抛出异常

// 假如Spring容器中没有LogDao这个bean的话便会抛出异常。
// 解决的办法便是使用required=false属性来标注
public class LoginService{
   @Autowired(required=false)
   private LogDao LogDao;
}

// 假如Spring当中存在多个所需类型的bean,
// 那么便要使用@Qualifier注解来指定名称。
public class LoginService{
   @Autowired
   @Qualifier("userDao")
   private UserDao userDao;
}

// @Autowired 可以对类中集合类的变量或方法入参进行标注,
// 此时会将容器中类型匹配的所有Bean都注入进来
// Spring会将容器中所有类型为Plugin的bean都注入到集合中去
public class loginService{
   @Autowired(required=false)
   public List<Plugin> pligins;
   public List<Plugin> getPlugins(){
      return plugins;
   }
}

基于Java类的配置方式

基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件。
基于Java类如何定义Bean配置元数据具体步骤如下:

  • 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
  • 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
  • AnnotationConfigApplicationContext或子类进行加载基于java类的配置

注意:使用bean注解的方法不能是private、final、static的。

基于Java方式的配置方式不是为了完全替代基于XML方式的配置,两者可以结合使用,因此可以有两种结合使用方式:

  • 在基于Java方式的配置类中引入基于XML方式的配置文件, 即在java程序中使用@ImportResource导入了XML的配置文件
  • 在基于XML方式的配置文件中中引入基于Java方式的配置

总结:不同配置方式比较

其实Spring支持这么多的配置方式,那么这些配置方式必然有其自己独特的舞台

  • 基于XML的配置主要使用场景:
    第三方类库,如DataSource、JdbcTemplate等;
    命名空间,如aop、context等;
  • 基于注解的配置主要使用场景:
    Bean的实现类是当前项目开发的,可直接在Java类中使用注解配置
  • 基于Java类的配置主要使用场景:
    对于实例化Bean的逻辑比较复杂,则比较适合用基于Java类配置的方式

在日常的开发中我们主要是使用XML配置和注解配置方式向结合的开发方式,一般不推荐使用基于Java类的配置方式。

相关文章

网友评论

      本文标题:Spring 混合配置

      本文链接:https://www.haomeiwen.com/subject/eyuwzftx.html