# 13-使用注解方式实现Spring IoC
基于注解与Java Config配置IoC容器,使用注解或者Java Config与xml底层实现都是一样的
# 13-四种组件类型注解
# 基于注解的优势
- 摆脱繁琐的XML形式的bean 与依赖注入的配置
- 注解是基于“声明式”的原则,更适合轻量级的现代企业应用
- 利用注解可以让代码可读性变得更好,研发人员拥有更好的开发体验
# spring 注解按功能划分
- 组件类型注解-声明当前类的功能与职责
- 自动装配注解-根据属性特征自动注入对象
- 元数据注解-更细化的辅助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
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
2
3
4
5
6
7
8
9
10
在resources目录下新建applicationContext.xml文件,在如下官网 找到schema (opens new window)
<?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
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
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
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
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
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
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
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
2
3
4
5
6
7
8
9
# 导航,上一页,下一页
12自己实现一个极简的IoC容器
14自动装配与Autowired