Spring IOC

如果一个系统有大量的组件,其生命周期和相互之间的依赖关系如果由组件自身来维护,不但大大增加了系统的复杂度,而且会导致组件之间极为紧密的耦合,继而给测试和维护带来了极大的困难。

IoC解决了组件的生命周期管理问题,例如

  • 谁负责创建组件?
  • 谁负责根据依赖关系组装组件?
  • 销毁时,如何按依赖顺序正确销毁?

在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件

Spring的IoC容器接口为ApplicationContext,有多种实现类,常用的有ClassPathXmlApplicationContext(从xml文件读取bean装配信息),AnnotationConfigApplicationContext(从注解读取bean装配信息)等

通过注解方式配置bean更为灵活,常用的注解有


@Component:定义bean,默认名字是小写字母开头的类名,例如

1@Component
2public class MailService {
3    ...
4}

@Component默认创建的是单例,如果需要每次注入新的示例,需要加上@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)注解


@Autowired:注入bean,可以加在字段set()方法,字段本身,或构造方法,常用的为加在字段本身,例如

1public class UserService {
2
3    @Autowired
4    MailService mailService;
5    
6    ...
7}

@Autowired也可以加在List对象上,此时容器会将所有符合条件的bean注入该对象,可以在@Component注解时追加@Order(1)注解来指定顺序

@Autowired(required = false)表示非必须存在bean定义,找不到就不注入;默认required = true,如果没有找到符合条件的bean会抛出NoSuchBeanDefinitionException异常


@Configuration:配置类,例如

1@Configuration
2@ComponentScan
3public class AppConfig {
4    public static void main(String[] args) {
5        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
6        
7        ...
8    }
9}

上例中@ComponentScan用于告诉容器自动搜索当前类所在的包以及子包,创建通过@Component注解的bean,并通过@Autowired注入

未完待续。。。