Inversion of Control 控制反转. 指的是对象的创建权反转(交给)给 Spring 管理,想要让Spring帮我们管理对象,前提是将对象交由Spring来创建。
1、XML声明配置
2、注解声明配置 (推荐)
3、JavaConfig声明配置 (推崇)
顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。现在很SSM的项目里,都将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。但其实更好的方式是通过JavaConfig的方式进行声明。
优点: 可以使用于任何场景,结构清晰,通俗易懂
缺点: 配置繁琐,不易维护,枯燥无味,扩展性差
举个栗子
1、配置application.xml文件(名字随意)
2、声明命名空间 xmlns="http://www.springframework.org/schema/beans ...
3、配置bean
测试:这里采用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);
}
// 输出结果:ioc.User@1a84f40f
}
通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。
优点:开发便捷,通俗易懂,方便维护。
缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用XML或JavaConfig的方式配置
举个栗子:
1、配置xml命名空间 xmlns:context="http://www.springframework.org/schema/context"
2、在xml中开启注解扫描
3、在类上声明注解
测试:
@RunWith(SpringJUnit4ClassRunner.class)
// 加载application.xml配置文件
@ContextConfiguration("classpath:application.xml")
public class SpringIocTest {
@Resource
private User user;
@Test
public void test1() {
System.out.println(user);
}
// 输出结果:ioc.User@49e53c76
}
将类的创建交给我们配置的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);
}
// 输出结果:ioc.User@34b7ac2f
}
这三种方式都可以将bean交给Spring管理,那么应该如何选择呢?
根据不同方式的优缺点,现在的企业开发一般采用如下方式:
1、自定义声明的类(非第三方),采用注解的方式。
2、对于第三方类,采用XML或者JavaConfig的方式。
由于SpringBoot的出现,在无配置化的趋势下,XML配置逐渐被JavaConfig所取代,因为我们在创建类的同时可能还要做很多事情,这是XML不发满足的。SpringBoot推荐使用JavaConfig配置。
------------------------------------------------------------------------------------------------------------------------------------
文章内容纯属个人学习总结,如果不对之处,欢迎指正,感激不尽。