Spring IoC
02-IoC之使用注解实现
2021-08-20 107 1
简介
1. Spring 注解介绍
1、什么是注解
(1)注解是代码特殊标记,格式: @注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置
2、 Spring 针对 Bean 管理中创建对象提供注解
(1) @Component 普通的注解
(2) @Service 一般用于 业务层
(3) @Controller 一般用于web层
(4) @Repository 一般用于DAO层
* 上面四个注解功能是一样的,都可以用来创建 bean 实例,但是建议区分使用,便于维护,便于见名知意。
2. 注解方式创建Bean
2.1 引入依赖
spring-aop-5.2.6.RELEASE.jar
2.2 开启组件扫描
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.ylaihui"></context:component-scan>
</beans>
2.3 创建类
// 等价于 <bean> 标签配置, 同时 value = "userService" 可以省略, 默认就是类名首字母小写
@Component(value = "userService")
public class UserService {
public void fun(){
System.out.println("fun ...");
}
}
2.4 测试代码
@Test
public void test1(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.fun();
}
3. 在xml配置中扫描注解
<!--
use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter
context:include-filter ,设置扫描哪些内容
-->
<!-- 只扫描 Controller 注解 -->
<context:component-scan base-package="com.ylaihui" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
下面配置扫描包所有内容,但是不扫描 Controller 注解
context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.ylaihui">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
4. 自动装配
(1) @Autowired:根据属性类型进行自动装配
第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解
(2) @Qualifier:根据名称进行注入
@Qualifier 注解的使用,和上面@Autowired 一起使用
@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("user daoimpl add ...");
}
}
@Component(value = "userService")
public class UserService {
// Autowired 基于类型进行注入
// Qualifier 基于名称进行注入, UserDao是个接口,实现类有多个,如果只基于类型, 会不知道是注入哪个类型的对象
// Autowired 和 Qualifier 一起配合使用
@Qualifier(value = "userDaoImpl1")
@Autowired
UserDao userDao;
public void fun(){
System.out.println("fun ...");
userDao.add();
}
}
5.Resource 根据类型、名称注入
Spring官方不建议使用,因为,它是基于Javax的,不是spring的
@Resource:可以根据类型注入,可以根据名称注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;
6. Value注解注入类中的普通类型的属性
@Value:注入普通类型属性
@Value(value = "abc")
private String name;
7. 完全注解开发
7.1 创建配置类, 替代xml配置文件
完全注解开发,可以替代xml配置开启组件扫描
// 完全注解开发
// 使用 Configuration 和 ComponentScan 注解 替代 xml配置中的开启组件扫描
// <context:component-scan base-package="com.ylaihui"></context:component-scan>
@Configuration
@ComponentScan(basePackages = {"com.ylaihui"})
public class SpringConfig {
}
7.2 具体类和测试类
@Service
public class BookService {
public void addBook(){
System.out.println("add book...");
}
}
// 完全注解开发, 需要指定 开启注解扫描的 类 SpringConfig
@Test
public void test2(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
BookService bookService = context.getBean("bookService", BookService.class);
bookService.addBook();
}