spring5(四):IOC 操作 Bean 管理(基于注解方式)
创始人
2025-05-29 11:36:19
0

IOC操作Bean管理(基于xml方式)

  • 前言
  • 一、注解
    • 1、概述
  • 二、入门案例
    • 1、Bean 的创建
    • 2、Bean的自动装配
      • 2.1 @Autowired
      • 2、@Qualifie
      • 3、@Resource
      • 4、@Value
    • 3、扫描组件
      • 3.1 配置文件版
      • 3.2 注解版
    • 4、测试



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!

一、注解

1、概述

注解是代码特殊标记,
格式:@注解名称(属性名称=属性值, 属性名称=属性值..)

使用注解,注解作用在类上面,方法上面,属性上面

使用注解目的:简化 xml 配置

XML配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。
本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行。

二、入门案例

1、Bean 的创建

  1. @Component:将类标识为普通组件
  2. @Controller:将类标识为控制层组件
  3. @Service:将类标识为业务层组件
  4. @Repository:将类标识为持久层组件

注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。

创建控制层组件

@Controller
public class UserController {
}

创建接口UserService

public interface UserService {
}

创建业务层组件UserServiceImpl

@Service
public class UserServiceImpl implements UserService {
}

创建接口UserDao

public interface UserDao {
}

创建持久层组件UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
}

2、Bean的自动装配

2.1 @Autowired

⭕ 概述

根据属性类型进行自动装配,在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。以后我们在项目中的正式用法就是这样。

⭕ 例子
UserDao接口

public interface UserDao {public void add();
}

UserDaoImpl类

@Repository
public class UserDaoImpl implements com.ir.dao.UserDao {@Overridepublic void add() {System.out.println("dao add.....");}
}

UserService类

@Service
public class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Autowiredprivate UserDao userdao;public void add() {System.out.println("service add.......");userdao.add();}
}

测试;

@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService1 =  context.getBean("userService",UserService.class);System.out.println(userService1);//com.ir.service.UserService@8909f18userService1.add();//service add.......  dao add.....}

⭕ 注意点

@Autowired注解可以标记在构造器和set方法上

@Controller
public class UserController {private UserService userService;@Autowiredpublic UserController(UserService userService){this.userService = userService;}public void saveUser(){userService.saveUser();}
}
@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService){this.userService = userService;}userService.saveUser();}
}

⭕ @Autowired工作流程
在这里插入图片描述
在这里插入图片描述

@Controller
public class UserController {@Autowired@Qualifier("userServiceImpl")private UserService userService;public void saveUser(){userService.saveUser();}
}

@Autowired中有属性required,默认值为true,因此在自动装配无法找到相应的bean时,会装配失败

可以将属性required的值设置为true,则表示能装就装,装不上就不装,此时自动装配的属性为默认值
但是实际开发时,基本上所有需要装配组件的地方都是必须装配的,用不上这个属性。

2、@Qualifie

根据名称进行注入
@Qualifier 注解的使用,和上面@Autowired 一起使用

UserService类

@Service
public class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Autowired@Qualifier(value = "userDaoImpl1") //根据名称进行注入private UserDao userdao;public void add() {System.out.println("service add.......");userdao.add();}
}

UserDaoImp类

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements com.ir.dao.UserDao {@Overridepublic void add() {System.out.println("dao add.....");}
}

测试

   @Testpublic void test3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService1 =  context.getBean("userService",UserService.class);System.out.println(userService1);//com.ir.service.UserService@7fc229abuserService1.add();//service add.......  dao add.....}

3、@Resource

可以根据类型注入,可以根据名称注入

 

UserDaoImpl

@Repository(value = "userDaoImpl2")
public class UserDaoImpl implements com.ir.dao.UserDao {@Overridepublic void add() {System.out.println("dao add.....");}
}

UserService


@Service
public class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Resource(name = "userDaoImpl2")private UserDao userdao;public void add() {System.out.println("service add.......");userdao.add();}
}

测试:

@Testpublic void test4(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService1 =  context.getBean("userService",UserService.class);System.out.println(userService1);//com.ir.service.UserService@15761df8userService1.add();//service add.......  dao add.....}

UserService

@Service
public class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Resource//无添加属性表示此时该注解是通过【属性类型】来注入private UserDao userdao;public void add() {System.out.println("service add.......");userdao.add();}
}

UserDaoImpl

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements com.ir.dao.UserDao {@Overridepublic void add() {System.out.println("dao add.....");}
}

测试:

   @Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService1 =  context.getBean("userService",UserService.class);System.out.println(userService1);//com.ir.service.UserService@15761df8userService1.add();//service add.......  dao add.....}

4、@Value

注入普通类型属性

UserService类

@Service
public class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Resource//无添加属性表示此时该注解是通过【属性类型】来注入private UserDao userdao;@Value(value = "abc")private String name;public void add() {System.out.println("service add.......");userdao.add();}
}

测试

    @Testpublic void test5(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService =  context.getBean("userService",UserService.class);System.out.println(userService);//com.ir.service.UserService@add0edduserService.add();//service add.......          dao add.....System.out.println(userService.name);//abc}

3、扫描组件

3.1 配置文件版

情况一:最基本的扫描方式



情况一:最基本的扫描方式



情况二:指定要排除的组件







情况三:仅扫描指定组件









3.2 注解版

创建配置类,替代 xml 配置文件

@Configuration  //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.ir"})//扫描包
public class SpringConfig {}

4、测试

 @Testpublic void test1(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService1 = (UserService) context.getBean("userService1");System.out.println(userService1);//com.ir.service.UserService@7920ba90userService1.add();//service add.......}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...