Spring学习(三)-- IoC 容器使用

2021-10-17  本文已影响0人  MikeShine

1. 写在前面

在之前的一个小节中,我们了解了 IoC 容器的原理和设计思想。其核心就是 控制反转ROC依赖注入DI
在这个设计基础上,我们通过IOC容器来完成Bean 的创建和装配(这其中包含了大量的依赖注入相关工作),省去了程序员很多繁琐的工作。
那么一个 IOC 容器装配 Bean 的过程如何呢,下面我们看一下流程


2. 装配 Bean

这里给出了一个例子。
整个工程结构如下:

maven 工程
这里类的依赖关系为:
UserService 通过 setMailService() 方法注入了一个 MailService 对象

要装配一个 Bean,共分这么几步:

(1) 编写 application.xml 配置文件

注意这个配置文件在 resources 目录下,算作资源文件。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userService" class="com.itranswarp.learnjava.service.UserService">
        <property name="mailService" ref="mailService" />
    </bean>

    <bean id="mailService" class="com.itranswarp.learnjava.service.MailService" />
</beans>

简单看一下这个配置文件,其他都是固定的。
我们关注一下, <bean> 的配置 :

把这个配置文件加载的内容用代码写出来:

UserService userService = new Userservice();
MailService mailService = new MailService();
userService.setMailService(mailService);

同样,如果注入的不是 Bean,而是 booleanint、'String' 这样的数据类型,则通过 value 注入,例如:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="password" />
    <property name="maximumPoolSize" value="10" />
    <property name="autoCommit" value="true" />
</bean>

(2) 使用 IoC 容器创建 Bean
首先,创建Spring 的IoC 实例,让其加载配置文件。

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

之后,从容器中“取出”装配好的Bean使用:

// 获取 Bean:
UserService userService = context.getBean(UserService.class);
// 使用 Bean:
User user = userService.login("xxx.mail.com","password");

3. 使用 Annotation 配置

从上面可以看到,使用XML 文件,核心就是告诉 Spring 这些Bean 之间的依赖关系。
但是XML文件的编写非常麻烦。

这也是为什么在你自己的工程文件中没有看到这样的配置文件的原因

为了简化这个事情,我们这里还有一种方式,就是采用 Annotation 配置。这样可以让 Spring 自动扫描并且装配这些Bean。参考这里

(1)在类上添加注解

对之前的工程进行改造,删除XML配置文件,在对应的Bean添加相关的注解:

@Component
public class MailService {
    ···
}

@Component 注解 相当于定义了一个 Bean,这个 Bean 的名称默认为mailService,即小写类名。

@Component
public class UserService{
    @Autowired
    MailService mailService;
}

这里使用了 @Component@Autowired 两个注解,分别定义一个 Bean、完成注入。

(2)编写AppConfig类启动容器

@Configuration
@ComponentScan
public class AppConfig{
        public static void main(String[] args){
              ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
              UserService userService = context.getBean(UserService.class);
              // 使用 Bean
              User user = userService.login("bob@example.com", "password");
              System.out.println(user.getName());
        }
}

所以,应该按照如下的工程结构来组织:


Annotation 工程架构

总结

使用 Annotation 来完成Bean的创建和装配需要满足:

上一篇下一篇

猜你喜欢

热点阅读