1、Spring5-IOC操作Bean管理(基于注解方式)-《Java学习知识库》

admin 2025-11-02 01:25:39 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 1、什么是注解
  • 2、Spring 针对 Bean 管理中创建对象提供的注解
  • 3、基于注解方式实现对象创建
  • 4、开启组件扫描细节配置
  • 5、基于注解方式实现属性注入
    • (1)@Autowired:根据属性类型进行自动装配
    • (2)@Qualifier:根据属性名称进行注入
    • (3)@Resource:可以根据类型注入,也可以根据名称注入
    • (4)@Value:注入普通类型属性
  • 6、完全注解开发

    1、什么是注解

    (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..) (2)使用注解,注解作用在类上面,方法上面,属性上面 (3)使用注解目的:简化 xml 配置

    2、Spring 针对 Bean 管理中创建对象提供的注解

    (1)@Component (2)@Service (service层)(3)@Controller (web层)(4)@Repository (Dao层)* 上面四个注解功能是一样的,都可以用来创建 bean 实例

    3、基于注解方式实现对象创建

    第一步 引入依赖QQ截图20220419132713.png第二步 开启组件扫描

    1. <!--开启组件扫描
    2. 1 如果扫描多个包,多个包使用逗号隔开
    3. 2 扫描包上层目录
    4. -->
    5. <context:component-scan base-package="com.atguigu.spring5.dao,com.atguigu.spring5.service"></context:component-scan>
    6. <!--或-->
    7. <context:component-scan base-package="com.atguigu"></context:component-scan>

    第三步 创建类,在类上面添加创建对象注解

    1. package com.atguigu.spring5.service;
    2. import org.springframework.stereotype.Component;
    3. //在注解里面 value 属性值可以省略不写,
    4. //默认值是类名称,首字母小写
    5. //UserService -- userService
    6. @Component(value = "userService")//与 <bean id="userService" class=".."/> 类似的写法
    7. public class UserService {
    8. public void add(){
    9. System.out.println("service add......");
    10. }
    11. }

    4、开启组件扫描细节配置

    1. <!--示例 1
    2. use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter
    3. context:include-filter ,设置扫描哪些内容
    4. -->
    5. <context:component-scan base-package="com.atguigu" use-default-filters="false">
    6. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    7. <!--到com.atguigu包中只扫描带Controller注解的类-->
    8. </context:component-scan>
    1. <!--示例 2
    2. 下面配置扫描包所有内容
    3. context:exclude-filter: 设置哪些内容不进行扫描
    4. -->
    5. <context:component-scan base-package="com.atguigu">
    6. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    7. <!--到com.atguigu包中不扫描带Controller注解的类-->
    8. </context:component-scan>

    有了这个扫描机制之后呢,只需要在类上加个注解,Spring容器一扫描到这个注解,就会自动实例化这个类。对于扫描到的类, Spring 有默认的命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过 value 属性值标识组件的名称。

    5、基于注解方式实现属性注入

    从ioc容器中寻找bean对象再注入

    (1)@Autowired:根据属性类型进行自动装配

    第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解 第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解

    1. @Service
    2. public class UserService {
    3. //定义 dao 类型属性
    4. //不需要添加 set 方法
    5. //添加注入属性注解
    6. @Autowired
    7. private UserDao userDao;
    8. public void add() {
    9. System.out.println("service add......");
    10. userDao.add();
    11. }
    12. }

    (2)@Qualifier:根据属性名称进行注入

    这个@Qualifier 注解的使用,和上面@Autowired 一起使用

    1. @Service
    2. public class UserService {
    3. //定义 dao 类型属性
    4. //不需要添加 set 方法
    5. //添加注入属性注解
    6. @Autowired//根据类型进行注入
    7. @Qualifier(value = "userDaoImpl1")//根据名称进行注入
    8. private UserDao userDao;
    9. public void add() {
    10. System.out.println("service add......");
    11. userDao.add();
    12. }
    13. }
    14. //一个接口可能有多个实现类

    同一个接口的多个实现类中,如果不少于2个实现类都有创建对象的注解,那么只用@Autowired会报错(可能是因为用的是多态UserDao),所以就要用@Qualifier,同时实现类要确定各自的value值。

    (3)@Resource:可以根据类型注入,也可以根据名称注入

    1. // @Resource//根据类型进行注入
    2. @Resource(name = "userDaoImpl2")//根据名称进行注入
    3. private UserDao userDao;

    @Resource是javax.annotation.Resource;中的spring官方建议用@Autowired和@Qualifier(value = “”)来代替@Resource以上三个都是针对对象类型的注入,不针对普通类型的注入类似@Component , @Repository , @ Controller , @Service 这些注册Bean的注解存在局限性,只能局限作用于自己编写的类,


    (4)@Value:注入普通类型属性

    1. @Value(value = "abc")
    2. private String name;

    6、完全注解开发

    (1)创建配置类,替代 xml 配置文件

    1. @Configuration//作为配置类,替代 xml 配置文件
    2. @ComponentScan(basePackages = {"com.atguigu"})
    3. public class SpringConfig {
    4. }

    (2)编写测试类

    1. @Test
    2. public void testService2() {
    3. //加载配置类
    4. ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    5. UserService userService = context.getBean("userService", UserService.class);
    6. System.out.println(userService);
    7. userService.add();
    8. }

    注解int字段和集合类型的属性不方便???

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  7