【Spring 从0开始】IOC容器的Bean管理 - 基于注解 - 属性注入

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Spring 从0开始】IOC容器的Bean管理 - 基于注解 - 属性注入

基于注解方式进行属性注入,涉及到 4 个注解:


  • @Autowired:根据属性类型,进行自动装配
  • @Qualifier:根据属性名称进行注入,跟 @Autowired 一起使用
  • @Resource:既可以根据类型注入,也可以根据名称注入
  • @Value:注入普通类型属性


一、@Autowired


现在有这样的一个结构,我要在 service 里注入 dao 对象。


1268169-20210801102821199-2118216264.png


1. 添加对象注解


给 service 和 dao 添加注解,用来创建对象。


为了区分明显,service 层用 @Service,dao 层用 @Repository。


// content of UserService
@Service
public class UserService {
    public void add() {
        System.out.println("service add() ... ...");
    }
}
@Repository
public class UserDaoImpl implements UserDao{
    @Override
    public void add() {
        System.out.println("UserDao add()... ...");
    }
}


2. 在service中注入dao对象


@Service
public class UserService {
    // 定义 dao 属性
    @Autowired
    private UserDao userDao;
    public void add() {
        System.out.println("service add() ... ...");
        userDao.add();
    }
}


先定义 dao 属性,然后在上面添加注解 @Autowired 即可,而且不需要我们手动添加 set 方法了。


为了方便看到注入成功效果,里面还调用了 userDao.add() 方法。


3. 创建测试函数测试效果


public class TestService {
    @Test
    public void testService() {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }
}


这里调用了 userService.add() 方法,而 userService.add() 内部又调用了 userDao.add(),所以应该可以看到 2 个输出:


com.pingguo.spring5.service.UserService@23f7d05d
service add() ... ...
UserDao add()... ...
Process finished with exit code 0


二、@Qualifier


根据属性名称进行注入,跟 @Autowired 一起使用。


为什么要一起使用?


比如现在,我新增一个 dao 的实现类 UserDaoImpl2


1268169-20210801105507406-835788585.png


@Repository
public class UserDaoImpl2 implements UserDao {
    @Override
    public void add() {
        System.out.println("UserDao UserDaoImpl2 add()... ...");
    }
}


所以现在 UserDaoImpl 和 UserDaoImpl2 这2个类都是同一种类型,那么 @Autowired 注入的时候到底是用哪个类呢?于是报错了。


1268169-20210801105729370-1791421364.png


所以,要加上 @Qualifier 来指定其中一个的具体名称。比如,我这里使用 UserDaoImpl2 。


1268169-20210801105850313-1866980572.png


再次执行测试函数:


com.pingguo.spring5.service.UserService@75f32542
service add() ... ...
UserDao UserDaoImpl2 add()... ...
Process finished with exit code 0


可以看到 UserDaoImpl2 里的内容被输出,注入正确。


三、@Resource


既可以根据类型注入,也可以根据名称注入。


1. 替代 @Autowired


可以直接替代 @Autowired 使用。


现在我把 UserDaoImpl2 这个实现类注释掉,只留下一个实现类。


service 里使用 @Resource 注解:


@Service
public class UserService {
    // 定义 dao 属性
    @Resource
    private UserDao userDao;
    public void add() {
        System.out.println("service add() ... ...");
        userDao.add();
    }
}


运行测试:


com.pingguo.spring5.service.UserService@23f7d05d
service add() ... ...
UserDao add()... ...
Process finished with exit code 0


结果正确。


2. 替换 @Qualifier


替换 @Qualifier 使用的话,里面的值用 name 传递,比如 @Resource(name = "userDaoImpl2")


现在去掉 UserDaoImpl2 的注释,让 dao 有 2 个实现类。


service 中 使用 @Resource 注解:


@Service
public class UserService {
    // 定义 dao 属性
    @Resource(name = "userDaoImpl2")
    private UserDao userDao;
    public void add() {
        System.out.println("service add() ... ...");
        userDao.add();
    }
}


运行测试:


com.pingguo.spring5.service.UserService@197d671
service add() ... ...
UserDao UserDaoImpl2 add()... ...
Process finished with exit code 0


结果正确。


这里要提一下的是,Resource 是来自拓展包 javax。另外 2个 则是来自官方框架包,优先使用。


1268169-20210801142531801-1720310817.png


四、@Value


上面使用的都是注入对象类型的属性,使用 @Value 可以注入普通类型,比如 String。

在 service 里增加一个 String 类型的属性 userName,并且在下面的方法里做个打印输出。


@Service
public class UserService {
    // 定义 dao 属性
    @Autowired
    @Qualifier(value = "userDaoImpl2")
    private UserDao userDao;
    @Value(value = "spring 从0开始")
    private String userName;
    public void add() {
        System.out.println("service add() ... ...");
        System.out.println(userName);
        userDao.add();
    }
}


运行测试:


com.pingguo.spring5.service.UserService@184cf7cf
service add() ... ...
spring 从0开始
UserDao UserDaoImpl2 add()... ...
Process finished with exit code 0


注入成功。

相关文章
|
10天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
28 0
|
17天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
13天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
47 1
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
214 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
5月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
62 0
|
3月前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
3月前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
3月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)