Spring:IoC容器(基于注解管理bean)

1. HelloWorld 

  1. * 引入依赖
  2. * 开启组件扫描
  3. * 使用注解定义 Bean
  4. * 依赖注入

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-3.0.xsd
    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描功能-->
    <!--<context:component-scan base-package="com.itgyl.bean"></context:component-scan>-->
    <context:component-scan base-package="com.itgyl.bean"></context:component-scan>
</beans>

 3.创建bean

@Component//该注解效果等同于<bean id="user" class="...">如果写value创建bean对象值默认使用开头字母为小写的类名
public class User {

}

4.完成依赖注入

 @Test
    public void testUser() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        System.out.println(context);

        //获取bean时会自动完成依赖注入
        User user = context.getBean(User.class);
        System.out.println(user);
    }

 

 2. @Autowire注入

2.1 根据属性自动注入 

以MVC架构模式为栗 

@Controller
public class UserController {
    /***
     * 1.根据属性自动注入
     */
    @Autowired //根据类型找到对应对象完成自动注入
    private UserService userService;

    public void show() {
        userService.show();
        System.out.println("controller...");
    }
}
@Service
public class UserServiceImp implements UserService{
    /***
     * 1.根据属性完成自动注入
     */
    @Autowired //该注解会通过类型找到对应的对象完成注入
    private UserDao userDao;

    @Override
    public void show() {
        userDao.show();
        System.out.println("userService...");
    }
}
@Repository
public class UserDaoImp implements UserDao{
    @Override
    public void show() {
        System.out.println("userDao...");
    }
}

基于全注解配置IoC容器,把xml的配置文本用类来代替

@Configurable   //基于全注解创建IoC容器配置一个类,该类加上两个注解,注解@Configurable即该类为配置类
@ComponentScan("com.itgyl.autowired") //@ComponentScan注解里面的路径即从哪个包开始扫描自动注入bean
public class SpringConfig {
}
public class TestAutoWired {
    public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);

        UserController userController = context.getBean(UserController.class);
        userController.show();
    }
}

 

2.2 根据set方法自动注入

/***
     * 2.根据set方法自动注入
     */
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
/***
     * 2.根据set方法完成自动注入
     */
    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

2.3 根据构造器自动注入

/***
     * 3.根据构造器完成自动注入
     */
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
/***
     * 3.根据构造器完成自动注入
     */
    @Autowired
    public UserServiceImp(UserDao userDao) {
        this.userDao = userDao;
    }

2.4 通过形参自动注入

/***
     * 4.通过形参注入
     */
    public UserController(@Autowired UserService userService) {
        this.userService = userService;
    }
/***
     * 4.通过形参注入
     */
    @Autowired
    public UserServiceImp(@Autowired UserDao userDao) {
        this.userDao = userDao;
    }

2.5 通过@AutoWire和@Qualifier注解完成注入

 @Autowired
    @Qualifier(value = "userServiceImp") //默认名字为开头首字母小写的类的名字
    private UserService userService;
@Autowired
    @Qualifier(value = "userDaoImp")
    private UserDao userDao;

总结

**总结**

* @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
* 当带参数的构造方法只有一个,@Autowired注解可以省略。()
* @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

 

3. @Resource注入 

 3.1 根据name注入

@Controller
public class UserController {

    //@Resource注解即该实例化对象源于哪name的值要和传递的实例化对象保持一致
    //指定值接收就按照该值找相应的实例化bean
    @Resource(name = "myUserService")
    private UserService userService;

    public void show() {
        userService.show();
        System.out.println("controller...");
    }
}

3.2 无name值注入

//@Service中value的值即要传递的实例化对象,接收时的值要和该值保持一致
@Service(value = "myUserService")
public class UserServiceImp implements UserService {

    //@Resource此时不指定name的值则使用属性中的变量名和传递的bean实例化对象相匹配,要求该属性名和值保持一致
    //当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。
    @Resource
    private UserDao myUserDaoImp;

    @Override
    public void show() {
        myUserDaoImp.show();
        System.out.println("userService...");
    }
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {
    @Override
    public void show() {
        System.out.println("userDao...");
    }
}
@Configurable
@ComponentScan("com.itgyl.resource")
public class SpringConfig {
}
public class TestResource {
    public static void main(String[] args) {
        //通过全注解方式获取管理对象的IoC容器
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);

        UserController u = context.getBean(UserController.class);
        u.show();
    }
}

总结

总结:**

@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651352.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统管理、磁盘分区

系统管理 业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;硬盘的作用&#xff1a; **硬盘&#xff1a;**计算机的存储设备&#xff0c;机械硬盘是由一个或者多个磁性的盘组成&#xff0c;可以在盘片上进行数据的读写。 连接方式&#xff1a…

【CGAL】Region_Growing 检测平面并保存

目录 说明一、算法原理二、代码展示三、结果展示 说明 本篇博客主要介绍CGAL库中使用Region_Growing算法检测平面的算法原理、代码以及最后展示结果。其中&#xff0c;代码部分在CGAL官方库中提供了例子。我在其中做了一些修改&#xff0c;使其可以读取PLY类型的点云文件&…

解析边缘计算网关的优势-天拓四方

随着信息化、智能化浪潮的持续推进&#xff0c;计算技术正以前所未有的速度发展&#xff0c;而边缘计算网关作为其中的重要一环&#xff0c;以其独特的优势正在逐步改变我们的生活方式和工作模式。本文将详细解析边缘计算网关的优势。 首先&#xff0c;边缘计算网关具有显著的…

Python 文件操作指南:使用 open 和 with open 实现高效读写

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本系列文章主要分享文件操作&#xff0c;了解如何使用 Python 进行文件的读写操作&#xff0c;介绍常见文件格式的读取和写入方法&#xff0c;包括TXT、 CS…

开源博客项目Blog .NET Core源码学习(27:App.Hosting项目结构分析-15)

本文学习并分析App.Hosting项目中后台管理页面的角色管理页面。   角色管理页面用于显示、检索、新建、编辑、删除角色数据同时支持按角色分配菜单权限&#xff0c;以便按角色控制后台管理页面的菜单访问权限。角色管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑…

【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CMA算法&#xff08;恒模算法&#xff09; CMA&#xff08;Constant Modulus Algorithm&#xff0c;恒模算法&#xff09;是一种自适应盲均衡算法&#xff0c;主要用于消除信道对信号的码间干扰&#xff08;ISI&#xff09;…

黑灰产攻防对抗——中睿天下代理秒拨IP防护研究

01网络攻击代理现状 随着攻击者防溯源和绕过防护意识的加强&#xff0c;攻击者进行网络攻击时常使用代理IP进行攻击&#xff0c;防止非法攻击时被追踪到身份信息。目前常见的代理方式有socks代理、HTTP/HTTPS代理、VPN、秒拨等。 对于企业来说&#xff0c;通过SOAR类平台可实现…

【爬虫软件】2024最新短视频评论区抓取工具

一、背景说明 1.0 采集目标 采集DOU音评论数据对引流截流和获客有很多好处。首先&#xff0c;通过分析DOU音评论数据&#xff0c;我们可以更好地了解用户对于产品或内容的喜好和需求&#xff0c;从而调整营销策略&#xff0c;吸引更多用户关注和点击。其次&#xff0c;评论数据…

Delft3D水动力-富营养化模型(水质模型)教程

原文链接&#xff1a;Delft3D水动力-富营养化模型&#xff08;水质模型&#xff09;教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247605459&idx5&sn105e94f09f0589172835ce8204519971&chksmfa821d34cdf59422b4f6c39b243373a23836d79841a1fcd19f9…

Java EE-Spring AOP 面向切面编程

Spring AOP https://www.cnblogs.com/joy99/p/10941543.html 超级详细版&#xff1a;Chapter 6. 使用Spring进行面向切面编程&#xff08;AOP&#xff09; AOP 原理 面向切面 ( Aspect Orient Programming ) 面向切面编程&#xff0c;是面向对象编程(OOP) 的一种补充。 在…

【海外app制作】海外短剧app系统搭建部署指南:多平台推广策略助力业务拓展,支付接口搭建部署。

海外短剧系统&#xff0c;顾名思义就是短剧系统海外版本。 教你三步完成一个海外短剧平台系统 首先我们看一下海外系统前端界面 首页就是我们展示剧的地方&#xff0c;可以根据地区不同&#xff0c;一键切换地区&#xff0c;比如中文切换为英文。那么界面语言就会变。可以设置…

字典推导式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用字典推导式可以快速生成一个字典&#xff0c;它的表现形式和列表推导式类似。例如&#xff0c;我们可以使用下面的代码生成一个包含4个随机数的字…

DBeaver怎么将编辑栏内容放大

1、窗口–》编辑器–》放大 2、ctrl 3、页面结果展示

PS系统教学01

在前面几节内容基本介绍了PS的基本作用&#xff0c;简单的对PS中的某些基础功能进行介绍应用。 接下来我们进行系统的分享。 本次分享内容 基础的视图操作 接下来我们是对于PS工作区域的每个图标工具进行详细的分享 抓手工具缩放工具 这个图标是将工具栏由一列变成两列 一…

期权开户要多久的时间?能当天开好交易吗?

今天期权懂带你了解期权开户要多久的时间&#xff1f;能当天开好交易吗&#xff1f;期权&#xff0c;作为一种金融衍生品&#xff0c;它赋予了持有人在未来某个时间内购买或出售特定资产的权利&#xff0c;近年来在全球范围内得到了广泛的关注和应用。 期权开户要多久的时间&am…

Python操作MySQL数据库的工具--sqlalchemy

文章目录 一、pymysql和sqlalchemy的区别二、sqlalchemy的详细使用1.安装库2.核心思想3.整体思路4.sqlalchemy需要连接数据库5.使用步骤1.手动提前创建数据库2.使用代码创建数据表3.用代码操作数据表3.1 增加数据3.2 查询数据3.3 删除数据3.4 修改数据 一、pymysql和sqlalchemy…

服务高峰期gc,导致服务不可用

随着应用程序的复杂性和负载的不断增加&#xff0c;对JVM进行调优&#xff0c;也是保障系统稳定性的一个重要方向。 需要注意&#xff0c;调优并非首选方案&#xff0c;一般来说解决性能问题还是要从应用程序本身入手&#xff08;业务日志&#xff0c;慢请求等&#xff09;&am…

Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明

Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明 目录 Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明 一、简单介绍 二、网格搜索 1、简单网格搜索 2、参数过拟合的风险与验证集 3、带交叉验证的网格搜索 附录 一、参考文献 一、简单…

【Web】2024 京麒CTF ezjvav题解

目录 step 0 step 1 step 2 EXP1 EXP2 step 0 进来是一个登录框 admin/admin成功登录 访问./source jwt伪造 带着伪造的jwt访问./source&#xff0c;拿到题目源码jar包 step 1 pom依赖有spring、fj、rome 反序列化入口在./Jsrc路由 有两层waf&#xff0c;一个是明…

深入了解python的关键字“break”与循环退出策略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、break关键字的基础理解与用途 二、通过案例理解break的应用 三、总结break在编程中的实…