# 13-使用注解方式实现Spring IoC

回到spring导航页

基于注解与Java Config配置IoC容器,使用注解或者Java Config与xml底层实现都是一样的

# 13-四种组件类型注解

# 基于注解的优势

  • 摆脱繁琐的XML形式的bean 与依赖注入的配置
  • 注解是基于“声明式”的原则,更适合轻量级的现代企业应用
  • 利用注解可以让代码可读性变得更好,研发人员拥有更好的开发体验

# spring 注解按功能划分

  1. 组件类型注解-声明当前类的功能与职责
  2. 自动装配注解-根据属性特征自动注入对象
  3. 元数据注解-更细化的辅助IoC容器管理对象的注解

# 四种组件类型注解

注解 说明
@Component 组件注解,通用注解,被该注解描述的类将被IoC容器管理并实例化
@Controller 语义注解,说明当前类是MVC应用中的控制器类
@Service 语义注解,说明当前类是Service业务服务类
@Repository 语义注解,说明当前类用于业务持久层,通常描述对应的Dao类
  • 什么是业务持久层:就是负责与数据库实现增删改查的Dao类
  • controller: (在使用MVC模式的时候使用过)是承上启下的类,用于接收用户的输入,调用service的方法,以及向客户端返回结果
  • Component: 组件注解,在实际开发中,当遇到无法确认当前类是repository 还是 Sevice 还是 Controller时,它的边界是模糊的,这个时候就可以使用@Component,@Component组件注解是一个最统称的注解,当不清楚类的职责时,就使用@Component就可以了

# 开启组件扫描

只有开启了组件扫描,才能使用注解

<!--XML配置开启组件扫描,才能使用注解-->
<context:component-scan base-package="">
   <!--这里是排除,不需要扫描的包,可以使用正则表达式,只有类名匹配这个正则表达式,就会被排除在外-->
   <contex:exclude-filter type="regex" expression="com.torey.exl.*" />
</context:component-scan>
1
2
3
4
5

# 基于注解初始化IoC容器代码示例

新建一个maven项目,引入pom.xml文件

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
1
2
3
4
5
6
7
8
9
10

在resources目录下新建applicationContext.xml文件,在如下官网 找到schema (opens new window)

schema

<?xml version="1.0" encoding="UTF-8"?>
<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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>
1
2
3
4
5
6
7
8
9
10
11
12

目录如下

package com.torey.spring.ioc.controller;

import org.springframework.stereotype.Controller;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:25
 * @描述:
 */
@Controller
public class UserController {

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.torey.spring.ioc.dao;

import org.springframework.stereotype.Repository;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:06
 * @描述:
 */
//组件类型注解默认beanId为类名首字母小写,@Repository : beanId=userDao
//也可以指定beanId=@Repository("user"), beanId=user
@Repository
public class UserDao {

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.torey.spring.ioc.service;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:22
 * @描述:
 */

import org.springframework.stereotype.Service;

@Service
public class UserService {
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.torey.spring.ioc.util;

import org.springframework.stereotype.Component;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:27
 * @描述:
 */
@Component("stringUtils")
public class StringUtils {

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

applicationContext.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <!--在IoC容器初始化时自动扫描四种组件类型注解并完成实例化
    @Repository  @Service   @Controller  @Component
    -->
    <context:component-scan base-package="com.torey.spring.ioc.*"></context:component-scan>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.torey.spring.ioc;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author http://torey611.gitee.io/li-tao-feng/
 * @Email torey6061@qq.com
 * @Date 2021/4/30 20:13
 * @描述:
 */
public class SpringApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        String[] definitionNames = context.getBeanDefinitionNames();
        for (String definitionName : definitionNames) {
            System.out.println(definitionName);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

输出打印如下:

userController
userDao
userService
stringUtilsAAA
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
1
2
3
4
5
6
7
8
9

# 导航,上一页,下一页

12自己实现一个极简的IoC容器
14自动装配与Autowired

# 支持我-微信扫一扫-加入微信公众号

Aseven公众号

# 赞赏作者

赞赏作者