IOC和注解

news2024/12/23 8:38:45

想要学好spring,必须时时刻刻想着,spring的本质就是一个容器,放java对象的容器,java对象在spring容器中也叫做bean对象。

文章目录

  • 一、spring介绍
    • 1、什么是框架
    • 2、框架的作用![在这里插入图片描述](https://img-blog.csdnimg.cn/a8c0157c48f14b46a36ebbc9a7674c6c.png)
    • 3、Spring是什么
    • 4、Spring的体系结构
    • 5、Spring的发展历史
    • 6、Spring优势
  • 二、IOC 反转控制
    • 1、概念
    • 2、理解
    • 3、入门案例
      • 3.1、导入 Spring 开发的基本包坐标
      • 3.2、编写 Dao 接口和实现类
      • 3.3、创建 Spring 核心配置文件
      • 3.4、在 Spring 配置文件中配置 UserDaoImpl
      • 5、使用 Spring 的 API 获得 Bean 实例
    • 4、Bean标签说明
    • 5、生命周期
      • 5.1、当scope的取值为singleton时(系统默认的)
      • 5.2、当scope的取值为prototype时
  • 三、DI 依赖注入
  • 四、注解开发
      • 4.1、扫描包下的组件(注解)
      • 4.2、添加注解

一、spring介绍

1、什么是框架

  • 源自于建筑学,隶属土木工程,后发展到软件工程领域

  • 软件工程框架:经过验证的,具有一定功能的,半成品软件

    • 经过验证

    • 具有一定功能

    • 半成品

在这里插入图片描述

2、框架的作用在这里插入图片描述

3、Spring是什么

Spring是分层的JavaSE/EE应用full-stack 轻量级 开源的 半成品框架,以 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

分层: 视图层,逻辑层,持久层在这里插入图片描述

4、Spring的体系结构

在这里插入图片描述
笔试: 事务应该具有4个属性:原子性、一致性、隔离性、持久性。

5、Spring的发展历史

在这里插入图片描述

6、Spring优势

  • 方便解耦,简化开发
  • 方便集成各种优秀框架
  • 方便程序的测试
  • 切面编程的支持
  • 声明式事务的支持@Transactional
  • 降低JavaEE API的使用难度

二、IOC 反转控制

1、概念

  • IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI( Dependency Injection),即依赖注入。本质的功能就是:就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系

2、理解

如何理解“控制反转”好呢?

找女朋友为例(对于程序猿来说这个值得探究的问题)。一般情况下我们是如何来找女朋友的呢?首先我们需要根据自己的需求(漂亮、身材好、性格好)找一个妹子,然后到处打听她的兴趣爱好、微信、电话号码,然后各种投其所好送其所要,最后追到手。如下:
在这里插入图片描述
这就是我们通常做事的方式,如果我们需要某个对象,一般都是采用这种自己直接创建的方式( new BeautifulGirl()),这个过程复杂而又繁琐,而且我们必须要面对每个环节,同时使用完成之后我们还要负责销毁它,在这种情况下我们的对象与它所依赖的对象耦合在一起。

其实我们需要思考一个问题?我们每次用到自己依赖的对象真的需要自己去创建吗?我们知道,我们依赖对象其实并不是依赖该对象本身,而是依赖它所提供的服务,只要在我们需要它的时候,它能够及时提供服务即可,至于它是我们主动去创建的还是别人送给我们的,其实并不是那么重要。再说了,相比于自己千辛万苦去创建它还要管理、善后而言,直接有人送过来是不是显得更加好呢?

这个给我们送东西的“人” 就是 IoC,在上面的例子中,它就相当于一个婚介公司,作为一个婚介公司它管理着很多男男女女的资料,当我们需要一个女朋友的时候,直接跟婚介公司提出我们的需求,婚介公司则会根据我们的需求提供一个妹子给我们,我们只需要负责谈恋爱,生猴子就行了。你看,这样是不是很简单明了。

诚然,作为婚介公司的 IoC 帮我们省略了找女朋友的繁杂过程,将原来的主动寻找变成了现在的被动接受(符合我们的要求),更加简洁轻便。你想啊,原来你还得鞍马前后,各种巴结,什么东西都需要自己去亲力亲为,现在好了,直接有人把现成的送过来,多么美妙的事情啊。所以,简单点说,IoC 的理念就是让别人为你服务

3、入门案例

  • 1 导入 Spring 开发的基本包坐标
  • 2 编写 Dao 接口和实现类
  • 3 创建 Spring 核心配置文件
  • 4 在 Spring 配置文件中配置 UserDaoImpl
  • 5 使用 Spring 的 API 获得 Bean 实例

3.1、导入 Spring 开发的基本包坐标

<!--导入spring的context坐标,context依赖core、beans、expression-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>

3.2、编写 Dao 接口和实现类

public interface IUserDao {
    void say();
}


public class UserDaompl implements IUserDao {
    public void say() {
        System.out.println("你好");
    }
}

3.3、创建 Spring 核心配置文件

3.4、在 Spring 配置文件中配置 UserDaoImpl

<?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-4.0.xsd">

    <bean id="user" class="com.xinzhi.service.impl.UserDaompl" />

</beans>

5、使用 Spring 的 API 获得 Bean 实例

public static void main( String[] args ) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserDaompl bean = context.getBean(UserDaompl.class);
        bean.say();
}

4、Bean标签说明

在这里插入图片描述

  • id:Bean实例在Spring容器中的唯一标识
  • class:Bean的全限定名称
  • scope: 范围配置,spring默认是单例模式。

5、生命周期

5.1、当scope的取值为singleton时(系统默认的)

  Bean的实例化个数:1个
  Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
  Bean的生命周期:
					对象创建:当应用加载,创建容器时,对象就被创建了
					对象运行:只要容器在,对象一直活着
					对象销毁:当应用卸载,销毁容器时,对象就被销毁了

5.2、当scope的取值为prototype时

  Bean的实例化个数:多个
  Bean的实例化时机:当调用getBean()方法时实例化Bean
				  对象创建:当使用对象时,创建新的对象实例
				  对象运行:只要对象在使用中,就一直活着
				  对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了 ( jvm gc垃圾回收)

注意: 以上bean对象实例化都是spring调用对象的无参构造方法。(还有两种方法,开发中没见使用过:工厂实例方法,工厂静态方法)

三、DI 依赖注入

两种方式 set注入 构造注入

想要理解依赖注入,需要将这个概念拆分两部分理解,依赖和注入。

依赖: 两个对象之间的关系,比如service想要调用dao的方法,那么service里就需要dao对象,这就是依赖。

注入:就是将dao给了service的过程,在spring的容器中,注入是容器给完成的。也就是小伙子的对象不是自己找的,谁给的? dao是谁给service的?

  • 故名思意,必须有set方法,注意注入的方式是set方式,但是主动执行的人是spring容器

  • 新建IUserService结合和UserServiceImpl

public interface IUserService {
    void save();
}

public class UserServiceImpl implements IUserService {
    private IUserDao userDao;

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    public void save() {
        userDao.say();
    }
}

 <bean id="user" class="com.xinzhi.dao.impl.UserDaompl" />
    
    <bean id="userService" class="com.xinzhi.service.impl.UserServiceImpl">
        <property name="userDao" ref="user"/>
	</bean>

 public static void main( String[] args ) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserServiceImpl bean = context.getBean(UserServiceImpl.class);
        bean.save();
 }

四、注解开发

  • spring的原始注解
    在这里插入图片描述
  • 开发步骤

4.1、扫描包下的组件(注解)

​ <context:component-scan base-package=“com.xinzhi”/>

4.2、添加注解

@Component("user")
public class User {
    @Value("1")
    private int id;
    @Value("张作榕")
    private String username;
    @Value("20")
    private int age;
    //set get 方法
}


/**
 *dao层注解
 */
@Repository("userDao")
public class UserDaompl implements IUserDao {

    @Autowired
    private User user;

    public void say() {
        System.out.println(user);
        System.out.println("UserDao save method running....");
    }
}


/**
 * service注解
 */
@Service("userService")
public class UserServiceImpl implements IUserService {
//    @Autowired
//    @Qualifier("userDao")
    @Resource(name = "userDao")
    private IUserDao userDao;

    public void save() {
        userDao.say();
    }
}

 public static void main( String[] args ) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserServiceImpl bean = context.getBean(UserServiceImpl.class);
        bean.save();
 }

结果:
在这里插入图片描述
注意: 一般用autowired注解,因为spring默认都是单例模式,所以也很少和Qualifier配合使用。Resource如果注入的对象不存在会抛出异常

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0014Java程序设计-springboot旅行景点推荐系统

摘要目 录概述1.1研究背景1.2 开发意义1.3 研究现状1.4 研究内容1.5 论文结构 系统实现开发环境 摘要 互联网的广泛运用给生活带来很多便捷。 因而&#xff0c;将旅游地介绍与现如今互联网紧密结合&#xff0c;利用Java技术搭建旅游地强烈推荐系统&#xff0c;完成旅游地强烈推…

港陆证券:电子竞技传来重磅消息!概念股上半年业绩普增

国际奥委会宣布建立电子竞技委员会。 据央视新闻报道&#xff0c;北京时间9月6日&#xff0c;国际奥委会在官网发布音讯&#xff0c;国际奥委会有史以来将初次展望电子竞技的未来&#xff0c;建立一个全新的电子竞技委员会。 国际奥委会主席巴赫表明&#xff0c;虚拟体育有着…

Geopy 笔记:计算距离

1 介绍 Geopy使用测地线距离或大圆距离来计算两点之间的地理距离&#xff0c;其中默认使用测地线距离&#xff08;geopy.distance.distance&#xff09; 大圆距离&#xff08;great_circle&#xff09;使用地球的球形模型&#xff0c;&#xff0c;半径为6371.0087714150598 公…

AJAX学习笔记9 搜索联想自动补全

AJAX学习笔记8 跨域问题及解决方案_biubiubiu0706的博客-CSDN博客 其实就一个功能 搜索联想 自动补全 键盘按下事件keydown 键盘弹起事件keyup 做模糊查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

海外ASO优化之如何优化游戏应用

如果我们发布了一款手机游戏或者管理了一款手机游戏&#xff0c;那么需要确保我们的手机游戏对合适的人可见&#xff0c;目的是增加应用的下载量。 1、优化游戏元数据的关键词。 Apple和Google在应用商店中为我们提供有限的空间&#xff0c;来描述手机游戏及其优势。我们需要使…

事件派发触发以及自定义事件派发dispatchEvent-——————派发键盘事件

事件派发触发以及自定义事件派发dispatchEvent 首先DOM的方法 addEventListener() 和 removeEventListener()是用来分配和删除事件的函数。 这两个方法都需要三个参数&#xff0c;分别为&#xff1a;事件名称&#xff08;String&#xff09;、要触发的事件处理函数(Function)、…

Run in PaddleX!四步搞定10+任务场景36个精选产业模型开发与部署!

随着ChatGPT引领的AI破圈&#xff0c;各行各业掀起了AI落地的潮流&#xff0c;从智能客服、智能写作、智能监控&#xff0c;到智能医疗、智能家居、智能金融、智能农业&#xff0c;谁能快速将AI与传统业务相结合&#xff0c;谁就将成为企业数字化和智能化变革的优胜者。然而&am…

10、Kubernetes核心技术 - Label标签

目录 一、概述 二、Label Selector&#xff08;标签选择器&#xff09; 1)、基于等值&#xff08;Equality-based&#xff09; 2)、基于集合&#xff08;Set-based&#xff09; 三、Label相关操作 (1)、yaml文件定义标签 (2)、查看标签 (3)、筛选标签 (4)、添加标签 …

Unity VideoPlayer 指定位置开始播放

如果 source是 videoclip&#xff08;以下两种方式都可以&#xff09;&#xff1a; _videoPlayer.Play();Debug.Log("time: " _videoPlayer.clip.length);_videoPlayer.time 10; [SerializeField] VideoPlayer videoPlayer;public void SetClipWithTime(VideoClip…

iTOP-i.MX6ULL开发板修改 samba 配置文件

sudo vi /etc/samba/smb.conf 添加如下内容&#xff1a; 这些信息都是 samba 的说明和设置&#xff0c;把这些复制上&#xff0c;格式要设置对&#xff0c;使用 Tab 键缩进&#xff0c;然后把注释删 除&#xff0c;不然可能会出错。 [ubuntu_samba] comment arm ubuntu sa…

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?

亲爱的小伙伴们&#xff0c;大家好呀&#xff01;我是小米&#xff0c;一个热衷于技术分享的90后程序员。今天我要和大家聊聊一个在面试中经常会被问到的话题&#xff1a;HashMap、LinkedHashMap、TreeMap的区别。这可是一个非常重要的知识点&#xff0c;不仅在面试中会被频繁提…

linux运维(二)内存占用分析

一、centos内存高&#xff0c;查看占用内存, top命令详解 1.1: free 命令是 free 单位K free -m 单位M free -h 单位Gfree最常规的查看内存占用情况的命令 1.2: 参数说明 total 总物理内存 used 已经使用的内存 free 没有使用的内存 shared 多进程共享内存 buff/cache 读写…

IP应用场景查询API:深入了解网络用户行为的利器

前言 随着数字时代的不断发展&#xff0c;互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上&#xff0c;了解和理解网络用户行为变得至关重要。为了满足这个需求&#xff0c;IP 应用场景查询 API 崭露头角&#xff0c;成为深入了解网络…

通讯软件017——分分钟学会Kepware OPC UA Server配置

本文介绍如何配置Kepware OPC UA Server&#xff0c;通过本文可以对OPC UA的基本概念有所了解&#xff0c;掌握OPC UA的本质。更多通信资源请登录网信智汇(wangxinzhihui.com)。 1. 创建OPC UA Server 点击“OPC UA Configuration”&#xff0c;弹出配置界面。 点击“添加”&a…

云计算时代的采集利器

大家好&#xff01;在今天的知识分享中&#xff0c;我们将探讨一个在云计算环境中的爬虫应用利器——独享IP。如果你是一名爬虫程序员&#xff0c;或者对数据采集和网络爬虫有浓厚的兴趣&#xff0c;那么这篇文章将向你展示独享IP在云计算环境下的应用价值。 1. 什么是独享IP&…

学生宿舍护眼台灯怎么样选择?适合宿舍使用的五款台灯

众所周知&#xff0c;咱们的学生是作为近视基数最大的群体&#xff0c;平时压力大导致用眼都很频繁&#xff0c;所以有些学生从小就带上了眼睛&#xff0c;大街上更是随处可见戴着近视眼镜的学生&#xff0c;这对于孩子未来的发展很不利&#xff0c;所以众多家长朋友们也都开始…

这可能是最全面的Python入门手册了!

无论是学习任何一门语言&#xff0c;基础知识一定要扎实&#xff0c;基础功非常的重要&#xff0c;找到一个合适的学习方法和资料会让你少走很多弯路&#xff0c; 你的进步速度也会快很多&#xff0c;无论我们学习的目的是什么&#xff0c;不得不说Python真的是一门值得付出时间…

Java8实战-总结22

Java8实战-总结22 使用流数值流原始类型流特化数值范围数值流应用&#xff1a;勾股数 使用流 数值流 可以使用reduce方法计算流中元素的总和。例如&#xff0c;可以像下面这样计算菜单的热量&#xff1a; int calories menu.stream().map(Dish::getcalories).reduce(0, Int…

LeetCode 刷题记录——从零开始记录自己一些不会的

1. 最多可以摧毁的敌人城堡数目 题意 思路 两层循环&#xff0c;太low了 用一个变量记录前一个位置 代码 class Solution { public:int captureForts(vector<int>& forts) {int ans 0, pre -1;for (int i 0; i < forts.size(); i) {if (forts[i] 1 || forts…

如何解决ArcGIS中数据显示乱码问题?

你是否遇到过在ArcGIS中打开文件的时候&#xff0c;却显示乱码的问题呢&#xff1f; 其根本原因是字符编码造成的&#xff0c;这里就来分享一下如何解决在ArcGIS中导入数据后显示乱码的方法。 数据显示乱码 我们这里以一份“移动基站”数据为例&#xff0c;将它直接拖放到Arc…