07、Spring中XML配置和JavaConfig配置比较
创始人
2024-03-25 07:24:19
0

1、JavaConfig的优势

  • 我们之前基本都是使用xm的方式进行配置,随着功能和业务的日益增加,会导致我们的配置文件过于庞大。
  • bean之间的依赖关系也会变得更加复杂,使用起来很不方便。
  • Spring3.0开始,官方推荐出了使用Java配置的方式来替代传统的xml配置方式。
  • 面向对象的配置,由于配置被定义未JavaConfig中的类,因此用户可以充分使用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法。
  • 减少或消除xml配置,提供 了一些纯粹的java配置的方式来配置与xml配置概念相似的Spring容器。
  • 类型安全、重构友好。提供了一种类型安全的方法来配置Spring容器。

2、对比XML方式配置IoC和JavaConfig配置Bean的方式

1、定义两个bean

@Data
public class SomeBean {private OtherBean otherBean;
}@Data
public class OtherBean { public OtherBean() {System.out.println("OtherBean 被创建");}
}

2、XML配置bean交给Spring IoC容器管理



3、测试获取bean

public class IoCTest {@Testpublic void testXmlConfig() {ApplicationContext ctx = new ClassPathXmlApplicationContexnt("classpath:applicationContext.xml");SomeBean someBean = ctx.getBean(SomeBean.class);System.out.println(someBean);}
}

4、JavaConfig方式配置IoC

  • JavaConfig 方式中使用注解彻底的替代 XML 文件。
  • @Configuration:在类上贴该注解表示该类是一个Spring的配置类,与我们之前书写的applicationContext.xml的作用相同。
  • @Bean:在Spring配置类的方法上贴该注解后,方法的返回的对象会交给Spring容器管理,用于替代applicationContext.xml中的bean标签。
  • @ComponentScan:在Spring配置类上贴该注解表示开启组件扫描器
    • 默认扫描当前配置类所在的包
    • 也可以自己指定,替代xml配置中的
  • AnnotationConfigApplicationContext:该类是 ApplicationContext 接口的实现类,该对象是基于 JavaConfig 的方式来运作的 Spring 容器。

5、定义一个配置类

/**
* @Configuration
* 贴有该注解的类表示 Spring 的配置类
* 用于替代传统的 applicationContext.xml
*/
@Configuration
public class JavaConfig{/*** @Bean* 该注解贴在配置类的方法上,该方法会被 Spring 容器自动调用* 并且返回的对象交给 Spring 管理* 相当于 */@Beanpublic SomeBean(){return new SomeBean();}
}

6、测试一下

public class IoCTest {@Testpublic void testJavaConfig() {// 加载配置类,创建 Spring 容器ApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);// 从容器中取出 SomeBean 对象SomeBean someBean = ctx.getBean(SomeBean.class);System.out.println(someBean);}
}

7、@Bean属性讲解

  • name:对应bean标签中的name属性,用于给bean取别名。
  • initMethod:对应bean标签中的init-method属性,配置bean的初始化方法。
  • destroyMethod:对应bean标签中的destroy-method属性,配置bean的销毁方法。
  • bean的id其实就是当方法的方法名。
  • 配置多例在方法上添加@Scope(“prototype”)

3、对比XML方式配置IoC和JavaConfig配置DI的方式

1、XML方式配置DI



2、JavaConfig配置DI

public class JavaConfig{@Beanpublic SomeBean someBean(){return new SomeBean();}@Beanpublic OtherBean otherBean(){return new OtherBean();}
}

1、通过方法形参注入

public class JavaConfig{@Beanpublic SomeBean someBean(OtherBean otherBean){SomeBean someBean = new SomeBean();someBean.setOtherBean(otherBean);return someBean;}
}

2、通过调用方法注入

public class JavaConfig{@Beanpublic OtherBean otherBean(){return new OtherBean();}@Beanpublic SomeBean someBean() {SomeBean someBean = new SomeBean();someBean.setOtherBean(otherBean());return someBean;}	
}

3、使用IoC DI注解简化配置

  • 在配置类内部去定义方法返回 bean 对象交给 Spring 管理的方式存在一个问题,就是如果需要创建的 bean 很多的话,那么就需要定义很多的方法,会导致配置类比较累赘,使用起来不方便。
  • 以前可以通过注解简化 XML 配置,现在同样也可以通过注解简化 JavaConfig,这里需要使用到 @ComponentScan 注解,等价于之前 XML 配置的
  • 具体使用如下
  • 两个bean类
@Component
@Data
public class SomeBean {@AutoWiredprivate OtherBean otherBean;
}@Component
public class OtherBean { public OtherBean() {System.out.println("OtherBean 被创建");}
}
  • JavaConfig类
@Configuration // 表示该类是 Spring 的配置类
@ComponentScan // 开启组件扫描器,默认扫描当前类所在的包,及其子包
public class JavaConfig { }

4、Spring Test 方式加载配置类

1、在项目中添加如下依赖

org.springframeworkspring-test5.0.8.RELEASEtest

junitjunit4.12test

org.junit.jupiterjunit-jupiter-api5.6.3test

2、Junit4方式

1、基于XML

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:XML文件路径")
public class IoCTest { @Autowiredprivate SomeBean someBean;@Testpublic void test() {System.out.println(someBean);}
}

2、基于配置类的方式

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={配置类.class,.....})
public class IoCTest { @Autowiredprivate SomeBean someBean;@Testpublic void test() {System.out.println(someBean);}
}

3、Junit5的方式

@SpringJUnitConfig(配置类.class)
class IoCTest {@Autowiredprivate SomeBean someBean;@Testvoid test() {System.out.println(someBean);}
}

5、配置类的导入

1、xml方式



2、配置类方式

// 主配置类
@Configuration
@Import(OtherJavaConfig.class) // 在主配置类中关联次配置类
public class JavaConfig { ... }// 次配置类
@Configuration
public class OtherJavaConfig { ... }

相关内容

热门资讯

每周股票复盘:金证股份(600... 截至2025年12月26日收盘,金证股份(600446)报收于15.75元,较上周的15.46元上涨...
每周股票复盘:日盈电子(603... 截至2025年12月26日收盘,日盈电子(603286)报收于59.5元,较上周的57.11元上涨4...
每周股票复盘:盐 田 港(00... 截至2025年12月26日收盘,盐 田 港(000088)报收于4.53元,较上周的4.52元上涨0...
每周股票复盘:广电网络(600... 截至2025年12月26日收盘,广电网络(600831)报收于4.2元,较上周的4.36元下跌3.6...
每周股票复盘:新疆火炬(603... 截至2025年12月26日收盘,新疆火炬(603080)报收于22.85元,较上周的22.73元上涨...
每周股票复盘:瀚川智能(688... 截至2025年12月26日收盘,瀚川智能(688022)报收于15.3元,较上周的14.42元上涨6...
每周股票复盘:中粮糖业(600... 截至2025年12月26日收盘,中粮糖业(600737)报收于17.27元,较上周的17.18元上涨...
每周股票复盘:马钢股份(600... 截至2025年12月26日收盘,马钢股份(600808)报收于4.22元,较上周的3.82元上涨10...
每周股票复盘:内蒙一机(600... 截至2025年12月26日收盘,内蒙一机(600967)报收于16.34元,较上周的16.05元上涨...
富达基金投顾业务负责人戴旻:封... 由三亚市人民政府主办,《财经》杂志、财经网、《财经智库》、三亚中央商务区管理局、三亚经济研究院承办的...