天天看点

Spring IOC的三种配置方式

IOC:

       Inversion of Control 控制反转. 指的是对象的创建权反转(交给)给 Spring 管理,想要让Spring帮我们管理对象,前提是将对象交由Spring来创建。

Spring提供了三种IOC的配置:

1、XML声明配置

2、注解声明配置 (推荐)

3、JavaConfig声明配置 (推崇)

XML声明配置

      顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。现在很SSM的项目里,都将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。但其实更好的方式是通过JavaConfig的方式进行声明。

      优点: 可以使用于任何场景,结构清晰,通俗易懂

      缺点: 配置繁琐,不易维护,枯燥无味,扩展性差

举个栗子

1、配置application.xml文件(名字随意)

2、声明命名空间   xmlns="http://www.springframework.org/schema/beans ...

3、配置bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="ioc.User"/>
    
</beans>           

测试:这里采用SpringJUnitClassRunner的方式,方便测试,与本文无关

@RunWith(SpringJUnit4ClassRunner.class)
// 加载application.xml配置文件
@ContextConfiguration("classpath:application.xml")
public class SpringIocTest {

	@Resource
	private  User user;

	@Test
	public void test() {
		System.out.println(user);
	}

	// 输出结果:[email protected]
}           

注解声明配置

      通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。

      优点:开发便捷,通俗易懂,方便维护。

      缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用XML或JavaConfig的方式配置

举个栗子:

1、配置xml命名空间   xmlns:context="http://www.springframework.org/schema/context"

2、在xml中开启注解扫描

3、在类上声明注解

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- 开启注解扫描,base-package指定扫描的包-->
    <context:component-scan base-package="ioc"/>

</beans>           

测试:

@RunWith(SpringJUnit4ClassRunner.class)
// 加载application.xml配置文件
@ContextConfiguration("classpath:application.xml")
public class SpringIocTest {

	@Resource
	private  User user;

	@Test
	public void test1() {
		System.out.println(user);
	}

	// 输出结果:[email protected]
}           

JavaConfig声明配置

      将类的创建交给我们配置的JavcConfig类来完成,Spring只负责维护和管理,采用纯Java创建方式。其本质上就是把在XML上的配置声明转移到Java配置类中

      优点:适用于任何场景,配置方便,因为是纯Java代码,扩展性高,十分灵活

      缺点:由于是采用Java类的方式,声明不明显,如果大量配置,可读性比较差

举个栗子:

1、创建一个配置类 , 添加@Configuration注解声明为配置类

2、创建方法,方法上加上@bean,该方法用于创建实例并返回,该实例创建后会交给spring管理,方法名建议与实例名相同(首字母小写)。注:实例类不需要加任何注解

3、加载配置类(类似于之前加载application.xml配置文件)

/**
 * 配置类,可以声明任何的bean
 *
 * @author:LiChong
 * @date:2018/11/28
 */
@Configuration
public class BeanConfig {

	@Bean
	public User user() {
		return new User();
	}
}           

测试: 这里把加载xml配置文件改为加载配置类

@RunWith(SpringJUnit4ClassRunner.class)
// 加载beanConfig配置类
@ContextConfiguration(classes = BeanConfig.class)
public class SpringIocTest {

	@Resource
	private  User user;

	@Test
	public void test2() {
		System.out.println(user);
	}

	// 输出结果:[email protected]
}           

总结:

     这三种方式都可以将bean交给Spring管理,那么应该如何选择呢? 

     根据不同方式的优缺点,现在的企业开发一般采用如下方式:

     1、自定义声明的类(非第三方),采用注解的方式。

     2、对于第三方类,采用XML或者JavaConfig的方式。

    由于SpringBoot的出现,在无配置化的趋势下,XML配置逐渐被JavaConfig所取代,因为我们在创建类的同时可能还要做很多事情,这是XML不发满足的。SpringBoot推荐使用JavaConfig配置。

------------------------------------------------------------------------------------------------------------------------------------

文章内容纯属个人学习总结,如果不对之处,欢迎指正,感激不尽。